Professional Documents
Culture Documents
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
Introduction
1-1
Partie I
Programmation Delphi
Chapitre 2
2-1
2-1 2-2 2-3 2-3 2-4 2-5 2-5 2-6
Chapitre 3
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
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
. 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
Chapitre 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-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
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
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) . . .
Chapitre 9
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
. . 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
Chapitre 10
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
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
Chapitre 12
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-17
Partie II
Chapitre 13
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
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
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
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
. . . 17-9 . . . 17-9 . . 17-10 . . .17-11 . . 17-13 . . 17-13 . . . . . . . . 17-14 17-14 17-15 17-15
Chapitre 18
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 . . . . . . . . . . . . . . . . .
Chapitre 19
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
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
Chapitre 22
Chapitre 21
21-1
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
Chapitre 23
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
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
Chapitre 25
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
27-1
Chapitre 26
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
28-1
. . . . . . . . 28-1 28-2 28-3 28-3 28-4 28-5 28-5 28-6
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 . . . . . . . . .
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 . . . . . . . .
Chapitre 30
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
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
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-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
34-1
Partie IV
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
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
36-1
. . . . . . 36-1 36-2 36-2 36-4 36-5 36-6
Chapitre 35
35-1
. . 35-2 . . 35-3 . . 35-4
. . 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
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 . . . . . . . . .
Chapitre 39
39-1
. . . . . . 39-2 39-3 39-4 39-4 39-4 39-5
Chapitre 38
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
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 . . . . . .
. . . . . .
. . . . . .
. . . . . .
Chapitre 41
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
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 . . . . . . . .
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
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 . . . . . . . . .
Modification du comportement suite un double-clic . . . . . . . . . . . . . . Ajout de formats de Presse-papiers. . . . Recensement dun diteur de composants Compilation des composants en paquets . .
Chapitre 48
48-1
. . . . 48-1 . . . . 48-2 . . . . 48-2 . . . . 48-3
Chapitre 47
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
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
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 . . . . . . .
. . . . . . . . .
Chapitre 51
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 . .
Chapitre 52
52-1
. . . . . . . 52-2 52-2 52-3 52-3 52-3 52-4 52-6
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
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.
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.
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.
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.
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
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.
3-1
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.
3-2
Guide du dveloppeur
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
3-3
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.
3-4
Guide du dveloppeur
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.
3-5
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.
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
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}
3-7
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.
3-8
Guide du dveloppeur
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;
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;
3-9
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.
3-10
Guide du dveloppeur
Pour davantage dinformations sur la visibilit, voir le Guide du langage Pascal Objet.
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;
3-11
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
3-12
Guide du dveloppeur
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.
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.
3-13
Figure 3.3
Plusieurs importantes classes de base montres dans la figure sont dcrites dans le tableau suivant :
Tableau 3.1 Classe
TObject
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
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.
3-15
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
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.
3-17
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
3-18
Guide du dveloppeur
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.
3-19
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.
3-20
Guide du dveloppeur
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
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).
3-21
3-22
Guide du dveloppeur
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.
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.
3-23
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.
3-24
Guide du dveloppeur
3-25
3-26
Guide du dveloppeur
3-27
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.
1 Slectionnez un composant.
3-28
Guide du dveloppeur
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.
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.
3-29
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.
3-30
Guide du dveloppeur
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.
3-31
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
3-32
Guide du dveloppeur
Tableau 3.3
DataSnap
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
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
3-33
Tableau 3.3
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.
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
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
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.
3-35
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.
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
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.
3-37
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.
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
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.
3-39
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
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.
3-41
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
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).
3-43
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.
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
3-44
Guide du dveloppeur
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
3-45
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
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
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.
3-47
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.
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
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.
3-49
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.
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
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.
3-51
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.
3-52
Guide du dveloppeur
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.
3-53
3-54
Guide du dveloppeur
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;
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.
3-55
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
est quivalent
StringList1[0] := Premire chane.;
3-57
Pour ajouter une liste les chanes dune liste, appelez AddStrings :
StringList1.AddStrings(StringList2); { ajoute StringList1 les chanes de StringList2 }
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
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.
3-59
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
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.
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.
3-61
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.
3-62
Guide du dveloppeur
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.
3-63
3-64
Guide du dveloppeur
Chapitre
Chapitre 4
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
4-1
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
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
4-3
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);
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
4-5
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.
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
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.
4-7
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
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.
4-8
Guide du dveloppeur
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.
4-9
Porte des gestionnaires dexceptions Spcification du gestionnaire dexception par dfaut Gestion des classes dexceptions Redclenchement de lexception
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
Transtypage Conversion
Matrielle
Condition du systme
Variant
Pour avoir la liste des types dexception RTL, voir le code de lunit SysUtils.
4-10
Guide du dveloppeur
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.
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;
4-11
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.
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
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.
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
4-13
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.
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
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.
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
4-15
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.
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
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;
4-17
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.
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
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);
Comme les classes abstraites, les interfaces ne sont jamais instancies ellesmmes. Pour utiliser une interface, vous devez lobtenir en limplmentant dans une classe.
4-19
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.
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
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.
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.
4-21
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
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
4-23
nouveau GUID dans votre code source, vous pouvez utiliser le raccourci Ctrl+Maj+G de lditeur de code.
4-24
Guide du dveloppeur
{ 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
4-25
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.
4-26
Guide du dveloppeur
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.
Vous devez quand mme implmenter normalement QueryInterface afin de permettre linterrogation dynamique de votre objet.
4-27
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.
4-28
Guide du dveloppeur
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).
1 Etablissez une correspondance entre le stockage des donnes du variant et lenregistrement TVarData.
4-29
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.
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
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.
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
4-31
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
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).
4-33
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
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.
4-35
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.
4-36
Guide du dveloppeur
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.
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.
4-37
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;
4-38
Guide du dveloppeur
Remarquez comment ces mthodes crent un objet lecteur ou crivain pour que le paramtre Stream gre les dtails de lecture et dcriture des valeurs.
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);
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.
4-39
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.
4-40
Guide du dveloppeur
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;
4-41
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.
4-42
Guide du dveloppeur
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
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.
4-43
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
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.
4-45
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.
4-46
Guide du dveloppeur
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.
4-47
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
Gestion MBCS
Oui Oui Oui Oui Non Non
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
Gestion MBCS
Oui Oui Oui Oui Oui Oui Oui
Gestion MBCS
Oui Oui Oui Oui Oui Non
4-49
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
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;
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
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;
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);
4-51
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;
4-52
Guide du dveloppeur
Cet exemple renvoie un pointeur sur une donne chane qui est libre lachvement de la fonction title.
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
4-53
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;
{$P+/-}
{$V+/-}
var S: string[3]; procedure Test(var T: string); begin T := 1234; end; begin Test(S); end.
4-54
Guide du dveloppeur
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
4-55
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.
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.
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
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
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
4-57
Variables denvironnement, quand vous avez choisi Outils|Options denvironnement) pour les reprsenter.
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.
4-58
Guide du dveloppeur
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.
Type de fichier
Types de fichier Pascal
Handles de fichier
Flux fichier
4-59
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
4-60
Guide du dveloppeur
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
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
Les constantes douverture et de partage de fichier sont dfinies dans lunit SysUtils.
4-61
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.
4-62
Guide du dveloppeur
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;
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.
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.
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.
4-64
Guide du dveloppeur
Conversion de mesures
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.
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.
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.
4-66
Guide du dveloppeur
Conversion de mesures
Les units de mesure prsentes ici forment un sous-ensemble des units de temprature rellement recenses dans lunit StdConvs.
4-67
Conversion de mesures
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.
4-69
Conversion de mesures
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;
4-70
Guide du dveloppeur
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.
4-71
4-72
Guide du dveloppeur
Chapitre
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.
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.
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.
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.
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
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;
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);
5-7
Cration dapplications
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 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.
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.
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.
5-9
Directive de compilation
{$LIBPREFIX chane}
{$LIBSUFFIX chane}
{$LIBVERSION chane}
Pour davantage dinformations sur les paquets, voir chapitre 11, Utilisation des paquets et des composants.
5-10
Guide du dveloppeur
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.
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
ADO
dbExpress
InterBase
5-11
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.
5-12
Guide du dveloppeur
Vous pouvez crer diffrents types dapplications serveur Web en utilisant les technologies Delphi suivantes : Agent Web WebSnap InternetExpress Services Web
5-13
Tableau 5.3
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.
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
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.
5-15
Pour fournir dautres fonctionnalits votre composant, il suffit dajouter une autre interface pour ces fonctionnalits.
5-16
Guide du dveloppeur
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.
5-17
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
El ment de menu
Position
Pour davantage dinformations sur les modules de donnes, voir laide en ligne.
5-18
Guide du dveloppeur
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 :
5-19
5-20
Guide du dveloppeur
Les procdures et fonctions que vous crivez doivent suivre la section implmentation du code du module.
1 Choisissez Fichier|Nouveau|Autre.
5-21
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.
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
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.
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.
5-23
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.
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.
5-24
Guide du dveloppeur
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.
5-25
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
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.
5-27
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.
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
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.
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
5-29
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
daide ne supporte quun seul HelpSelector ; lorsque de nouveaux slectionneurs sont recenss, tout slectionneur existant pralablement est dconnect.
5-31
HelpCommand
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.
5-32
Guide du dveloppeur
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.
5-34
Guide du dveloppeur
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.
5-35
5-36
Guide du dveloppeur
Chapitre
Chapitre 6
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.
6-1
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
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
6-3
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
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.
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,
6-5
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.
6-6
Guide du dveloppeur
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.
Dans ce cas, comme la fiche est dj en mmoire, il nest pas ncessaire de crer une autre instance ou de dtruire cette instance.
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.
6-7
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.
6-8
Guide du dveloppeur
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.
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);
6-9
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;
6-10
Guide du dveloppeur
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.
6-11
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
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).
6-13
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
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.
6-15
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.
6-16
Guide du dveloppeur
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.
6-17
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.
6-18
Guide du dveloppeur
Le tableau suivant dfinit la terminologie qui sapplique la dfinition des menus et des barres doutils :
Tableau 6.1 Terme
Action
Bande daction
Catgories dactions
Classes dactions
Client action
Cible
Barre doutils
Si vous dveloppez pour plusieurs plates-formes, reportez-vous Utilisation des listes dactions la page 6-26.
6-19
6-20
Guide du dveloppeur
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.
6-21
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
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.
1 A partir de la page Win32 de la palette de composants, placez sur la fiche un composant liste dimages.
6-23
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.
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
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
6-25
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
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.
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.
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
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.
6-27
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
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.
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.
6-29
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.
Formatage
Aide
Fentre
6-30
Guide du dveloppeur
Tab
Liste Dialogue
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.
6-31
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
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.
6-33
Figure 6.4
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
Figure 6.6
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).
6-35
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)
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.
6-36
Guide du dveloppeur
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 :
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.
6-37
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
Figure 6.7
Elment de menu de la barre de menu Elment de menu dune liste de menus Elment de menu imbriqu
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.
6-39
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.
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
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.
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.
6-41
Commande de menu
1 Cliquez avec le bouton droit de la souris dans le concepteur de menus et choisissez Slectionnez un menu.
6-42
Guide du dveloppeur
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].
1 Cliquez avec le bouton droit de la souris dans le concepteur de menus et choisissez Insrer depuis un modle.
6-43
(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.
6-44
Guide du dveloppeur
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.
6-45
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.
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.
6-46
Guide du dveloppeur
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.
3 Dans la bote de dialogue, slectionnez le fichier ressource charger, puis choisissez OK.
6-47
Si votre ficher ressource contient plusieurs menus, vous devez enregistrer chacun de ses menus dans un fichier ressource spar avant de pouvoir importer.
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
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
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
6-49
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.
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.
6-50
Guide du dveloppeur
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
6-51
les contrles passent la ligne et commencent une nouvelle ligne quand ils ne tiennent pas horizontalement sur une seule ligne de la barre doutils.
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.
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
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
6-53
(comme les libells ou les turboboutons), mais ils napparaissent pas dans des bandes distinctes.
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 .
6-54
Guide du dveloppeur
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.
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.
6-55
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
Les contrles sont des composants visuels avec lesquels lutilisateur peut interagir lexcution. Ce chapitre dcrit un ensemble de fonctionnalits communes de nombreux contrles.
7-1
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;
7-2
Guide du dveloppeur
7-3
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.
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
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.
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.
7-5
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
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.
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.
7-7
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
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.
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.
7-9
Le tableau suivant dresse la liste des proprits frquemment utilises pour la manipulation du texte slectionn.
Tableau 7.1 Proprit
SelText SelLength SelStart
7-10
Guide du dveloppeur
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.
7-11
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.
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
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;
1 Spcification du style dessin par le propritaire 2 Ajout dobjets graphiques une liste de chanes 3 Dessiner des lments dessins par le propritaire
7-13
Exemples
lbOwnerDrawFixed, csOwnerDrawFixed lbOwnerDrawVariable, csOwnerDrawVariable
7-14
Guide du dveloppeur
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.
7-15
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.
2 Dessinez llment.
7-16
Guide du dveloppeur
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.
7-17
7-18
Guide du dveloppeur
Chapitre
Chapitre 8
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.
8-1
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
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.
Bitmap
Clipboard
8-3
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
8-4
Guide du dveloppeur
FloodFill (VCL seulement) FrameRect LineTo MoveTo Pie Polygon Polyline Rectangle
RoundRect StretchDraw
Pour davantage dinformations sur ces mthodes, voir Utilisation des mthodes du canevas pour dessiner des objets graphiques la page 8-10.
8-5
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.
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
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;
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;
8-7
Lorsquune ligne est dessine avec la mthode LineTo, la position en cours est dplace sur le point darrive de la ligne.
8-8
Guide du dveloppeur
8-9
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.
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.
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
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
8-11
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 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;
8-12
Guide du dveloppeur
Changer doutil de dessin en utilisant des turboboutons Utiliser des outils de dessin
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.
8-13
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;
8-14
Guide du dveloppeur
Cette section explique comment : dessiner des formes partager du code entre les gestionnaires dvnements
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);
8-15
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.
8-16
Guide du dveloppeur
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;
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
8-17
possibilit de traiter son message. En revanche, si vous dessinez directement sur la proprit Canvas dun contrle, lobjet image apparat immdiatement.
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.
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
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.
8-19
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;
8-20
Guide du dveloppeur
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.
8-21
Figure 8.1
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.
8-22
Guide du dveloppeur
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
8-23
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.
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
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
8-25
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.
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
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.
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.
8-27
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
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.
Cette modification permet de redessiner la ligne finale. Mais quen est-il des dessins intermdiaires ?
8-29
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
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
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.
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;
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
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
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
Cassettes audionumriques fichiers AVI, MPG, MOV films MM Vido analogique N/d pour Play (scanne des images avec Record)
8-34
Guide du dveloppeur
Utilisation du multimdia
Logiciel/matriel utilis
Squenceur MIDI pour Windows Enregistreur de cassettes vido Lecteur audio Wav pour Windows
Joue
fichiers MIDI Cassettes vido fichiers WAV
dtWaveAudio
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;
8-35
8-36
Guide du dveloppeur
Chapitre
Chapitre 9
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.
9-1
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
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.
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
9-3
9-4
Guide du dveloppeur
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.
9-5
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.
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;
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.
9-7
Coordination de threads
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.
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
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.
9-9
Coordination de threads
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.
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
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.
9-11
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.
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.
9-12
Guide du dveloppeur
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.
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.
10-1
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
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
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
10-3
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.
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;
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
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.
10-5
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
DataCLX
10-6
Guide du dveloppeur
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.
10-7
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.
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
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
10-9
incluent le code source, reportez-vous au code que vous trouverez dans le rpertoire ..\Delphi6\Source\VCL\CLX.
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
Tableau 10.3
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.
10-11
10-12
Guide du dveloppeur
Les units suivantes existent dans CLX mais pas dans la VCL :
Tableau 10.5 Unit
DirSel QStyle
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
10-13
10-14
Guide du dveloppeur
10-15
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.
Confirmation de commande
10-16
Guide du dveloppeur
Fichiers de configuration
Utilitaire Make
10-17
Noms de chemins
Chemin de recherche
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
10-18
Guide du dveloppeur
/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.
10-19
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;
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.
10-20
Guide du dveloppeur
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}
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.
10-21
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
10-22
Guide du dveloppeur
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.
utilisez
MOV EAX,[EBX].GlobalVar
10-23
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.
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
10-24
Guide du dveloppeur
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.
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.
10-25
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.
10-26
Guide du dveloppeur
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.
10-27
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
10-29
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
Si lensemble de donnes dorigine est un composant TQuery, TADOQuery ou TIBQuery, initialisez la proprit SQL du nouveau composant TSQLQuery avec la proprit SQL de lensemble de donnes dorigine. Initialisez la proprit Params du nouveau TSQLQuery conformment la valeur de la proprit Params ou Parameters de lensemble de donnes dorigine. Si vous avez initialis la proprit DataSource pour tablir un lien matredtail, copiez-la galement. Si lensemble de donnes dorigine tait un composant TStoredProc, TADOStoredProc ou TIBStoredProc, initialisez la proprit StoredProcName du nouveau composant TSQLStoredProc avec la proprit StoredProcName ou ProcedureName de lensemble de donnes dorigine. Initialisez la proprit Params du nouveau composant TSQLStoredProc conformment la valeur de la proprit Params ou Parameters de lensemble de donnes dorigine.
6 Pour tout composant de connexion de base de donnes dans lapplication dorigine (TDatabase, TIBDatabase ou TADOConnection), ajoutez un composant TSQLConnection au nouveau module de donnes. Vous devez galement ajouter un composant TSQLConnection pour chaque serveur de base de donnes auquel vous vous connectiez sans composant de connexion (par exemple, en utilisant la proprit ConnectionString sur un ensemble de donnes ADO ou en initialisant la proprit DatabaseName de lensemble de donnes BDE avec un alias BDE). 7 Pour chaque ensemble de donnes dbExpress positionn ltape 4, initialisez sa proprit SQLConnection avec le composant TSQLConnection correspondant la connexion de base de donnes approprie. 8 Sur chaque composant TSQLConnection, spcifiez les informations ncessaires ltablissement dune connexion de base de donnes. Pour cela, double-cliquez sur le composant TSQLConnection pour afficher lditeur de connexion et affectez les valeurs correspondant aux paramtres appropris. Si vous avez d transfrer des donnes vers un nouveau serveur de base de donnes ltape 1, spcifiez les paramtres appropris pour ce nouveau serveur. Si vous utilisez le mme serveur quauparavant, vous pouvez obtenir certaines de ces informations sur le composant de connexion dorigine :
Si lapplication dorigine utilisait TDatabase, vous devez transfrer les informations qui apparaissent dans les proprits Params et TransIsolation. Si lapplication dorigine utilisait TADOConnection, vous devez transfrer les informations qui apparaissent dans les proprits ConnectionString et IsolationLevel. Si lapplication dorigine utilisait TIBDatabase, vous devez transfrer les informations qui apparaissent dans les proprits DatabaseName et Params. Sil ny avait pas de composant de connexion dorigine, vous devez transfrer les informations associes lalias BDE ou qui apparaissaient dans la proprit ConnectionString de lensemble de donnes. Vous pouvez enregistrer cet ensemble de paramtres sous un nouveau nom de connexion. Pour plus de dtails sur cette procdure, reportez-vous Contrles des connexions la page 17-3.
10-31
Vous pouvez ajuster votre interface utilisateur pour traiter les mises jour en mmoire cache. Cette approche possde certains avantages, comme la rduction du trafic rseau et de la dure des transactions. Toutefois, si vous adoptez lenregistrement des mises jour en mmoire cache, vous devrez dcider du moment o ces mises jour devront tre r-appliques au serveur de base de donnes, et apporter probablement des modifications linterface utilisateur pour laisser les utilisateurs spcifier lapplication des mises jour ou leur indiquer si leurs modifications ont t crites dans la base de donnes. En outre, comme les erreurs de mise jour ne sont pas dtectes quand lutilisateur transmet un enregistrement, vous devrez changer la manire dont vous signalez de telles erreurs lutilisateur, afin quil puisse voir quelle mise jour a caus un problme, ainsi que le type de problme. Si votre application dorigine utilisait la prise en charge fournie par le BDE ou ADO pour conserver les mises jour en mmoire cache, vous aurez besoin dapporter des modifications votre code pour passer lutilisation dun ensemble de donnes client. Le tableau ci-dessous prsente les proprits, les vnements et les mthodes qui prennent en charge les mises jour en mmoire cache sur les ensembles de donnes BDE et ADO, ainsi que les proprits, mthodes et vnements correspondants sur TClientDataSet.
10-32
Guide du dveloppeur
Proprits, mthodes et vnements pour les mises jour en mmoire cache Sur les ensembles de donn es ADO
LockType
Sur TClientDataSet
Non obligatoires, les ensembles de donnes client conservent toujours les mises jour en mmoire cache. Non pris en charge ChangeCount
Objectif
Dtermine si les mises jour en m moire cache sont effectives.
CursorType
Indique quel point lensemble de donnes est isol des modifications sur le serveur. Indique si la mmoire cache locale contient des enregistrements mis jour qui doivent tre transmis la base de donnes. Indique le type denregistrements mis jour rendre visibles lors de la transmission de mises jour en mmoire cache. Indique si un enregistrement est inchang, modifi, insr ou supprim. Evnement pour traiter les erreurs de mise jour enregistrement par enregistrement. Transmet les enregistrement de la mmoire cache locale la base de donnes.
UpdateRecordTypes
FilterGroup
StatusFilter
UpdateStatus
RecordStatus
UpdateStatus
OnUpdateError
OnReconcileError
UpdateBatch
ApplyUpdates
CancelUpdates
Efface les mises jour en cours dans la mmoire cache sans les transmettre. Rinitialise la mmoire cache de mise jour aprs la transmission russie des mises jour. Copie des enregistrements de bases de donnes dans la m moire cache locale des fins de modification et de mise jour. Annule les mises jour de lenregistrement en cours si elles ne sont pas encore effectues.
CommitUpdates
Reconcile
FetchAll
RevertRecord
CancelBatch
RevertRecord
10-33
10-34
Guide du dveloppeur
11
Chapitre 11
Chapitre
Un paquet est une bibliothque lie dynamiquement spciale, utilise par les applications Delphi, lEDI ou les deux. Les paquets dexcution fournissent des fonctionnalits lorsquun utilisateur excute une application. Les paquets de conception sont utiliss pour installer des composants dans lEDI et pour crer des diteurs de proprits particuliers pour des composants personnaliss. Un mme paquet peut fonctionner la fois en conception et en excution, les paquets de conception faisant souvent appel des paquets dexcution. Pour les distinguer des autres DLL, les paquets sont stocks dans des fichiers dont lextension est .bpl (Borland Package Library). Comme les autres bibliothques dexcution, les paquets contiennent du code pouvant tre partag par plusieurs applications. Par exemple, les composants Delphi les plus couramment utiliss se trouvent dans un paquet appel vcl. Chaque fois que vous crez une application, vous pouvez spcifier quelle utilise vcl. Lorsque vous compilez une application cre de cette manire, limage excutable de lapplication ne contient que son propre code et ses propres donnes, le code commun tant dans le paquet dexcution appel vcl60.bpl. Un ordinateur sur lequel sont installes plusieurs applications utilisant des paquets na besoin que dune seule copie de vcl60.bpl, qui est partag par toutes les applications et par lEDI de Delphi mme. Delphi est livr avec plusieurs paquets dexcution prcompils, qui encapsulent les composants VCL et CLX. Delphi utilise galement des paquets de conception pour faciliter la manipulation des composants dans lEDI. Vous pouvez construire des applications avec ou sans paquets. Mais, si vous voulez ajouter lEDI des composants personnaliss, vous devez les installer en tant que paquets de conception.
11-1
Vous pouvez crer vos propres paquets dexcution afin de les partager entre plusieurs applications. Si vous crivez des composants Delphi, compilez-les dans des paquets de conception avant de les installer.
dcu bpl
Vous pouvez inclure VCL ou CLX, ou les deux types de composants dans un paquet. Les paquets destins tre multiplates-formes ne doivent inclure que des composants CLX.
Remarque
Les paquets partagent leurs donnes globales avec les autres modules dune application.
11-2
Guide du dveloppeur
Paquets dexcution
Pour plus dinformations sur les paquets et les DLL, voir le Guide du langage Pascal Objet.
Paquets dexcution
Les paquets dexcution sont dploys avec les applications Delphi. Ils fournissent des fonctionnalits lorsquun utilisateur excute une application. Pour excuter une application utilisant des paquets, le fichier excutable de lapplication et tous les fichiers paquet (fichiers .bpl) quelle utilise doivent se trouver sur lordinateur. Les fichiers .bpl doivent tre dans le chemin du systme pour quune application puisse les utiliser. Quand vous dployez une application, vrifiez que les utilisateurs possdent la version correcte de chaque bpl ncessaire.
1 Chargez ou crez un projet dans lEDI. 2 Choisissez Projet|Options. 3 Choisissez la page Paquets. 4 Cochez la case Construire avec les paquets dexcution et saisissez un ou plusieurs noms de paquets dans la bote de saisie place en dessous. Les paquets dexcution associs avec les paquets de conception dj installs apparaissent dj dans la bote de saisie. 5 Pour ajouter un paquet une liste existante, cliquez sur le bouton Ajouter puis entrez le nom du nouveau paquet dans la bote de dialogue Ajout de paquet dexcution. Pour parcourir la liste des paquets disponibles, cliquez sur le bouton Ajouter puis sur le bouton Parcourir plac ct de la bote de saisie Nom de paquet dans la bote de dialogue Ajout de paquet dexcution.
Si vous modifiez la bote de saisie Chemin de recherche dans la bote de dialogue Ajout de paquet dexcution, le chemin daccs global la bibliothque Delphi est modifi. Il nest pas ncessaire dinclure lextension dans le nom de paquet (ni le nombre reprsentant la version de Delphi) ; autrement dit, vcl60.bpl scrit vcl. Si vous tapez les noms directement dans la bote de saisie Paquets dexcution, sparez-les par des points-virgules. Par exemple :
rtl;vcl;vcldb;vclado;vclx;Vclbde;
Les paquets numrs dans la bote de saisie Paquets dexcution sont automatiquement lis lapplication lors de sa compilation. Les paquets en double sont ignors et si la bote de saisie est vide, lapplication est compile sans paquet.
11-3
Paquets dexcution
Les paquets dexcution sont slectionns uniquement pour le projet en cours. Pour que les choix en cours deviennent des choix par dfaut pour les futurs projets, cochez la case D faut, en bas de la bote de dialogue.
Remarque
Lorsque vous crez une application avec des paquets, vous devez inclure les noms originels des units Delphi dans la clause uses des fichiers source. Par exemple, le fichier source de la fiche principale pourrait commencer ainsi :
unit MainForm; interface Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
Les units rfrences dans cet exemple sont contenues dans les paquets vcl et rtl. Namoins, vous devez conserver ces rfrences dans la clause uses, mme si vous utilisez vcl et rtl dans votre application, ou vous aurez des erreurs de compilation. Dans les fichiers source gnrs, Delphi ajoute automatiquement ces units la clause uses.
Pour dcharger un paquet dynamiquement, appelez UnloadPackage. Soyez prudent en dtruisant toute instance de classe dfinie dans le paquet et en drecensant les classes prcdemment recenses.
11-4
Guide du dveloppeur
Paquets de conception
paquets, choisissez Projet|Options, slectionnez la page Paquets et entrez la liste suivante dans la bote de saisie Paquets dexcution.
rtl;vcl;Vcldb;vclx;
Il nest, en fait, pas ncessaire de prciser vcl et rtl, car elles sont rfrences dans la clause Requires de vcldb (voir Clause Requires la page 11-10). Votre application se compilera de la mme faon que vcl et rtl figurent ou non dans la liste des paquets dexcution.
Paquets personnaliss
Un paquet personnalis est soit une bpl que vous programmez et compilez vousmme, soit un paquet prcompil dvelopp par un fournisseur tiers. Pour utiliser dans une application un paquet dexcution personnalis, choisissez Projet|Options et ajoutez le nom du paquet la bote de saisie Paquets dexcution de la page Paquets. Par exemple, si vous avez cr un paquet effectuant des statistiques, nomm stats.bpl, la bote de saisie Paquets dexcution doit avoir la forme :
rtl;vcl;vcldb;stats
Si vous crez vos propres paquets, vous pouvez les ajouter selon vos besoins la liste.
Paquets de conception
Des paquets de conception sont utiliss pour installer des composants dans la palette des composants de lIDE ou pour crer les diteurs de proprits spciaux de composants personnaliss. Delphi est livr avec de nombreux paquets de conception dj installs dans lEDI. Ils dpendent de la version de Delphi que vous utilisez et de la personnalisation laquelle vous avez pu la soumettre. Vous pouvez voir la liste des paquets installs sur votre systme en choisissant la commande Composant| Installer des paquets. Les paquets de conception fonctionnent en appelant des paquets dexcution rfrencs dans leur clause Requires. Voir Clause Requires la page 11-10. Par exemple, dclstd rfrence vcl. Dclstd contient lui-mme des fonctionnalits supplmentaires qui rendent la plupart des composants standard disponibles dans la palette des composants. Outre les paquets pr-installs, vous pouvez installer dans lEDI vos propres paquets de composants ou ceux dvelopps par des tiers. Le paquet de conception dclusr est fourni en guise de conteneur par dfaut des nouveaux composants.
11-5
Paquets de conception
1 Si vous installez un nouveau paquet, copiez ou dplacez les fichiers paquet dans un rpertoire local. Si le paquet est livr avec des fichiers .bpl, .dcp et .dcu,vous devez tous les copier. Pour davantage dinformations sur ces fichiers, voir Fichiers paquets crs lors dune compilation russie la page 11-13.
Le rpertoire dans lequel sont stocks le fichier .dcp et les fichiers .dcu, sils font partie de la distribution, doit tre dans le chemin de la bibliothque Delphi. Si le paquet est distribu sous forme dun fichier .dpc (collection de paquets), seul cet unique fichier doit tre copi ; le fichier .dpc contient les autres fichiers. Pour plus dinformations sur les fichiers de collection de paquets, voir Fichiers de collection de paquets la page 11-14.)
2 Choisissez Composant|Installer des paquets dans le menu de lEDI ou choisissez Projet|Options et cliquez sur longlet Paquets. 3 Une liste des paquets disponibles apparat sous Paquets de conception.
Pour installer un paquet dans lEDI, cochez la case cocher place ct du nom de paquet. Pour dsinstaller un paquet, dslectionnez la case cocher. Pour voir une liste des composants inclus dans un paquet install, slectionnez le paquet et cliquez sur Composants. Pour ajouter un paquet la liste, cliquez sur le bouton Ajouter puis recherchez dans la bote de dialogue douverture de paquet le rpertoire dans lequel se trouve le fichier .bpl ou .dpc (voir ltape 1). Slectionnez le fichier .bpl ou .dpc et cliquez sur Ouvrir. Si vous slectionnez un fichier .dpc, une nouvelle bote de dialogue apparat pour la gestion de lextraction du fichier .bpl et dautres fichiers de la collection de paquets. Pour retirer un paquet de la liste, slectionnez le paquet, puis cliquez sur Supprimer.
11-6
Guide du dveloppeur
Sauf si vous changez les options par dfaut, les nouveaux projets sont crs avec tous les paquets disponibles installs. Si vous voulez que vos choix dinstallation deviennent les options par dfaut pour les nouveaux projets, cochez Dfaut, en bas de la page Paquets de la bote de dialogue Options du projet. Pour supprimer des composants de la palette des composants sans dsinstaller de paquet, slectionnez Composant|Configurer la palette, ou bien Outils| Options denvironnement et cliquez sur longlet Palette. La page Palette contient la liste de tous les composants installs avec le nom de la page o chacun apparat. Slectionnez le composant supprimer de la palette et cliquez sur Cacher.
Nutilisez pas de IFDEF dans un fichier de paquet (.dpk) comme dans le dveloppement multiplate-forme. Mais, vous pouvez les utiliser dans le code source.
1 Choisissez Fichier|Nouveau, slectionnez licne Paquet et choisissez OK. 2 Le paquet gnr est affich dans lditeur de paquet. 3 Lditeur de paquet affiche pour le nouveau paquet un nud Requires et un nud Contains. 4 Pour ajouter une unit la clause contains, cliquez sur le turbobouton Ajouter au paquet. Dans la page Ajouter unit, tapez un nom de fichier .pas dans la bote de saisie Nom de fichier unit, ou cliquez sur Parcourir... pour
11-7
rechercher le fichier, puis cliquez sur OK. Lunit slectionne apparat sous le nud Contains de lditeur de paquet. Vous pouvez ajouter des units supplmentaires en rptant cette tape.
5 Pour ajouter un paquet la clause requires, cliquez sur le turbobouton Ajouter au paquet. Dans la page Ncessite, tapez un nom de fichier .dcp dans la bote de saisie Nom de paquet, ou cliquez sur Parcourir... pour rechercher le fichier, puis cliquez sur OK. Le paquet slectionn apparat sous le nud Requires dans lditeur de paquet. Vous pouvez ajouter des paquets supplmentaires en rptant cette tape. 6 Cliquez sur le turbobouton Options, et slectionnez le type de paquet gnrer.
Pour crer un paquet de conception uniquement (un paquet ne pouvant sutiliser lexcution), slectionnez le bouton radio Seulement en conception. (Ou ajoutez la directive de compilation {$DESIGNONLY} au fichier dpk.) Pour crer un paquet dexcution uniquement (un paquet ne pouvant tre install), slectionnez le bouton radio dexcution seule. (Ou ajoutez la directive de compilation {$RUNONLY} au fichier dpk.) Pour crer un paquet utilisable lexcution et la conception, slectionnez les deux boutons radio Conception et Excution.
7 Dans lditeur de paquet, cliquez sur le turbobouton Compiler le paquet pour compiler votre paquet.
11-8
Guide du dveloppeur
1 Ouvrez les paquets dans lditeur de paquets. 2 Cliquez avec le bouton droit de la souris dans lditeur de paquets et slectionnez Voir le source.
Len-tte package spcifie le nom du paquet. La clause requires numre dautres paquets externes utiliss par le paquet en cours. Si un paquet ne contient pas dunit qui utilise des units dun autre paquet, il na pas besoin de clause requires. La clause contains identifie les fichiers unit compiler et rassembler dans le paquet. Toutes les units utilises par des units de la clause contains qui ne se trouvent pas dans les paquets de la clause requires seront aussi rassembles dans le paquet, mme si elle ne sont pas indiques dans la clause (le compilateur indique un avertissement). Par exemple, le code suivant dclare le paquet vcldb (dans le fichier source vcldb60.bpl) :
package vcldb; requires vcldb; contains rtl, vcl, Db, DBActns, DBOleCtl, Dbcgrids, dbCommon, dbConsts, Dbctrls, Dbgrids, Dblogdlg, SQLTimSt, FmtBcd; end.
Nom de paquets
Les noms de paquets doivent tre uniques dans un projet. Si un paquet a le nom STATS, lditeur de paquet gnre un fichier source correspondant appel STATS.dpk ; le compilateur gnre un excutable et une image binaire appels respectivement STATS.bpl et STATS.dcp. Utilisez STATS pour vous rfrer au paquet dans la clause requires dun autre paquet, ou lors de lutilisation du paquet dans une application.
11-9
Clause Requires
La clause requires spcifie les autres paquets, externes, utiliss par le paquet en cours. Un paquet externe inclus dans la clause requires est automatiquement li lors de la compilation dans toute application utilisant le paquet en cours ou lune des units contenues dans le paquet externe. Si les fichiers unit contenus dans votre paquet font rfrence dautres units empaquetes, les autres paquets doivent apparatre dans la clause requires de votre paquet, sinon vous devrez les ajouter. Si les autres paquets sont omis de la clause requires, le compilateur les importera dans votre paquet comme units contenues implicitement.
Remarque
La plupart des paquets que vous crez ncessitent rtl. Si vous utilisez des composants VCL, vous devez inclure galement le paquet vcl. Si vous utilisez des composants CLX en programmation multiplate-forme, vous devez inclure VisualCLX.
Clause Contains
La clause contains identifie les fichiers unit lier dans le paquet. Si vous crivez votre propre paquet, placez votre code source dans des fichiers pas et incluez-les dans la clause contains.
11-10
Guide du dveloppeur
Compilation de paquets
Vous pouvez compiler un paquet dans lEDI ou depuis la ligne de commande. Pour recompiler un paquet directement dans lEDI :
1 Choisissez Fichier|Ouvrir. 2 Slectionnez le paquet Delphi (*.dpk) partir de la liste droulante Fichiers de type. 3 Slectionnez un fichier .dpk dans la bote de dialogue. 4 Lorsque lditeur de paquet est ouvert, cliquez sur le turbobouton Compiler.
Vous pouvez insrer des directives de compilation dans le code source du paquet. Pour plus dinformations, voir le paragraphe ci-dessous Directives de compilation propres aux paquets. Si vous compilez partir de la ligne de commande, de nouvelles options ddition de lien spcifiques aux paquets sont utilisables. Pour plus dinformations, voir Utilisation du compilateur et du lieur en ligne de commande la page 11-13.
Remarque
Utilisez {$DENYPACKAGEUNIT ON} dans votre code pour que lunit ne soit pas mise dans un paquet. Lutilisation de {$G-} ou {$IMPORTEDDATA OFF} permet un paquet de ne pas tre utilis dans la mme application avec dautres paquets. Les paquets compils avec la directive {$DESIGNONLY ON} ne devrait pas tre utiliss dans les applications puisque quils contiennent du
11-11
code ncessaire lEDI. D autres directives de compilation peuvent tre utilises dans le code source de paquet. Voir Directives de compilation dans laide en ligne pour les directives de compilation qui nont pas t abordes ici. Reportez-vous Cration de paquets et de DLL la page 5-10, pour dautres directives pouvant tre utilises dans toutes les bibliothques.
Paquets faibles
La directive $WEAKPACKAGEUNIT affecte la manire dont un fichier .dcu est stock dans les fichiers .dcp et .bpl dun paquet. Pour des informations sur les fichiers gnrs par le compilateur, voir Fichiers paquets crs lors dune compilation russie la page 11-13.) Si {$WEAKPACKAGEUNIT ON} apparat dans un fichier unit, le compilateur omet lunit des bpl si cest possible, et cre une version locale non empaquete de lunit quand elle est ncessaire une autre application ou un autre paquet. Une unit compile avec cette directive est dite faiblement empaquete. Si, par exemple, vous crez un paquet appel PACK ne contenant que lunit UNIT1. Supposez que UNIT1 nutilise aucune autre unit, mais fait des appels RARE.dll. Si vous placez la directive {$WEAKPACKAGEUNIT ON} dans UNIT1.pas, lors de la compilation du paquet, UNIT1 nest pas incluse dans PACK.bpl ; vous navez donc pas distribuer de copie de RARE.dll avec PACK. Nanmoins, UNIT1 sera toujours incluse dans PACK.dcp. Si UNIT1 est rfrence dans un autre paquet ou une autre application utilisant PACK, elle sera copie dans PACK.dcp et directement compile dans le projet. Supposons maintenant que vous ajoutiez PACK une deuxime unit, UNIT2 qui utilise UNIT1. Cette fois, mme si vous compilez PACK avec la directive {$WEAKPACKAGEUNIT ON} dans UNIT1.pas, le compilateur inclut UNIT1 dans PACK.bpl. Par contre les autres paquets ou applications faisant rfrence UNIT1 utiliseront la copie (non empaquete) prise dans PACK.dcp.
Remarque
Les fichiers unit contenant la directive {$WEAKPACKAGEUNIT ON} ne doivent pas contenir de variables globales, de section dinitialisation ou de sections de finalisation. La directive $WEAKPACKAGEUNIT est une caractristique avance propose pour les dveloppeurs distribuant leurs paquets dautres programmeurs Delphi. Cela permet dviter la distribution de DLL rarement utilises ou dliminer des conflits entre des paquets dpendant dune mme bibliothque externe. Ainsi, lunit PenWin de Delphi rfrence PenWin.dll. La plupart des projets nutilisent pas PenWin et la plupart des ordinateurs nont pas de fichier PenWin.dll install. Cest pour cela que lunit PenWin est faiblement empaquete dans vcl. Quand vous compilez un projet utilisant PenWin et le paquet vcl, PenWin est copi depuis VCL60.dcp et li directement votre projet ; lexcutable rsultant est li statiquement PenWin.dll. Si PenWin ntait pas faiblement empaquet, il se poserait deux problmes. Tout dabord, il faudrait que vcl soit li de manire statique PenWin.dll et ne pourrait de ce fait tre charg que sur un systme disposant de PenWin.dll
11-12
Guide du dveloppeur
install. De plus, si vous tentez de crer un paquet contenant PenWin, une erreur de compilation aurait lieu, puisque lunit PenWin serait contenue dans vcl et dans votre paquet. Ainsi, sans empaquetage faible, lunit PenWin naurait pas pu tre incluse dans la distribution standard de vcl.
Remarque
Lutilisation de loption -$G- empche un paquet dtre utilis dans une mme application avec dautres paquets. Les autres options en ligne de commande peuvent tre utilises de manire approprie lors de la compilation des paquets. Voir Le compilateur en ligne de commande dans laide en lignepour les options en ligne de commande qui nont pas t abordes ici.
dcu bpl
11-13
Dploiement de paquets
Lors de la compilation, les fichiers bpi, bpl et lib sont gnrs par dfaut dans les rpertoires spcifis dans la page Bibliothque de la bote de dialogue des options denvironnement. Vous pouvez redfinir les options par dfaut en cliquant sur le turbobouton Options de lditeur de paquets afin dafficher la bote de dialogue des options du projet ; faites alors les modifications ncessaires dans la page Rpertoires/Conditions.
Dploiement de paquets
Vous dploierez les paquets de la mme faon que les applications. Pour plus dinformations sur le dploiement en gnral, reportez-vous au chapitre 13, D ploiement des applications.
11-14
Guide du dveloppeur
Dploiement de paquets
2 Cliquez sur le turbobouton Ajouter un paquet, slectionnez un bpl dans la bote de dialogue Slectionner le paquet et choisissez Ouvrir. Pour ajouter dautres bpl la collection, choisissez nouveau le turbobouton Ajouter un paquet. Sur le ct gauche de lditeur de paquets, un diagramme arborescence affiche les bpl que vous avez ajout. Pour supprimer un paquet, slectionnez-le et choisissez le turbobouton Retirer le paquet. 3 Slectionnez le nud Collection en haut du diagramme arborescence. Sur la partie droite de lditeur de collection de paquets, deux champs apparaissent :
Dans la bote de saisie Nom auteur/vendeur, vous pouvez saisir des informations optionnelles propos de votre collection de paquets qui apparatront dans la bote de dialogue Installation lorsque les utilisateurs installeront les paquets. Dans la liste Nom de rpertoire, numrez les rpertoires dans lesquels vous voulez installer les fichiers de la collection de paquets. Utilisez les boutons Ajouter, Edition et Supprimer pour modifier cette liste. Par exemple, supposons que vous voulez copier tous les fichiers de code source dans un mme rpertoire. Dans ce cas, vous pouvez saisir comme Source le nom de rpertoire C:\MyPackage\Source, comme le chemin suggr. La bote de dialogue Installation affichera C:\C:\MyPackage\Source comme chemin suggr pour le rpertoire.
4 En plus des bpl, la collection de paquets peut contenir des fichiers .dcp, .dcu, et des units .pas, de la documentation, et dautres fichiers que lon peut inclure pour la distribution. Les fichiers annexes sont placs dans des groupes de fichiers associs aux paquets spcifiques (bpl). Les fichiers dun groupe ne sont installs que lorsque le bpl associ est install. Pour mettre les fichiers annexes dans la collection de paquets, slectionnez un bpl dans le diagramme arborescence et choisissez le turbobouton Ajouter un groupe de fichiers ; saisissez un nom pour le groupe de fichiers. Ajoutez dautres fichiers si vous le dsirez en procdant de la mme manire. Lorsque vous slectionnez un groupe de fichiers, de nouveaux champs apparaissent sur la droite de lditeur de collection de paquets.
Dans la bote liste Rpertoire dinstallation, slectionnez le rpertoire dans lequel vous voulez installer les fichiers de ce groupe. La liste droulante comprend les rpertoires saisis dans liste de rpertoires de ltape 3 ci-dessus. Vrifiez la case cocher Groupe optionnel si vous voulez que linstallation des fichiers de ce groupe soit facultative. Sous Fichiers inclus, numrez les fichiers que vous voulez inclure dans ce groupe. Utilisez les boutons Ajouter, Supprimer et Auto pour modifier la liste. Le bouton Auto permet de slectionner tous les fichiers avec lextension sp cifie dont la liste se trouve dans la clause contains du paquet ; lditeur de collection de paquets utilise le chemin de la bibliothque de Delphi pour rechercher ces fichiers.
5 Vous pouvez slectionner des rpertoires dinstallation pour les paquets dont la liste se trouve dans la clause requires de nimporte quel paquet de votre
11-15
Dploiement de paquets
collection. Lorsque vous slectionnez un bpl dans la liste arborescente, quatre nouveaux champs apparaissent sur la partie droite de lditeur de collection de paquets : Dans la bote liste Fichiers excutables requis, slectionnez le rpertoire dans lequel vous voulez installer les fichiers .bpl pour les paquets dont la liste se trouve dans la clause requires. La liste droulante comprend les rpertoires saisis dans Nom de rpertoire ltape 3 ci-dessus. Lditeur de collection de paquets recherche ces fichiers en utilisant le chemin de la bibliothque Delphi et donne la liste sous Fichiers excutables requis. Dans la bote liste Rpertoire des bibliothques requises, slectionnez le rpertoire dinstallation des fichiers.dcp pour les paquets de la clause requires. La liste droulante comprend les rpertoires spcifis sous Nom rpertoire ltape 3, ci-dessus. Lditeur de collection de paquets recherche ces fichiers en utilisant le chemin de bibliothque global de Delphi, et les affiche sous Fichiers bibliothque requis.
6 Pour enregistrer votre fichier source de collection de paquets, choisissez Fichier|Enregistrer. Les fichiers source de collection de paquets doivent tre enregistrs avec lextension .pce. 7 Pour construire votre collection de paquets, choisissez le turbobouton Compiler. Lditeur de collection de paquets gnre un fichier .dpc avec le nom de votre fichier source (.pce). Si vous navez pas encore enregistr le fichier source, lditeur vous demande un nom de fichier avant la compilation.
Pour diter ou recompiler un fichier .pce existant, slectionnez Fichier|Ouvrir dans lditeur de collection de paquets et localisez le fichier sur lequel vous voulez travailler.
11-16
Guide du dveloppeur
12
Chapitre 12
Chapitre
Ce chapitre prsente les rgles dcriture dapplications qui seront distribues sur les marchs internationaux. En planifiant le processus, il est possible de rduire le temps et le code ncessaires pour que vos applications puissent fonctionner parfaitement ltranger comme sur le march domestique.
Internationalisation et localisation
Pour crer une application distribuable sur les marchs trangers, vous devez accomplir deux tapes : Internationalisation Localisation Si votre version de Delphi comprend les Outils de traduction, vous pouvez les utiliser pour grer la localisation. Pour plus dinformations, voir laide en ligne des outils de traduction (ETM.hlp).
Internationalisation
Linternationalisation est le processus permettant votre application de fonctionner selon divers paramtres rgionaux. Les paramtres rgionaux sont lenvironnement de lutilisateur qui inclut les conventions culturelles du pays cible aussi bien que sa langue. Windows gre un grand nombre de paramtres rgionaux, chacun deux dcrits par lassociation dune langue et dun pays.
12-1
Localisation
La localisation est le processus de traduction dune application pour quelle fonctionne pour des paramtres rgionaux spcifiques. Outre la traduction de linterface utilisateur, la localisation peut galement consister personnaliser les fonctionnalits. Par exemple, une application financire peut tre modifie afin de respecter les rgles fiscales dans diffrents pays.
Codage de lapplication
Vous vous assurerez que le code de lapplication peut grer les chanes quelle rencontrera dans les divers environnements rgionaux cible.
Jeux de caractres
Les versions de Windows diffuses aux USA utilisent le jeu de caractres ANSI Latin-1 (1252). Mais dautres ditions de Windows utilisent des jeux de caractres diffrents. Ainsi, la version japonaise de Windows utilise le jeu de caractres Shift-JIS (page de code 932) qui reprsente les caractres japonais avec des codes sur plusieurs octets. Il y a, en gnral, trois types de jeux de caractres : Uni-octet (cod sur un seul octet) Multi-octet (cod sur plusieurs octets) Multi-octet et de longueur fixe Windows et Linux supportent tous les deux les jeux de caractres sur un seul octet et sur plusieurs octets, comme le jeu Unicode. Dans un jeu sur un seul octet, chaque octet dune chane reprsente un caractre. Le jeu de caractres ANSI utilis par de nombreux systmes dexploitation occidentaux utilise un seul octet. Dans un jeu sur plusieurs octets, certains caractres sont reprsents par un octet et dautres par plusieurs octets. Le premier octet dun caractre sur plusieurs octets est appel loctet de poids fort. En gnral, les 128 premiers caractres dun jeu multi-octet correspondent aux caractres ASII sur 7 bits, et tout octet dont la valeur ordinale est suprieure 127 est loctet de poids fort dun
12-2
Guide du dveloppeur
caractre multi-octet. Seuls les caractres sur un octet peuvent contenir la valeur null (#0). Les jeux de caractres multi-octets en particulier les jeux sur deux octets (DBCS) sont employs pour les langues asatiatiques, tandis que le jeu UTF-8 utilis par Linux est un encodage sur plusieurs octets du jeu Unicode.
12-3
Noubliez pas que la longueur de la chane en octets ne correspond pas ncessairement la longueur de la chane en caractres. Faites attention ne pas tronquer les chanes en coupant en deux un caractre cod sur plusieurs octets. Vous ne pouvez pas passer des caractres comme paramtres aux fonctions ou aux procdures puisque la taille dun caractre nest pas connue directement. Vous devez passer un pointeur sur le caractre ou sur la chane.
Caractres larges
Une autre approche de lutilisation des jeux de caractres pour idogrammes est de convertir tous les caractres dans un systme de caractres larges, comme Unicode. Les caractres et les chanes Unicode sont galement appels caractres larges et chanes de caractres larges. Dans le jeu Unicode, chaque caractre est reprsent par deux octets. Ainis, une chane Unicode est une suite non doctets spars mais de mots de deux octets. Les 256 premiers caractres Unicode correspondent au jeu de caractres ANSI. Le systme dexploitation Windows supporte Unicode (UCS-2). Le systme dexploitation Linux supporte UCS-4, super-ensemble de UCS-2. Delphi/Kylix supporte UCS-2 sur les deux plates-formes. Les caractres larges utilisant deux octets et non un, le jeu de caractres peut reprsenter beaucoup plus de caractres diffrents. En outre, les caractres larges prsentent un avantage sur les caractres MBCS : ils vous permettent de conserver vos habitudes car il existe une relation directe entre le nombre doctets dune chane et son nombre de caractres. Et, vous ne risquez plus de couper un caractre en deux, ni de confondre la seconde moiti dun caractre avec la premire dun autre. Linconvnient majeur des caractres larges est que Windows 9x nen reconnat quun petit nombre dans les appels aux fonctions API. Cest pourquoi, les composants VCL reprsentent toutes les valeurs chanes par des chanes caractres dun seul octet ou par des chanes MBCS. Vous devrez passer du systme caractres larges au systme MBCS chaque fois que dfinir la proprit dune chane ou en lire la valeur exigerait un supplment de code et ralentirait votre application. Cependant, vous pouvez souhaiter traduire en caractres larges certains algorithmes de traitement des chanes pour profiter de la correspondance 1 pour 1 entre caractres et WideChars.
12-4
Guide du dveloppeur
Tableau 12.1
Supplment
TActionMainMenuBar TActionToolBar TBitBtn TCheckListBox TColorBox TDrawGrid TLabeledEdit TMaskEdit TScrollBox TSpeedButton TStaticLabel TStaticText TStringGrid TValueListEditor
Win32
TComboBoxEx TDateTimePicker THeaderControl THotKey TListView TMonthCalendar TPageControl TRichEdit TStatusBar TTreeView
12-5
Tableau 12.1
QReport
Autres classes
TApplication (sans ParentBiDiMode) TBoundLabel TControl (sans ParentBiDiMode) TCustomHeaderControl (sans ParentBiDiMode) TForm TFrame THeaderSection THintWindow (sans ParentBiDiMode) TMenu TStatusPanel TTabControl TValueListEditor
Remarque
Proprits bi-directionnelles
Les objets dont la liste est donne dans le tableau 12.1, Objets de la VCL supportant les BiDi, ont les proprits : BiDiMode et ParentBiDiMode. Ces proprits, ainsi que BiDiKeyboard et NonBiDiKeyboard de TApplication grent la localisation bi-directionnelle.
Remarque
Les proprits bi-directionnelles ne sont pas disponibles dans CLX pour la programmation multiplate-forme.
12-6
Guide du dveloppeur
Proprit BiDiMode
La proprit BiDiMode est un nouveau type dnumr, TBiDiMode, qui possde quatre tats : bdLeftToRight, bdRightToLeft, bdRightToLeftNoAlign et bdRightToLeftReadingOnly.
bdLeftToRight
bdLeftToRight dessine le texte en utilisant le sens de lecture de gauche droite, lalignement et la barre de dfilement tant inchangs. Par exemple, lors de la saisie de texte de droite gauche, comme pour lArabe ou lHbreu, le curseur passe en mode poussoir et le texte est saisi de droite gauche. Pour du texte latin, comme lAnglais ou le Franais, il est saisi de gauche droite. bdLeftToRight est la valeur par dfaut.
Figure 12.1 Contrles initialiss bdLeftToRight
bdRightToLeft
bdRightToLeft dessine le texte en utilisant le sens de lecture de droite gauche, lalignement tant modifi et la barre de dfilement dplace. Le texte est saisi normalement pour les langues allant de droite gauche comme lArabe ou lHbreu. Lorsque le clavier est modifi pour une langue latine, le curseur passe en mode poussoir et le texte est saisi de gauche droite.
Figure 12.2 Contrles initialiss bdRightToLeft
bdRightToLeftNoAlign
bdRightToLeftNoAlign dessine le texte en utilisant le sens de lecture de droite gauche, lalignement tant inchang et la barre de dfilement dplace.
Figure 12.3 Contrles initialiss bdRightToLeftNoAlign
bdRightToLeftReadingOnly
bdRightToLeftReadingOnly dessine le texte en utilisant le sens de lecture de droite gauche, lalignement et la barre de dfilement tant inchangs.
Figure 12.4 Contrles initialiss bdRightToLeftReadingOnly
12-7
Proprit ParentBiDiMode
ParentBiDiMode est une proprit boolenne. Lorsquelle est True (la valeur par dfaut), le contrle regarde la proprit de son parent pour connatre la valeur utiliser pour BiDiMode. Si le contrle est un objet TForm, la fiche utilise la valeur BiDiMode de Application. Si toutes les proprits ParentBiDiMode sont True, lorsque la proprit BiDiMode de Application est modifie, toutes les fiches et tous les contrles du projet sont initialiss avec la nouvelle valeur.
Mthode FlipChildren
La mthode FlipChildren vous permet de faire basculer la position des enfants dun contrle conteneur. Les contrles conteneur sont des contrles qui contiennent dautres contrles, comme TForm, TPanel et TGroupBox. FlipChildren possde un seul paramtre boolen, AllLevels. Lorsqu il est False, seuls les enfants directs du contrle conteneur sont basculs de position. Lorsquil est True, tous les enfants du contrle conteneur sont basculs de position. Delphi fait basculer la position des contrles en modifiant la proprit Left et lalignement du contrle. Si le ct gauche dun contrle est cinq pixels de la limite gauche de son parent, le basculement provoque laffichage du ct droit du contrle de saisie cinq pixels de la limite droite de son parent. Si le contrle de saisie est align gauche, un appel FlipChildren provoquera un alignement droite. Pour basculer la position dun contrle lors de la conception, il faut slectionner Edition|Transposer les enfants et slectionner Tous ou Slectionns suivant que vous voulez basculer la position de tous les contrles ou seulement les enfants du contrle slectionn. Il est aussi possible de basculer la position dun contrle en slectionnant le contrle sur la fiche, en cliquant sur le bouton droit de la souris pour slectionner le choix Transposer les enfants dans le menu contextuel.
Remarque
La slection dun contrle de saisie suivi de la commande Transposer les enfants|Slectionns ne fait rien. Cela est du au fait que les contrles de saisie ne sont pas des conteneurs.
Autres mthodes
Il existe dautres mthodes utiles afin de dvelopper des applications pour des utilisateurs bi-directionnels.
M thode
OkToChangeFieldAlignment DBUseRightToLeftAlignment ChangeBiDiModeAlignment
Description
Utilise avec les contrles base de donnes. Vrifie si lalignement dun contrle peut tre modifi. Utilise pour v rifier lalignement des contrles base de donnes. Modifie le param tre dalignement qui lui est transmis. Aucune vrification nest faite pour linitialisation de BiDiMode, car il y a juste conversion de lalignement gauche vers lalignement droite et vice-versa, en laissant centr les contrles seuls. Renvoie True si une des options allant de droite gauche est slectionne. Renvoie False si le contrle est dans un mode allant de gauche droite.
IsRightToLeft
12-8
Guide du dveloppeur
M thode
UseRightToLeftReading UseRightToLeftAlignment
Description
Renvoie True si le contrle utilise le sens de lecture allant de droite gauche. Renvoie True si le contrle utilise le sens dalignement allant de droite gauche. Il peut tre surchag pour tre personnalis. Renvoie True si le contrle utilise une barre de dfilement gauche. Renvoie les bons paramtres pour le mode BiDi du contrle. Renvoie les bons paramtres pour le mode BiDi du contrle, en les limitant la lecture. Ajoute le paramtre ExStyle flags appropri au contrle cr.
Texte
Tout le texte apparaissant dans linterface utilisateur doit tre traduit. Le texte anglais tant presque toujours plus court que les traductions, vous devez concevoir les lments de votre interface utilisateur qui affiche du texte en
12-9
rservant de lespace pour lexpansion de ce texte. Concevez galement les botes de dialogue, les menus, les barres dtat et les autres lments de linterface utilisateur affichant du texte de telle sorte quils puissent facilement afficher des chanes plus longues. Evitez les abrviations qui ne peuvent exister dans les langues utilisant des idogrammes. Les chanes courtes grandissent plus que les phrases longues. Le tableau suivant fournit une approximation des taux de foisonnement selon la longueur de la chane initiale (en anglais) :
Tableau 12.2
1-5 6-12 13-20 21-30 31-50 over 50
Images graphiques
Le mieux est dutiliser des images qui ne ncessitent pas de traduction, cest-dire des images qui ne contiennent pas de texte. Si vous devez inclure du texte dans vos images, il est prfrable dutiliser un objet libell avec arrire-plan transparent par dessus limage, plutt que dinclure le texte dans limage ellemme. Voici quelques autres considrations prendre en compte lors de la cration des images graphiques. Essayez dviter les images spcifiques une culture. Par exemple, les botes lettres sont trs diffrentes selon les pays. Les symboles religieux ne conviennent pas aux pays o il existe plusieurs religions dominantes. Mme les couleurs ont des connotations symboliques diffrentes selon les cultures.
12-10
Guide du dveloppeur
12-11
type TForm1 = class(TForm) Button1: TButton; LocaleList: TListBox; procedure Button1Click(Sender: TObject); private { dclarations prives } public { dclarations publiques } end; var Form1: TForm1; implementation {$R *.DFM} function GetLocaleData(ID: LCID; Flag: DWORD): string; var BufSize: Integer; begin BufSize := GetLocaleInfo(ID, Flag, nil, 0); SetLength(Result, BufSize); GetLocaleinfo(ID, Flag, PChar(Result), BufSize); SetLength(Result, BufSize - 1); end; { Appel pour chaque localisation supporte. } function LocalesCallback(Name: PChar): Bool; stdcall; var LCID: Integer; begin LCID := StrToInt('$' + Copy(Name, 5, 4)); Form1.LocaleList.Items.Add(GetLocaleData(LCID, LOCALE_SLANGUAGE)); Result := Bool(1); end; procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin with Languages do begin for I := 0 to Count - 1 do begin ListBox1.Items.Add(Name[I]); end; end; end;
12-12
Guide du dveloppeur
Lorsque votre application dmarre, elle vrifie les paramtres rgionaux du systme. Si elle trouve des DLL de ressource ayant les mmes noms que les fichiers EXE, DLL ou BPL qu elle utilise, elle examine lextension de ces DLL. Si lextension dun module ressource correspond la langue et au pays des paramtres rgionaux du systme, votre application utilise les ressources de ce module plutt que les ressources de lexcutable, de la DLL ou du paquet. Sil ny a pas de module ressource correspondant la fois la langue et au pays, votre application essaie de trouver un module ressource correspondant la langue seule. Sil ny a pas de module ressource correspondant la langue, votre application utilise les ressources compiles avec lexcutable, la DLL ou le paquet. Si vous voulez que votre application utilise un module de ressource diffrent de celui correspondant aux paramtres rgionaux du systme sur lequel elle sexcute, vous pouvez redfinir lentre spcifiant la localisation dans les registres Windows. Sous lentre HKEY_CURRENT_USER\Software\Borland\ Locales, ajoutez le chemin daccs de lapplication et le nom de fichier sous la forme dune chane et dfinissez comme valeur de la donne lextension du DLL de ressource. Au dmarrage, lapplication recherche les DLL de ressource portant cette extension avant de rechercher la localisation du systme. Laffectation de cette entre de registre permet de tester des versions localises de lapplication sans modifier la localisation de votre systme. Par exemple, la procdure suivante peut tre utilise dans le programme dinstallation ou de configuration afin de dfinir la localisation utiliser au moment de charger des applications Delphi :
procedure SetLocalOverrides(FileName: string, LocaleOverride: string); var Reg: TRegistry; begin Reg := TRegistry.Create; try if Reg.OpenKey(Software\Borland\Locales, True) then Reg.WriteString(LocalOverride, FileName); finally Reg.Free; end;
Dans votre application, utilisez la fonction globale FindResourceHInstance pour obtenir le handle du module de ressource en cours. Par exemple :
LoadStr(FindResourceHInstance(HInstance), IDS_AmountDueName, szQuery, SizeOf(szQuery));
Vous pouvez ainsi distribuer une seule application qui sadapte automatiquement la localisation du systme sur laquelle elle sexcute en fournissant simplement les DLL de ressource.
12-13
devez inclure lunit ReInit dans votre instruction uses. ReInit se trouve dans lexemple Richedit du rpertoire Demos. Pour basculer de langue, vous devez appeler LoadResourceModule, en passant le LCID du nouveau langage, puis appeler ReinitializeForms. Par exemple, le code suivant bascule la langue en Franais :
const FRENCH = (SUBLANG_FRENCH shl 10) or LANG_FRENCH; if LoadNewResourceModule(FRENCH) <> 0 then ReinitializeForms;
Lavantage de cette technique est que linstance en cours de lapplication et de toutes ses fiches est utilise. Il nest pas ncessaire de mettre jour les paramtres du registre et de redmarrer lapplication ou de recharger les ressources ncessaires lapplication, comme la connexion aux serveurs base de donnes. Lorsquil y a basculement de la DLL de ressource, les proprits spcifies dans la nouvelle DLL crasent celles des instances en cours dexcution des fiches.
Remarque
Toute modification effectu e dans les proprits dune fiche lors de lexcution est perdue. Une fois que la nouvelle DLL est charge, les valeurs par dfaut ne sont pas initialises. Evitez le code qui rinitialise les objets fiche dans leur tat de dmarrage, mise part les diffrences dues la localisation.
Dans un projet DLL de ressource, vous ne pouvez pas ajouter ou supprimer de composant. Pourtant, il est possible de modifier les proprits, au risque de gnrer des erreurs dexcution. Veillez donc ne modifier que les proprits qui requirent une traduction. Pour viter les erreurs, vous pouvez configurer linspecteur dobjets pour nafficher que les proprits localisables ; pour ce faire, cliquez avec le bouton droit sur linspecteur dobjets et utilisez le menu Voir pour filtrer les catgories de proprits non souhaites. Vous pouvez ouvrir le fichier RC et traduire des chanes appropries. Utilisez lditeur StringTable en ouvrant le fichier RC partir du gestionnaire de projet.
12-14
Guide du dveloppeur
13
Chapitre 13
Chapitre
Une fois que votre application Delphi est termine et quelle fonctionne, vous pouvez la dployer. Cest--dire que vous la rendez disponible pour que dautres lexcutent. Il est ncessaire deffectuer un certain nombre doprations pour dployer une application sur un autre ordinateur afin que lapplication soit entirement oprationnelle. Les tapes ncessaires pour une application donne varient suivant le type de lapplication. Les sections suivantes dcrivent les points prendre en compte pour dployer les diffrentes applications :
Remarque
Dploiement dapplications gnralistes Dploiement dapplications CLX Dploiement dapplications de bases de donnes Dploiement dapplications Web Programmation pour des environnements htes htrognes Termes du contrat de licence logicielle
Les informations prsentes dans ces sections concernent le dploiement dapplications sous Windows. Si vous crivez des applications multiplates-formes dployer sous Linux, vous devez vous reporter aux informations sur le dploiement de la documentation Kylix.
13-1
de registre. Les tapes suivantes sont les principales tapes dun dploiement et concernent quasiment tous les types dapplication : Utilisation des programmes dinstallation Identification des fichiers de lapplication Les applications Delphi qui accdent des bases de donnes ou qui fonctionnent sur le Web ncessitent des tapes complmentaires dinstallation en plus de celles sappliquant aux applications gnrales. Pour davantage dinformations sur linstallation dapplications de bases de donnes, voir Dploiement dapplications de bases de donnes la page 13-7. Pour davantage dinformations sur linstallation dapplications Web, voir D ploiement dapplications Web la page 13-11. Pour davantage dinformations sur linstallation de contrles ActiveX, voir Dploiement dun contrle ActiveX sur le Web la page 38-16.
13-2
Guide du dveloppeur
Fichiers de lapplication
Il peut tre ncessaire de distribuer les types suivants de fichiers avec une application :
Tableau 13.1 Type
Fichiers programme Fichiers paquet Fichiers daide Fichiers ActiveX Tables des fichiers locaux
Fichiers paquet
Si lapplication utilise des paquets dexcution, il faut distribuer les fichiers paquet avec lapplication. InstallShield Express gre linstallation des fichiers paquet de la mme manire que les DLL, copie ces fichiers et cre les entres ncessaires dans les registres Windows. Vous pouvez aussi utiliser des modules de fusion pour dployer des paquets dexcution avec des outils dinstallation bass sur MSI, comme InstallShield Express. Voir la section suivante pour plus de dtails. Borland recommande linstallation des fichiers paquet dexcution dorigine Borland dans le rpertoire Windows\System. Cela sert demplacement commun afin que plusieurs applications puissent accder une seule instance de ces fichiers. Pour les paquets que vous avez crs, il est recommand de les installer dans le rpertoire de lapplication. Seuls les fichiers .BPL doivent tre distribus.
Remarque
Si vous dployez des paquets avec des applications CLX, vous devez inclure clx60.bpl au lieu de vcl60.bpl. Si vous distribuez des paquets dautres dveloppeurs, fournissez les fichiers .BPL et .DCP.
13-3
Modules de fusion
InstallShield Express 3.0 est bas sur la technologie MSI, linstallateur de Windows. Cest pour cette raison que Delphi inclut les modules de fusion. Les modules de fusion fournissent une mthode standard que vous pouvez utiliser pour offrir aux applications du code partag , des fichiers, des ressources, des entres du registre et la logique dinstallation sous forme dun seul fichier compos. Vous pouvez utiliser des modules de fusion pour dployer des paquets dexcution avec des outils dinstallation bass sur MSI, comme InstallShield Express. Les bibliothques dexcution ont certaines interdpendances en raison de la faon dont elles ont t regroupes. Le rsultat est que lorsqu un paquet est ajout un projet dinstallation, loutil dinstallation ajoute automatiquement un ou plusieurs autres paquets ou signale une dpendance sur eux. Par exemple, si vous ajoutez le module de fusion VCLInternet un projet dinstallation, loutil dinstallation va aussi ajouter automatiquement les modules VCLDatabase et StandardVCL ou signaler une dpendance sur ces modules. Les dpendances de chaque module de fusion sont numres dans le tableau suivant. Les divers outils dinstallation peuvent ragir diffremment ces dpendances. InstallShield pour linstallateur Windows ajoute automatiquement les modules requis sil peut les trouver. Les autres outils peuvent se contenter de signaler une dpendance ou peuvent gnrer un chec de construction si les modules requis ne sont pas tous inclus dans le projet.
Tableau 13.2
ADORTL BaseClientDataSet BaseRTL BaseVCL BDEClientDataSet
Module de fusion
Dpendances
DatabaseRTL, BaseRTL DatabaseRTL, BaseRTL, DataSnap, dbExpress Pas de dpendance BaseRTL BaseClientDataSet, DataBaseRTL, BaseRTL, DataSnap, DatabaseVCL, BaseVCL, BDERTL Internet, DatabaseRTL, BaseRTL, BDERTL DatabaseRTL, BaseRTL BaseRTL BaseVCL, DatabaseRTL, BaseRTL DatabaseRTL, BaseRTL DataSnap, DatabaseRTL, BaseRTL DataSnapConnection, DataSnap, DatabaseRTL, BaseRTL, BaseVCL DataSnap, DatabaseRTL, BaseRTL, BaseVCL DatabaseVCL, BaseVCL, BaseRTL DatabaseRTL, BaseRTL
BDEInternet BDERTL DatabaseRTL DatabaseVCL DataSnap DataSnapConnection DataSnapCorba DataSnapEntera DBCompatVCL dbExpress
inetdbbde60.bpl bdertl60.bpl dbrtl60.bpl vcldb60.bpl dsnap60.bpl dsnapcon60.bpl dsnapcrba60.bpl dsnapent60.bpl vcldbx60.bpl dbexpress60.bpl
13-4
Guide du dveloppeur
Tableau 13.2
Module de fusion
dbExpressClientDataSet DBXInternet DecisionCube FastNet InterbaseVCL
Dpendances
BaseClientDataSet, DataBaseRTL, BaseRTL, DataSnap, dbExpress Internet, DatabaseRTL, BaseRTL, dbExpress, DatabaseVCL, BaseVCL TeeChart, BaseVCL, BaseRTL, DatabaseVCL, DatabaseRTL, BDERTL BaseVCL, BaseRTL BaseClientDataSet, DatabaseRTL, BaseRTL, DataSnap, DatabaseVCL, BaseVCL DatabaseRTL, BaseRTL BaseVCL, BaseRTL DatabaseVCL, BaseVCL, DatabaseRTL, BaseRTL BaseVCL, BaseRTL, BDERTL, DatabaseRTL BaseVCL, BaseRTL BaseVCL, BaseRTL BaseVCL, BaseRTL BaseRTL XMLRTL, Internet, DataSnapConnection, DataSnap, DatabaseRTL, BaseRTL WebDataSnap, XMLRTL, Internet, DataSnapConnection, DataSnap, DatabaseRTL, BaseRTL, BaseVCL Internet, DatabaseRTL, BaseRTL
Internet InternetDirect Office2000Components QuickReport SampleVCL TeeChart VCLIE VisualCLX WebDataSnap WebSnap
inet60.bpl, inetdb60.bpl indy60.bpl dcloffice2k60.bpl qrpt60.bpl vclsmp60.bpl tee60.bpl, teedb60.bpl, teeqr60.bpl, teeui60.bpl vclie60.bpl visualclx60.bpl webdsnap60.bpl websnap60.bpl, vcljpg60.bpl xmlrtl60.bpl
XMLRTL
Contrles ActiveX
Certains composants fournis avec Delphi sont des contrles ActiveX. Le conteneur du composant est li au fichier excutable de lapplication (ou un paquet dexcution), mais le fichier .OCX du composant doit galement tre distribu avec lapplication. Ces composants sont : Chart FX, copyright par SoftwareFX Inc. VisualSpeller Control, copyright par Visual Components, Inc. Formula One (tableur), copyright par Visual Components, Inc. First Impression (VtChart), copyright par Visual Components, Inc. Graph Custom Control, copyright par Bits Per Second Ltd.
Les contrles ActiveX que vous crez doivent galement tre enregistrs sur lordinateur cible avant dtre utiliss. Les programmes dinstallation comme InstallShield Express automatisent le processus denregistrement. Pour enregistrer manuellement un contrle ActiveX, utilisez lapplication exempleTRegSvr ou lutilitaire Microsoft REGSRV32.EXE (qui nest pas inclus dans toutes les versions de Windows).
13-5
Les fichiers DLL grant un contrle ActiveX doivent galement tre distribus avec une application.
Applications complmentaires
Les applications complmentaires sont des programmes distincts en labsence desquels votre application Delphi fonctionnerait de manire incomplte ou ne fonctionnerait pas du tout. Les applications complmentaires peuvent tre celles fournies avec le systme dexploitation, par Borland ou des produits tiers. Le programme utilitaire Server Manager de InterBase est un exemple de programme complmentaire qui permet de grer les utilisateurs et la scurit des bases de donnes InterBase. Si une application dpend dun programme complmentaire, assurez-vous de le dployer avec votre application, si cest possible. La distribution des programmes complmentaires peut tre limite par des accords de licence de distribution. Consultez la documentation dun programme complmentaire pour des informations spcifiques.
Quand vous dployez des applications CLX sous Windows, vous devez inclure qtintf.dll avec lapplication pour inclure le runtime CLX. Si vous dployez des paquets avec des applications CLX, vous devez inclure clx60.bpl au lieu de vcl60.bpl. Voir chapitre 10, Utilisation de CLX pour le dveloppement multiplate-forme, pour des informations sur lcriture des applications CLX.
13-6
Guide du dveloppeur
13-7
supplmentaire nest requis. Pour plus dinformations, reportez-vous au Embedded Installation Guide situ sur le site web de Borland. Outre les technologies dcrites ici, vous pouvez utiliser des moteurs de bases de donnes fournis par des tiers pour grer laccs aux bases de donnes des applications Delphi. Consultez la documentation ou le vendeur du moteur de bases de donnes pour ce qui concerne les problmes de droit, dinstallation et de configuration du moteur.
Si vous ne dployez pas un excutable autonome, vous pouvez dployer avec votre excutable les pilotes dbExpress et les DLL DataSnap associs. Le tableau suivant numre les DLL appropries et indique quand il faut les inclure :
Tableau 13.4 DLL de bases de donnes
dbexpint.dll dbexpora.dll dbexpdb2.dll.
Dploiement dbExpress avec les DLL des pilotes Quand les dployer
Applications se connectant aux bases de donnes InterBase Applications se connectant aux bases de donnes Oracle Applications se connectant aux bases de donnes DB2
13-8
Guide du dveloppeur
Dploiement dbExpress avec les DLL des pilotes (suite) Quand les dployer
Applications se connectant aux bases de donnes MySQL Requis par les applications de bases de donnes qui utilisent des ensembles de donnes client
13-9
dinstallation certifis, comme InstallShield Express, sont capables deffectuer une installation partielle du BDE. Il faut prendre garde laisser intacts les fichiers systme BDE inutiliss par lapplication installe mais ncessaires dautres programmes dj installs.
SQL Links
SQL Links propose les pilotes permettant de connecter une application au logiciel client dune base de donnes SQL (via le moteur de bases de donnes Borland). Voir le document DEPLOY pour connatre les droits et restrictions sappliquant la distribution de SQL Links. Comme pour le moteur de bases de donnes Borland, SQL Links doit tre dploy en utilisant InstallShield Express (ou tout autre programme certifi).
Remarque
SQL Links connecte le BDE au logiciel client et pas directement la base de donnes SQL mme. Il est donc toujours ncessaire dinstaller le programme client du systme de bases de donnes SQL utilis. Reportez-vous la documentation de votre systme SQL ou consultez le vendeur pour davantage dinformations sur linstallation et la configuration du logiciel client. Le tableau suivant prsente les noms des fichiers de pilote et de configuration utiliss par SQL Links pour se connecter aux diffrents systmes de base de donnes SQL. Ces fichiers sont fournis avec SQL Links et sont redistribuables en accord avec la licence Delphi.
Tableau 13.5 Vendeur
Oracle 7 Oracle8 Sybase Db-Lib Sybase Ct-Lib Microsoft SQL Server Informix 7 Informix 9 DB/2 InterBase
Fichiers des logiciels client des bases de donnes SQL Fichiers redistribuables
SQLORA32.DLL et SQL_ORA.CNF SQLORA8.DLL et SQL_ORA8.CNF SQLSYB32.DLL et SQL_SYB.CNF SQLSSC32.DLL et SQL_SSC.CNF SQLMSS32.DLL et SQL_MSS.CNF SQLINF32.DLL et SQL_INF.CNF SQLINF9.DLL et SQL_INF9.CNF SQLDB232.DLL et SQL_DB2.CNF SQLINT32.DLL et SQL_INT.CNF
Installez SQL Links en utilisant InstallShield Express ou tout autre programme dinstallation certifi. Pour des informations spcifiques concernant linstallation et la configuration de SQL Links, voir le fichier daide SQLLNK32.HLP qui est install, par dfaut, dans le rpertoire principal du BDE.
13-10
Guide du dveloppeur
13-11
Cela permettra de satisfaire les demandes comme as /cgi-bin/mycgi grce lexcution du script c:\inetpub\cgi-bin\mycgi. Vous pouvez aussi dfinir Options par All ou par ExecCGI en utilisant la directive Directory dans httpd.conf. La directive Options contrle les fonctionnalits du serveur qui seront disponibles dans un rpertoire particulier. Les directives Directory sont utilises pour entourer un ensemble de directives qui sappliquent au rpertoire indiqu et ses sous-rpertoires. Voici un exemple de la directive Directory :
<Directory <apache-root-dir>\cgi-bin> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory>
Dans cet exemple, Options est dfinie par ExecCGI ce qui permet lexcution des scripts CGI dans le rpertoire cgi-bin.
Remarque
Apache sexcute en local sur le serveur sous le compte spcifi par la directive User du fichier httpd.conf. Assurez-vous que lutilisateur a bien les droits appropris pour accder aux ressources ncessaires lapplication. Des informations sur le dploiement du logiciel Apache se trouvent dans le fichier LICENSE dApache, livr avec Apache. Vous trouverez aussi des informations de configuration sur le site web dApache, www.apache.org.
13-12
Guide du dveloppeur
13-13
Si par exemple, le systme de dveloppement est configur avec une rsolution cran de 1024x768 et quune fiche est conue avec une largeur de 700 pixels, une partie de cette fiche ne sera pas visible sur le bureau dun ordinateur configur avec une rsolution de 640x480.
13-14
Guide du dveloppeur
(640 / 1024 = 0,625). La taille de fonte dorigine de 8 est rduite 5 (8 * 0,625 = 5). Le texte de lapplication apparat irrgulier et illisible quand il saffiche laffiche dans la fonte rduite. Certains contrles visuels comme TLabel et TEdit se redimensionnent dynamiquement quand la taille de la fonte du contrle change. Cela peut affecter les applications dployes quand les fiches et les contrles sont redimensionns dynamiquement. Le redimensionnement du contrle provoqu par la modification de taille de la fonte se cumule la modification de taille due au redimensionnement proportionnel aux rsolutions cran. Cet effet indsirable est neutralis en dfinissant la proprit AutoSize de ces contrles par False. Il faut viter dutiliser des coordonnes en pixel explicites, par exemple pour crire directement dans un canevas. Il faut la place modifier les coordonnes en leur appliquant un ratio proportionnel au ratio de diffrence des rsolutions cran entre le systme de dveloppement et celui dutilisation. Si, par exemple, lapplication dessine un rectangle dans le canevas de dix pixels de haut sur vingt pixels de large, multipliez les valeurs dix et vingt par le ratio de diffrence de rsolution. Ainsi, vous tes certain que le rectangle apparat visuellement de la mme taille pour diffrentes rsolutions cran.
Fontes
Les systmes dexploitation Windows et Linux disposent dun jeu standard de fontes. Quand vous concevez une application devant tre dploye sur dautres ordinateurs, tenez compte du fait que tous les ordinateurs nont pas ncessairement de fontes en-dehors des jeux standard. Les composants texte utiliss dans lapplication ne doivent utiliser que des fontes qui sont trs probablement disponibles sur les ordinateurs cible. Quand lutilisation dune fonte non standard est absolument ncessaire dans une application, vous devez distribuer cette fonte avec lapplication. Soit le programme dinstallation, soit lapplication mme doit installer la fonte sur lordinateur cible. La distribution de fontes cres par des tiers peut tre sujette des restrictions imposes par leurs crateurs. Windows dispose dune protection contre lutilisation dune fonte inexistante sur un systme. Il lui substitue une fonte existante, la plus proche possible. Bien que
13-15
cela empche les erreurs dues des fontes manquantes, le rsultat final peut dgrader laspect visuel de lapplication. Il est prfrable de prvoir cette ventualit la conception. Pour mettre la disposition dune application Windows une fonte non standard, utilisez les fonctions AddFontResource et DeleteFontResource de lAPI Windows. Dployez les fichiers .fot des fontes non-standard avec lapplication.
13-16
Guide du dveloppeur
DEPLOY
DEPLOY aborde certains aspects lgaux de la distribution de divers composants et utilitaires et autres produits pouvant faire partie ou tre associs une application Delphi. DEPLOY est un document install dans le rpertoire principal de Delphi. Il aborde les sujets suivants : fichiers .exe, .dll et .bpl Les composants et les paquets de conception Le moteur de bases de donnes Borland (BDE) contrles ActiveX Les images exemple SQL Links
README
README contient des informations de dernire minute Delphi ; il peut donc contenir des informations pouvant affecter les droits de redistribution des composants, utilitaires ou autres lments. README est un document install dans le rpertoire principal de Delphi.
Contrat de licence
Le contrat de licence Delphi est un document imprim qui traite des droits et obligations lgales concernant Delphi.
13-17
13-18
Guide du dveloppeur
II
Partie II
Partie
Les chapitres de cette partie prsentent les concepts et les connaissances ncessaires la cration dapplications de bases de donnes Delphi.
Remarque
Vous avez besoin de ldition Professionnelle ou Entreprise de Delphi pour dvelopper des applications de bases de donnes. Pour implmenter des bases de donnes Client/Serveur plus volues, vous avez besoin des caractristiques de Delphi disponibles dans ldition Entreprise.
14
Chapitre 14
Chapitre
Les applications de bases de donnes permettent aux utilisateurs dinteragir avec les informations stockes dans les bases de donnes. Les bases de donnes permettent de structurer les informations et de les partager entre plusieurs applications. Delphi permet de grer les applications de bases de donnes relationnelles. Les bases de donnes relationnelles organisent les informations en tables, qui contiennent des lignes (enregistrements) et des colonnes (champs). Ces tables peuvent tre manipules par des oprations simples appeles calculs relationnels. Lorsque vous concevez une application de bases de donn es, vous devez comprendre comment les donnes sont structures. A partir de cette structure, vous pouvez concevoir une interface utilisateur pour afficher les donnes et permettre lutilisateur dentrer de nouvelles informations et de modifier les donnes existantes. Ce chapitre prsente certains aspects courants de la conception dune application de bases de donnes et les dcisions inhrentes la conception dune interface utilisateur.
14-1
ventail de fonctions et offre les meilleurs utilitaires. Il reprsente le meilleur support de manipulation des donnes dans les tables Paradox ou dBASE. Toutefois, cest le mcanisme le plus compliqu dployer. Pour plus dinformations sur lutilisation des composants BDE, voir chapitre 20, Utilisation du moteur de bases de donnes Borland. La page ADO de la palette de composants contient les composants qui utilisent ActiveX Data Objects (ADO) pour accder aux informations de bases de donnes via OLEDB. ADO est un standard Microsoft. De nombreux pilotes ADO permettent de se connecter diffrents serveurs de bases de donnes. Grce aux composants ADO, vous pouvez intgrer votre application dans un environnement ADO (par exemple, en recourant des serveurs dapplications ADO). Pour plus dinformations sur lutilisation des composants ADO, voir chapitre 21, Utilisation des composants ADO. La page dbExpress de la palette de composants contient les composants qui utilisent dbExpress pour accder aux informations de bases de donnes. dbExpress est un ensemble de pilotes lgers qui offrent laccs le plus rapide aux informations de bases de donnes. En outre, tant galement disponibles sous Linux, les composants dbExpress autorisent le dveloppement multiplateforme. Toutefois, les composants base de donnes dbExpress prennent en charge lventail le plus rduit de fonctions de manipulation de donnes. Pour plus dinformations sur lutilisation des composants dbExpress, voir chapitre 22, Utilisation densembles de donnes unidirectionnels. La page InterBase de la palette de composants contient les composants qui accdent directement aux bases de donnes InterBase, sans passer par une couche moteur distincte. La page AccsBD de la palette de composants contient les composants utilisables avec tout mcanisme daccs aux donnes. Cette page comprend TClientDataset, qui peut utiliser les donnes stockes sur disque ou, par le biais du composant TDataSetProvider de cette mme page, les composants dun des autres groupes. Pour plus dinformations sur lutilisation des ensembles de donnes client, voir chapitre 23, Utilisation densembles de donnes client. Pour plus dinformations sur TDataSetProvider, voir chapitre 24, Utilisation des composants fournisseur.
Remarque
Chaque version de Delphi comprend ses propres pilotes daccs aux serveurs de bases de donnes par le biais de BDE, ADO ou dbExpress. Lorsque vous concevez une application de base de donnes, vous devez choisir lensemble de composants utiliser. Chaque mcanisme daccs aux donnes diffre par lventail des fonctions prises en charge, la facilit de dploiement et la capacit des pilotes grer divers serveurs de bases de donnes. Outre un mcanisme daccs aux donnes, vous devez choisir un serveur de bases de donnes. Il existe diffrents types de bases de donnes et vous devez prendre en considration les avantages et les inconvnients de chaque type avant de choisir un serveur de bases de donnes.
14-2
Guide du dveloppeur
Bien que tous ces types de bases de donnes contiennent des tables qui stockent des informations, certains prsentent certaines caractristiques telles que : Scurit des bases de donnes Transactions Intgrit rfrentielle, procdures stockes et dclencheurs
14-3
donnes locales (telles que Local InterBase) offrent galement un support de transaction mais bon nombre ne proposent que des mcanismes de verrouillage de fichiers tandis que certaines ne prsentent aucun support multi-utilisateur (tels que les fichiers densembles de donnes client). Quelle quantit de donnes les tables contiendront-elles ? Les serveurs de bases de donnes distants peuvent contenir davantage de donnes que les bases de donnes locales. Certains serveurs de bases de donnes distants sont conus pour stocker des quantits volumineuses de donnes tandis que dautres rpondent des impratifs diffrents (tels que la rapidit des mises jour). Quel type de performance (vitesse) attendez-vous de la base de donnes ? Les bases de donnes locales sont gnralement plus rapides que les serveurs de bases de donnes distants car elles rsident sur le mme systme. Chaque serveur de base de donnes distant tant conu pour un type dopration particulier, vous pouvez prendre en compte la question de la performance dans le choix du serveur. Quel est le type de support qui sera disponible pour ladministration des bases de donnes ? Les bases de donnes locales ne ncessitent pas autant de support que les serveurs de bases de donnes distants. Gnralement, leur cot de fonctionnement est infrieur car elles ne ncessitent pas de serveurs indpendants ni de licences de site onreuses.
14-4
Guide du dveloppeur
Si vous obligez les utilisateurs fournir un mot de passe, vous devez dterminer quel moment ce dernier est requis. Si vous utilisez une base de donnes locale mais envisagez de passer un serveur SQL plus important, vous pouvez inviter lutilisateur fournir son mot de passe au moment o il se connecte la base de donnes SQL plutt qu louverture des diffrentes tables. Si votre application requiert plusieurs mots de passe pour la connexion plusieurs bases de donnes ou systmes protgs, vous pouvez demander aux utilisateurs de fournir un mot de passe matre unique qui permet daccder une table de mots de passe requis par ces systmes. Lapplication fournit alors les mots de passe par programmation, sans que les utilisateurs aient besoin de fournir plusieurs mots de passe. Dans les applications multiniveaux, vous pouvez utiliser un modle de scurit diffrent. Vous pouvez utiliser HTTPs, CORBA ou COM+ pour contrler laccs aux niveaux intermdiaires et laisser ces derniers grer tous les dtails relatifs laccs aux serveurs de bases de donnes.
Transactions
Une transaction est un groupe dactions qui doivent tre menes avec succs sur une ou plusieurs tables dans une base de donnes avant dtre valides (rendues dfinitives). Si lune des actions du groupe choue, toutes les actions sont abandonnes (annules). Les transactions garantissent ce qui suit : Toutes les mises jour dune mme transaction sont soit valides, soit annules et ramenes leur tat prcdent. Cest ce que nous appelons atomicit . Une transaction est une transformation valide de ltat dun systme, en maintenant les constantes de cet tat. Cest ce que nous appelons cohrence. Les transactions simultanes ne voient pas les rsultats partiels et non valids les unes des autres afin de ne pas crer dincohrences dans ltat de lapplication. Cest ce que nous appelons isolation. Les mises jour valides des enregistrements survivent aux pannes, y compris les pannes de communication, les pannes de processus et les pannes systme des serveurs. Cest ce que nous appelons durabilit. Les transactions protgent ainsi contre les dfaillances matrielles qui se produisent au milieu dune commande de base de donnes ou dun ensemble de commandes. Louverture dune transaction vous permet de bnficier dun tat durable aprs les pannes survenues sur les supports disque. Les transactions constituent aussi la base du contrle simultan de plusieurs utilisateurs sur les serveurs SQL. Lorsque tous les utilisateurs interagissent avec la base de donnes par le biais de transactions, les commandes dun utilisateur ne peuvent pas altrer lunit dune transaction dun autre utilisateur ; le serveur SQL planifie les transactions entrantes, qui russissent ou chouent en bloc.
14-5
Bien que le support des transactions ne fasse pas partie de la plupart des bases de donnes locales, il est fourni par InterBase local. En outre, les pilotes du moteur de bases de donnes Borland offrent pour certaines un support des transactions limit. Le support des transactions de bases de donnes est fourni par le composant qui reprsente la connexion la base de donnes. Pour plus de dtails sur la gestion des transactions laide dun composant connexion de base de donnes, voir Gestion des transactions la page 17-6. Dans les applications multiniveaux, vous pouvez crer des transactions qui comprennent des actions autres que des oprations de bases de donnes ou qui englobent plusieurs bases de donnes. Pour plus de dtails sur lutilisation des transactions dans les applications multiniveaux, voir Gestion des transactions dans les applications multiniveaux la page 25-21.
14-6
Guide du dveloppeur
Structure gnrale
Bien quil existe de nombreuses faons dorganiser les composants dune application de base de donnes, la plupart dentre elles suivent le schma gnral illustr par la figure suivante :
Figure 14.1 Architecture de base de donnes g nrique
Module de donnes
Si vous avez isol votre interface utilisateur dans sa propre fiche, vous pouvez utiliser un module de donnes afin dy placer les composants qui reprsentent les informations de bases de donnes (ensembles de donnes), et les composants qui connectent ces ensembles de donnes aux autres lments de votre application. Comme les fiches de linterface utilisateur, les modules de donnes peuvent figurer dans le rfrentiel dobjets en vue dtre rutiliss ou partags par les applications.
Source de donnes
Le premier lment du module de donnes est une source de donnes. La source de donnes relie linterface utilisateur un ensemble de donnes qui reprsente les informations dune base de donnes. Plusieurs contrles orients donnes disposs sur une fiche peuvent partager une mme source de donnes. Dans ce
14-7
cas, le contenu de chaque contrle est synchronis : lorsque lutilisateur parcourt les enregistrements, les valeurs figurant dans les diffrents champs de lenregistrement actif sont affiches dans les contrles correspondants.
Ensemble de donnes
Lensemble de donnes constitue le cur de votre application de base de donnes. Ce composant reprsente un ensemble denregistrements de la base de donnes sous-jacente. Ces enregistrements peuvent tre les donnes dune seule table de base de donnes, un sous-ensemble des champs ou des enregistrements dune table ou des informations manant de plusieurs tables jointes en une vue unique. Lutilisation densembles de donnes protge la logique de votre application de la restructuration des tables physiques de la base de donnes. Lorsque la base de donnes sous-jacente change, vous pouvez tre amen modifier la faon dont le composant ensemble de donnes spcifie les donnes quil contient, mais le reste de votre application peut continuer fonctionner sans subir de modifications. Pour plus dinformations sur les proprits et mthodes courantes des ensembles de donnes, voir chapitre 18, Prsentation des ensembles de donnes.
14-8
Guide du dveloppeur
Chaque type densemble de donnes utilise son propre type de composant connexion, qui reprsente un mcanisme daccs aux donnes unique : Si lensemble de donnes est un ensemble de donnes BDE tel que TTable, TQuery ou TStoredProc, le composant connexion est un objet TDataBase. Vous connectez lensemble de donnes au composant base de donnes en dfinissant sa proprit Database. Vous navez pas besoin dajouter explicitement un composant base de donnes lorsque vous utilisez un ensemble de donnes BDE. Si vous dfinissez la proprit DatabaseName de lensemble de donnes, un composant base de donnes est automatiquement cr lexcution. Si lensemble de donnes est un ensemble de donnes ADO tel que TADODataSet , TADOTable, TADOQuery ou TADOStoredProc, le composant connexion est un objet TADOConnection. Vous connectez lensemble de donnes au composant connexion ADO en dfinissant sa proprit ADOConnection. Comme pour les ensembles de donnes BDE, vous navez pas besoin dajouter explicitement le composant connexion : par contre, vous pouvez dfinir la proprit ConnectionString de lensemble de donnes.
14-9
Si lensemble de donnes est un ensemble de donnes dbExpress tel que TSQLDataSet, TSQLTable, TSQLQuery ou TSQLStoredProc, le composant connexion est un objet TSQLConnection. Vous connectez lensemble de donnes au composant connexion SQL en dfinissant sa proprit SQLConnection. Lorsque vous utilisez des ensembles de donnes dbExpress, vous devez explicitement ajouter le composant connexion. En outre, les ensembles de donnes dbExpress prsentent la particularit dtre toujours unidirectionnels et accessibles en lecture seule : cela signifie que vous pouvez uniquement parcourir les enregistrements dans lordre et que vous ne pouvez pas utiliser les mthodes ddition des ensembles de donnes. Si lensemble de donnes est un ensemble de donnes InterBase Express tel que TIBDataSet, TIBTable, TIBQuery ou TIBStoredProc, le composant connexion est un objet TIBDatabase. Vous connectez lensemble de donnes au composant base de donnes InterBase en dfinissant sa proprit Database. Comme dans le cas des ensembles de donnes dbExpress, vous devez explicitement ajouter le composant connexion. Outre les composants prcdemment cits, vous pouvez utiliser un ensemble de donnes client spcialis tel que TBDEClientDataSet, TSQLClientDataSet ou TIBClientDataSet avec un composant connexion de base de donnes. Lorsque vous utilisez lun de ces ensembles de donnes client, spcifiez le type appropri de composant connexion comme valeur de la proprit DBConnection . Bien que chaque type densemble de donnes utilise un composant connexion diffrent, ils effectuent tous la plupart des mmes tches et mettent disposition la plupart des mmes proprits, mthodes et vnements. Pour plus dinformations sur les points communs des diffrents composants connexion de base de donnes, voir chapitre 17, Connexion aux bases de donnes. Cette architecture reprsente une application niveau unique ou une application niveau double, selon que le serveur de base de donn es est une base de donnes locale ou un serveur de base de donnes distant. La logique qui manipule les informations de bases de donnes figure dans lapplication qui implmente linterface utilisateur, tout en tant confine dans un module de donnes.
Remarque
Toutes les versions de Delphi ne proposent pas les pilotes ou composants connexion requis pour crer des applications niveau double.
14-10
Guide du dveloppeur
Lorsque vous utilisez cette approche base de fichiers, votre application crit les modifications sur disque laide de la mthode SaveToFile de lensemble de donnes client. SaveToFile accepte un paramtre, le nom du fichier qui est cr (ou cras) et qui contient la table. Lorsque vous souhaitez lire une table prcdemment crite laide de la mthode SaveToFile, utilisez la mthode LoadFromFile. LoadFromFile accepte aussi un paramtre, le nom du fichier contenant la table. Si vous chargez les donnes toujours partir du mme fichier et les y enregistrez toujours, vous pouvez utiliser la proprit FileName au lieu des mthodes SaveToFile et LoadFromFile. Lorsque FileName a pour valeur un nom de fichier valide, les donnes sont automatiquement charges partir du fichier louverture de lensemble de donnes client et enregistres dans le fichier la fermeture de lensemble de donnes client. Cette architecture simple de type fichier est une application niveau unique. La logique qui manipule les informations de bases de donnes figure dans lapplication qui implmente linterface utilisateur, tout en tant confine dans un module de donnes. Lapproche de type fichier prsente lavantage de la simplicit. Aucun serveur de bases de donnes ne doit tre install, configur ou dploy (si vous neffectuez pas de liaison statique dans midaslib.dcu, lensemble de donnes client requiert midas.dll). Aucune licence de site ni administration de base de donn es nest ncessaire. En outre, certaines versions de Delphi vous permettent de raliser des conversions entre des documents XML arbitraires et les paquets de donnes utiliss par un ensemble de donnes client. Par consquent, lapproche base de fichiers permet dutiliser des documents XML ainsi que des ensembles de donnes ddis. Pour plus dinformations sur la conversion entre des documents XML et des paquets de donnes densemble de donnes client, voir chapitre 26, Utilisation de XML dans les applications de bases de donnes. Lapproche base de fichiers ne gre pas les situations multi-utilisateurs. Lensemble de donnes doit tre totalement ddi lapplication. Les donnes sont enregistres dans des fichiers sur disque puis charg es ultrieurement, mais aucune protection intgre nempche un utilisateur dcraser les fichiers de donnes dun autre utilisateur.
14-11
Pour plus dinformations sur lutilisation dun ensemble de donnes client dont les donnes sont stockes sur disque, voir Utilisation dun ensemble de donnes client avec des donnes bases sur des fichiers la page 23-39.
14-12
Guide du dveloppeur
Malgr son caractre quelque peu complexe, cette approche savre parfois opportune : Lensemble de donnes source et le fournisseur densemble de donnes tant externes, vous pouvez plus facilement contrler la faon dont ils lisent les donnes et appliquent les mises jour. Par exemple, le composant fournisseur met disposition une srie dvnements qui ne sont pas disponibles lorsque vous utilisez un ensemble de donnes client spcialis pour accder aux donnes. Lorsque lensemble de donnes source est externe, vous pouvez le lier un autre ensemble de donnes dans une relation matre/dtail. Un fournisseur externe convertit automatiquement cette organisation en un seul ensemble de donnes comprenant des dtails imbriqus. Lorsque lensemble de donnes source est interne, vous ne pouvez pas crer densembles dtail imbriqus de cette faon. La connexion dun ensemble de donnes client un ensemble de donnes externe est une architecture qui peut facilement voluer vers une architecture multiniveau. Etant donn que le processus de dveloppement est dautant plus coteux et consommateur dnergie que le nombre de niveaux augmente, vous pouvez commencer dvelopper votre application en tant quapplication niveau unique ou double. A mesure quaugmenteront la quantit de donnes, le nombre dutilisateurs et le nombre des diffrentes applications accdant aux donnes, vous serez ventuellement amen adopter une architecture multiniveau. Si vous pensez utiliser terme une architecture multiniveau, il peut tre judicieux de commencer en utilisant un ensemble de donnes client avec un ensemble de donnes source externe. Ainsi, lorsque vous transfrez vers un niveau intermdiaire la logique de laccs et de la manipulation des donnes, le dveloppement effectu est protg car le code est rutilisable mesure que lapplication prend de lampleur. TClientDataSet peut tre li tout ensemble de donnes source. Cela signifie que vous pouvez utiliser des ensembles de donnes personnaliss (composants tierces parties) pour lesquels nexiste aucun ensemble de donnes client spcialis correspondant. Certaines versions de Delphi incluent mme des composants fournisseur spciaux qui connectent un ensemble de donnes client un document XML plutt qu un autre ensemble de donnes. (Cela fonctionne de la mme faon que la connexion dun ensemble de donnes client un autre ensemble de donnes (source), la diffrence que le fournisseur XML utilise un document XML la place dun ensemble de donnes. Pour plus dinformations sur ces fournisseurs XML, voir Utilisation dun document XML comme source pour un fournisseur la page 26-9.) Larchitecture qui connecte un ensemble de donnes client un ensemble de donnes externe se prsente sous deux versions : Connexion dun ensemble de donnes client un autre ensemble de donnes dans la mme application. Utilisation dune architecture multiniveau.
14-13
Connexion dun ensemble de donnes client un autre ensemble de donnes dans la mme application
Le fait dutiliser un composant fournisseur vous permet de vous connecter TClientDataSet un autre ensemble de donnes (source). Le fournisseur assemble les informations de bases de donnes en paquets de donnes transportables (utilisables par les ensembles de donnes client) et applique un serveur de base de donnes les mises jour reues dans les paquets delta (que les ensembles de donnes client crent). Cette architecture est illustre par la figure suivante :
Figure 14.4 Architecture combinant un ensemble de donnes client et un autre ensemble de donnes
Cette architecture reprsente une application niveau unique ou une application niveau double, selon que le serveur de base de donn es est une base de donnes locale ou un serveur de base de donnes distant. La logique qui manipule les informations de bases de donnes figure dans lapplication qui implmente linterface utilisateur, tout en tant confine dans un module de donnes. Pour lier lensemble de donnes client au fournisseur, attribuez sa proprit ProviderNamele nom du composant fournisseur. Le fournisseur doit se trouver dans le mme module de donnes que lensemble de donnes client. Pour lier le fournisseur lensemble de donnes source, dfinissez sa proprit DataSet. Une fois que lensemble de donnes client est li au fournisseur et que celui-ci est li lensemble de donnes source, ces composants grent automatiquement tous les aspects inhrents la lecture, laffichage et lexploration des enregistrements de bases de donnes (sous rserve que lensemble de donnes source soit connect une base de donnes). Pour appliquer les modifications
14-14
Guide du dveloppeur
utilisateur la base de donnes, vous devez uniquement appeler la mthode ApplyUpdates de lensemble de donnes client. Pour plus dinformations sur lutilisation dun ensemble de donnes client avec un fournisseur, voir Utilisation dun ensemble de donnes client avec un fournisseur la page 23-29.
La figure prcdente reprsente une application trois niveaux. La logique qui manipule les informations de bases de donnes se trouve sur un systme indpendant, ou niveau. Ce niveau intermdiaire centralise la logique qui gouverne les interactions avec votre base de donnes et offre ainsi un contrle centralis des relations entre les donnes. Cela permet diffrentes applications clientes dutiliser les mmes donnes tout en garantissant lhomognit de la
14-15
logique des donnes. Les applications multiniveaux autorisent aussi les applications clientes de taille rduite car la majeure partie du traitement est dplace vers le niveau intermdiaire. Ces applications clientes de taille rduite sont plus faciles installer, configurer et grer. Les applications multiniveaux peuvent aussi amliorer les performances en rpartissant le traitement des donnes sur plusieurs systmes. Larchitecture multiniveau sapparente beaucoup au modle prcdent. Elle sen distingue essentiellement par le fait que lensemble de donnes source, qui se connecte au serveur de base de donnes, et le fournisseur, qui fait office dintermdiaire entre cet ensemble de donnes source et lensemble de donnes client, ont tous les deux t dplacs vers une application spare. Cette application est appele serveur dapplications (ou parfois courtier ou agent des donnes distantes). tant donn que le fournisseur a t dplac vers une application spare, lensemble de donnes client ne peut plus se connecter lensemble de donnes source en dfinissant simplement sa proprit ProviderName. En outre, il doit utiliser un type de composant connexion pour rechercher le serveur dapplications et sy connecter. Plusieurs types de composants connexion peuvent connecter un ensemble de donnes client un serveur dapplications. Ils drivent tous de TCustomRemoteServer et diffrent essentiellement par le protocole de communication utilis (TCP/IP, HTTP, DCOM, SOAP, ou CORBA). Liez lensemble de donnes client son composant connexion en dfinissant la proprit RemoteServer. Le composant connexion tablit une connexion au serveur dapplications et renvoie une interface que lensemble de donnes client utilise pour appeler le fournisseur spcifi par sa proprit ProviderName. Chaque fois que lensemble de donnes client appelle le serveur dapplications, il transmet la valeur de ProviderName puis le serveur dapplications transmet lappel au fournisseur. Pour plus dinformations sur la connexion dun ensemble de donnes client un serveur dapplications, voir chapitre 25, Cration dapplications multiniveaux.
14-16
Guide du dveloppeur
est appel modle briefcase (ou parfois modle dconnect ou informatique nomade). Le modle briefcase peut, par exemple, savrer utile dans la situation suivante : la base de donnes sur site dune entreprise contient des informations de contacts clients que les reprsentants peuvent utiliser et mettre jour lextrieur de lentreprise. Ils peuvent tlcharger des informations partir de la base de donnes, exploiter ces donnes sur leurs ordinateurs portables pendant quils sont en dplacement dans tout le pays, et mme mettre jour des enregistrements sur des sites existants ou de nouveaux sites. Quand les reprsentants reviennent dans lentreprise, ils doivent charger leurs changements de donnes dans la base de donnes de lentreprise pour les mettre la disposition de tous. Lors dune opration sur site, lensemble de donnes client dune application de modle briefcase obtient ses donnes dun fournisseur. Lensemble de donnes client est ensuite connect au serveur de base de donnes et peut, par le biais du fournisseur, rcuprer des donnes du serveur et lui communiquer des mises jour. Avant de se dconnecter du fournisseur, lensemble de donnes client enregistre sa capture instantane des informations dans un fichier sur disque. Hors site, lensemble de donnes client charge ses donnes partir du fichier et enregistre toute modification dans ce fichier. Dans une dernire phase, une fois de nouveau sur site, lensemble de donnes client se reconnecte au fournisseur afin dappliquer ses mises jour au serveur de base de donnes ou dactualiser sa capture instantane des donnes.
14-17
page 28-18. En outre, vous pouvez combiner lapproche Web et larchitecture multiniveau, comme dcrit dans Ecriture des applications client Web la page 25-36.
Ecriture de rapports
Si vous souhaitez que les utilisateurs puissent imprimer les informations de bases de donnes manant des ensembles de donnes de votre application, vous pouvez utiliser les composants rapport de la page QReport de la palette des composants. Lutilisation de ces composants vous permet de construire visuellement des rapports bandes pour prsenter et rsumer les informations contenues dans vos tables de bases de donnes. Vous pouvez ajouter des rsums aux en-ttes et aux pieds de page de groupe pour analyser les donnes en fonction de critres de regroupement. Dmarrez un rapport pour votre application en slectionnant licne QuickReport dans la bote de dialogue Nouveaux lments. Slectionnez Fichier|Nouveau dans le menu principal et allez la page Affaires. Double-cliquez sur licne Expert QuickReport pour lancer lexpert.
Remarque
Pour un exemple dutilisation des composants de la page QReport, reportez-vous au programme exemple QuickReport livr avec Delphi.
14-18
Guide du dveloppeur
15
Chapitre 15
Chapitre
La page ContrleBD de la palette des composants offre un ensemble de contrles orients donnes qui reprsentent les donnes de champs dun enregistrement de base de donnes et qui permettent aux utilisateurs de modifier ces donnes et de rpercuter ces modifications dans la base de donnes si lensemble de donnes le permet. Lutilisation de contrles de donnes sur les fiches de votre application de base de donnes vous permet de construire linterface utilisateur de celle-ci de sorte que ces informations soient visibles et accessibles aux utilisateurs. Les contrles orients donnes que vous ajoutez votre interface utilisateur dpendent notamment des facteurs suivants : Le type de donnes que vous affichez. Vous avez le choix entre les contrles qui permettent dafficher et de modifier du texte brut, ceux conus pour le texte format, ceux destins aux lments multimdia ou aux graphiques, etc. Les contrles qui affichent diffrents types dinformations sont dcrits dans Affichage dun seul enregistrement la page 15-8. Lorganisation des informations. Vous pouvez afficher les informations dun seul enregistrement ou, laide dune grille, rpertorier les donnes manant de plusieurs enregistrements. Le paragraphe Choix de lorganisation des donnes la page 15-8 dcrit certaines possibilits. Le type densemble de donnes qui fournit les donnes aux contrles. Vous pouvez utiliser des contrles qui refltent les limites de lensemble de donnes sous-jacent. Par exemple, lutilisation dune grille avec un ensemble de donnes unidirectionnel ne serait pas fonde car les ensembles de donnes unidirectionnels ne peuvent fournir quun enregistrement la fois. Eventuellement, la faon dont vous souhaitez que les utilisateurs puissent naviguer dans les enregistrements ou les ensembles de donnes pour y ajouter ou y modifier des donnes. Vous pouvez ajouter vos propres contrles ou mcanismes de navigation et de modification ou utiliser un contrle intgr tel quun navigateur de donnes. Pour plus dinformations sur lutilisation dun
15-1
Des contrles orients donnes daide la dcision plus complexes sont prsents dans le chapitre 16, Utilisation de composants daide la dcision. Quels que soient les contrles orients donnes que vous choisissez dajouter votre interface, ils prsentent certaines fonctionnalits communes, dcrites ciaprs.
Les contrles orients donnes vous permettent dafficher et dditer des champs associs lenregistrement en cours dun ensemble de donnes. Le tableau suivant dresse la liste des contrles de donnes apparaissant sur la page ContrleBD de la palette des composants.
Tableau 15.1 Contr les de donnes
TDBGrid
TDBNavigator
TDBCheckBox
15-2
Guide du dveloppeur
TDBCtrlGrid TDBRichEdit
Les contrles sont orients donnes au moment de la conception. Lorsque vous associez le contrle orient donnes un ensemble de donnes actif lors de la construction dune application, vous pouvez voir immdiatement les donnes relles dans le contrle. En phase de conception, vous pouvez utiliser lditeur de champs pour parcourir un ensemble de donnes afin de vrifier que votre application affiche les donnes correctement sans quil soit ncessaire de la compiler ou de lexcuter. Pour plus dinformations sur lditeur de champs, voir la section Cration de champs persistants la page 19-4. Lors de lexcution, les contrles orients donnes affichent galement des donnes et permettent leur dition si le contrle, lapplication et lensemble de donnes auxquels votre application est connecte lautorisent.
Les composants source de donnes sont galement ncessaires pour lier les ensembles de donnes non imbriqus dans les relations matre-dtail. Pour associer un contrle de donnes un ensemble de donnes,
1 Placez un ensemble de donnes dans un module de donnes ou sur une fiche et dfinissez ses proprits. 2 Placez une source de donnes dans le mme module de donnes ou sur la mme fiche. A laide de linspecteur dobjets, attribuez sa proprit DataSet lensemble de donnes plac ltape 1.
15-3
3 Depuis longlet AccsBD de la palette des composants, placez un contrle de donnes sur une fiche. 4 A laide de linspecteur dobjets, attribuez la proprit DataSource du contrle le composant source de donnes plac ltape 2. 5 Donnez la proprit DataField du contrle le nom du champ afficher, ou bien slectionnez un champ dans la liste droulante. Cette tape ne sapplique pas aux contrles TDBGrid, TDBCtrlGrid et TDBNavigator, car ils accdent tous les champs disponibles dans un ensemble de donnes. 6 Pour afficher des donnes dans le contrle, mettez la proprit Active de lensemble de donnes True.
Vous pouvez galement attribuer la proprit DataSet un ensemble de donnes appartenant une autre fiche afin de synchroniser les contrles de donnes des deux fiches. Par exemple :
procedure TForm2.FormCreate (Sender : TObject); begin DataSource1.Dataset := Form1.Table1; end;
15-4
Guide du dveloppeur
Pour plus dinformations sur les tats des ensembles de donnes, voir D termination des tats dun ensemble de donnes la page 18-3.
Les ensembles de donnes unidirectionnels ne permettent jamais aux utilisateurs dditer et de mettre jour les donnes.
15-5
La possibilit pour un ensemble de donnes de mettre jour des donnes dpend de la table de base de donnes sous-jacent. Mme si la proprit CanModify de lensemble de donnes vaut True, la proprit Enabled de la source de donnes qui connecte lensemble de donnes au contrle doit galement valoir True afin que le contrle puisse valider les mises jour dans la table de base de donnes. La proprit Enabled de la source de donnes dtermine si le contrle peut afficher les valeurs de champ partir de lensemble de donnes et, par consquent, si un utilisateur peut modifier et valider les valeurs. Si Enabled vaut True (valeur par dfaut), les contrles peuvent afficher les valeurs de champ. Enfin, vous pouvez mme dterminer si lutilisateur peut apporter des modifications aux donnes affiches dans le contrle. La proprit ReadOnly du contrle de donnes dtermine si un utilisateur peut modifier les donnes affiches par le contrle. Si elle vaut False (valeur par dfaut), les utilisateurs peuvent modifier les donnes. Il est logique dappliquer doffice la proprit ReadOnly du contrle la valeur True lorsque la proprit CanModify de lensemble de donnes a pour valeur False. Sinon, vous donnez aux utilisateurs la fausse impression quils peuvent affecter les donnes de la table de base de donnes sous-jacente. Dans tous les contrles orients donnes, lexception de TDBGrid, les modifications dun champ sont copies dans lensemble de donnes sous-jacent quand vous appuyez sur Tab depuis le contrle. Si vous appuyez sur la touche Echap avant dappuyer sur Tab dans un champ, les modifications sont abandonnes et le champ reprend sa valeur initiale.
15-6
Guide du dveloppeur
Avec le composant TDBGrid, les modifications sont valides au moment o vous passez un enregistrement diffrent ; vous pouvez appuyer sur Echap dans nimporte quel champ dun enregistrement avant de passer un autre enregistrement pour annuler une modification. Lorsquun enregistrement est crit, Delphi vrifie si le statut des contrles orients donnes associs lensemble de donnes a t modifi. En cas de problme de mise jour dun champ contenant des donnes modifies, Delphi provoque une exception et aucune modification nest apporte lenregistrement.
Remarque
si votre application place les mises jour en mmoire cache (par exemple, laide dun ensemble de donnes client), toutes les modifications sont crites dans un cache interne. Ces modifications ne sont pas appliques la table de base de donnes sous-jacente tant que vous nappelez pas la mthode ApplyUpdates de lensemble de donnes.
15-7
15-8
Guide du dveloppeur
informations peuvent provenir dun seul enregistrement dun ensemble de commandes. Les applications qui affichent un seul enregistrement sont gnralement faciles lire et comprendre car toutes les informations de bases de donnes concernent le mme lment (la mme commande dans le cas prcdent). Les contrles orients donnes contenus dans ces interfaces utilisateur reprsentent un seul champ dun enregistrement de base de donnes. La page ContrleBD de la palette des composants offre un large choix de contrles pour la reprsentation des diffrents types de champs. Ces contrles sont gnralement les versions orientes donnes de contrles disponibles sur la palette des composants. Par exemple, le contrle TDBEdit est une version oriente donnes du contrle TEdit standard qui permet aux utilisateurs de visualiser et dditer une chane texte. Le type de donnes contenu dans le champ (texte, texte format, graphique, informations boolennes, etc.) dtermine le contrle utilis.
Lorsque vous placez un composant TDBText sur une fiche, vrifiez que sa proprit AutoSize est True (la valeur par dfaut) ; vous garantissez ainsi que le contrle se redimensionne automatiquement pour afficher des donnes de largeur variable. Si AutoSize vaut False, et le contrle trop troit, les donnes affiches seront tronques.
15-9
Par exemple, supposons que CustomersSource est un composant TDataSource actif et li un objet TClientDataSet ouvert appel CustomersTable. Vous pouvez placer un composant TDBEdit sur une fiche et dfinir ses proprits comme suit : DataSource: CustomersSource DataField: CustNo Le composant zone de saisie oriente donnes affiche immdiatement la valeur de la colonne CustNo de la ligne en cours dans lensemble de donnes CustomersTable, tant au moment de la conception que de lexcution.
15-10
Guide du dveloppeur
TDBRichEdit est dot de proprits et de mthodes permettant dentrer et de manipuler du texte format. Toutefois, il noffre pas une interface utilisateur mettant ces options de formatage la disposition de lutilisateur. Cest votre application qui doit implmenter linterface utilisateur permettant daccder aux fonctions de texte format. Par dfaut, TDBRichEdit permet lutilisateur dditer du texte mmo format. Pour empcher ldition, mettez la proprit ReadOnly du contrle diteur de texte format True. Pour afficher les tabulations et permettre aux utilisateurs dentrer des tabulations dans le mmo, mettez la proprit WantTabs True. Pour limiter le nombre de caractres pouvant tre saisis par les utilisateurs dans un mmo de base de donnes, utilisez la proprit MaxLength. Par dfaut, MaxLength vaut 0, ce qui signifie quil ny a aucune limite, en dehors de celles du systme dexploitation, au nombre de caractres pouvant tre saisi. Comme TDBRichEdit peut contenir de grands volumes de donnes, il faut parfois beaucoup de temps pour afficher les donnes lexcution. Pour acclrer le dfilement des enregistrements, TDBRichEdit a une proprit AutoDisplay qui contrle si les donnes auxquelles il accde doivent tre affiches automatiquement. Si AutoDisplay est False, TDBRichEdit affiche le nom du champ la place des donnes. Pour visualiser les donnes, il suffit de doublecliquer lintrieur du contrle.
15-11
Au moment de lexcution, les utilisateurs peuvent lancer une recherche incrmentale pour trouver des lments dans une bote liste. Lorsque le contrle a la focalisation, le fait quun utilisateur tape ROB par exemple, provoque la slection du premier lment de la bote liste commenant par ces lettres. Sil ajoute un E, le premier lment commenant par les lettres ROBE est slectionn, par exemple Robert Johnson. La recherche neffectue pas de distinction majuscules/minuscules. Les touches Retour arrire et Echap permettent dannuler la recherche de la chane (mais laissent la slection intacte), linstar dune pause de deux secondes entre deux frappes.
15-12
Guide du dveloppeur
Pour TDBListBox, la proprit Height dtermine le nombre dlments simultanment visibles dans la bote liste. La proprit IntegralHeight contrle laffichage du dernier lment. Si IntegralHeight vaut False (valeur par dfaut), la base de la bote liste est dtermine par la proprit ItemHeight et le dernier lment est susceptible de napparatre que partiellement. Si IntegralHeight a pour valeur True, le dernier lment visible de la bote liste saffiche entirement. Pour TDBComboBox, la proprit Style dtermine linteraction de lutilisateur avec le contrle. Par dfaut, Style est csDropDown, ce qui signifie que lutilisateur peut entrer des valeurs au clavier ou bien choisir un lment dans la liste droulante. Les proprits suivantes dterminent laffichage de la liste Items lexcution : Style dtermine le style daffichage du composante la bote options : csDropDown (valeur par dfaut) : affiche une liste droulante avec une zone de saisie o lutilisateur peut entrer du texte. Tous les lments sont des chanes de mme hauteur. csSimple : combine un contrle de saisie une liste dlments de taille fixe systmatiquement affiche. Quand Style a la valeur csSimple, assurez-vous daugmenter la proprit Height afin de pouvoir afficher la liste. csDropDownList : affiche une bote liste et une zone de saisie, mais lutilisateur ne peut ni saisir ni modifier les valeurs qui ne figurent pas dans la liste droulante au moment de lexcution. csOwnerDrawFixed et csOwnerDrawVariable : permettent la liste des lments dafficher des valeurs autres que des chanes (par exemple, des images bitmap) ou dutiliser des fontes diffrentes pour les lments de la liste. DropDownCount : nombre maximum dlments affichs dans la liste. Si le nombre dlments (Items) est suprieur DropDownCount, lutilisateur peut faire dfiler la liste. Si le nombre dlments (Items) est infrieur DropDownCount, la liste est suffisamment grande pour afficher tous les lments (Items). ItemHeight : hauteur de chaque lment lorsque le style a pour valeur csOwnerDrawFixed. Sorted : si la valeur est True, la liste des lments (Items) est affiche dans lordre alphabtique.
Affichage dans une bote liste de rfrence et une bote options de rfrence
Les botes liste de rfrence et les botes options de rfrence (TDBLookupListBox et TDBLookupComboBox) proposent lutilisateur une liste limite de choix partir desquels il peut dfinir une valeur de champ correcte. Lorsquil slectionne un lment dans la liste, la valeur de champ correspondante est remplace dans lensemble de donnes sous-jacent. Prenons lexemple dun bon de commande dont les champs sont lis OrdersTable. OrdersTable contient un champ CustNo correspondant un numro dID client, mais OrdersTable ne contient aucune autre information sur le client.
15-13
CustomersTable, en revanche, contient un champ CustNo correspondant un numro dID client ainsi que des informations supplmentaires, telles que lentreprise et ladresse du client. Lors de la facturation, il serait pratique que le bon de commande permette un employ de slectionner un client daprs le nom de lentreprise au lieu de lID client. Un composant TDBLookupListBox affichant le nom de toutes les entreprises dans CustomersTable permettra un utilisateur de slectionner le nom de lentreprise dans la liste et de placer CustNo sur le bon de commande. Ces contrles de rfrence drivent la liste dlments daffichage depuis lune des deux sources suivantes : Un champ de rfrence dfini pour un ensemble de donnes. Pour sp cifier les lments dune bote liste laide dun champ de rfrence, lensemble de donnes auquel vous liez le contrle doit dj dfinir un champ de rfrence. (Ce processus est dcrit dans Dfinition dun champ de rfrence la page 19-10). Pour spcifier le champ de rfrence pour les lments dune bote liste,
1 Affectez la proprit DataSource de la bote liste la source de donnes de lensemble de donnes contenant le champ de rfrence utiliser. 2 Choisissez le champ de rfrence utiliser dans la liste droulante de la proprit DataField.
Lorsque vous activez une table associe un contrle de rfrence, il identifie son champ de donnes en tant que champ de rfrence et affiche les valeurs appropries. Une cl, un champ de donnes et une source de donnes secondaires. Si vous navez pas dfini de champ de rfrence pour un ensemble de donnes, vous pouvez tablir une relation de mme type laide dune source de donnes secondaire, dune valeur de champ rechercher dans la source de donnes secondaire et dune valeur de champ renvoyer comme lment de liste. Pour spcifier une source de donnes secondaire pour les lments dune bote liste,
3 Affectez la proprit DataSource de la bote liste la source de donnes du contrle. 4 Choisissez un champ pour insrer les valeurs de rfrence depuis la liste droulante de la proprit DataField. Le champ choisi ne doit pas tre un champ de rfrence. 5 Affectez la proprit ListSource de la bote liste la source de lensemble de donnes contenant le champ dont vous voulez rfrencer les valeurs. 6 Pour la proprit KeyField , choisissez dans la liste droulante un champ utiliser comme cl de rfrence. La liste droulante affiche les champs de lensemble de donnes associ la source de donnes spcifie ltape 3. Le champ choisi na pas besoin de faire partie dun index, mais si cest le cas, les performances en seront amliores. 7 Dans la liste droulante de la proprit ListField, choisissez un champ dont les valeurs sont renvoyer. Cette liste droulante affiche les champs de
15-14
Guide du dveloppeur
lensemble de donnes associ la source que vous avez spcifie ltape 3. Lorsque vous activez une table associe un contrle de rfrence, il reconnat que les lments de sa liste sont drivs dune source secondaire et affiche des valeurs issues de celle-ci. Pour dfinir le nombre dlments simultanment affichs dans un contrle TDBLookupListBox, utilisez la proprit RowCount. La hauteur de la bote liste sadapte au nombre de lignes dfini. Pour dfinir le nombre dlments affichs dans la liste droulante de TDBLookupComboBox, utilisez la proprit DropDownRows.
Remarque
Vous pouvez galement dfinir une colonne de grille de donnes pour quelle fonctionne comme une bote options de rfrence. Pour plus dinformations sur la manire de procder, voir Dfinition dune colonne de liste de rfrence la page 15-24.
Les valeurs des proprits ValueChecked et ValueUnchecked ne peuvent pas tre identiques. Donnez la proprit ValueChecked une valeur que le contrle doit crire dans la base de donnes sil est activ lorsque lutilisateur passe un autre enregistrement. Par dfaut, cette valeur est true, mais vous pouvez la changer en valeur alphanumrique en fonction de vos besoins. Vous pouvez galement entrer une liste dlments dlimits par des points-virgules comme valeur de ValueChecked. Si lun de ces lments correspond au contenu de ce champ dans lenregistrement en cours, la case est active. Par exemple, vous pouvez spcifier une chane ValueChecked comme :
DBCheckBox1.ValueChecked := True;Yes;On;
Si le champ de lenregistrement en cours contient des valeurs true, Yes ou On, cest que la case est active. Aucune distinction majuscules/minuscules nest effectue pendant la comparaison du champ avec les chanes de ValueChecked. Si un utilisateur active une case cocher pour laquelle il y a plusieurs chanes ValueChecked, la premire est la valeur crite dans la base de donnes.
15-15
Donnez la proprit ValueUnchecked une valeur que le contrle doit crire dans la base de donnes sil nest pas activ lorsque lutilisateur passe un autre enregistrement. Par dfaut, cette valeur est dfinie comme false, mais vous pouvez lui donner nimporte quelle valeur alphanumrique en fonction de vos besoins. Vous pouvez galement entrer une liste dlments dlimits par des points-virgules en tant que valeur de ValueUnchecked. Si lun des lments correspond au contenu de ce champ dans lenregistrement en cours, la case cocher nest pas active. Une case cocher oriente donnes est dsactive chaque fois que le champ de lenregistrement en cours ne contient pas lune des valeurs de la liste des proprits ValueChecked ou ValueUnchecked. Si le champ associ la case cocher est un champ logique, elle est toujours active lorsque le contenu du champ est True et dsactive sil est False. Dans ce cas, les chanes entres dans les proprits ValueChecked et ValueUnchecked sont sans effet sur les champs logiques.
Si le champ ne correspond aucune des chanes de la liste Items, il est toujours possible de slectionner un bouton radio lorsque le champ correspond une chane de la proprit Values. Si le champ de lenregistrement en cours ne correspond aucune des chanes dItems ou de Values, aucun bouton radio nest slectionn. La proprit Values peut contenir une liste facultative de chanes quil est possible de renvoyer lensemble de donnes quand lutilisateur slectionne un bouton radio et crit un enregistrement dans la base de donnes. Les chanes sont associes aux boutons dans un ordre numrique. La premire chane est associe au premier bouton, la seconde au second bouton et ainsi de suite. Par exemple, supposons que la proprit Items contienne Rouge, Jaune et Bleu et que Values contienne Magenta, Jaune et Cyan. Si un utilisateur slectionne le bouton libell Rouge, Magenta est crit dans la base de donnes.
15-16
Guide du dveloppeur
Si aucune chane na t fournie pour Values, la chane Item dun bouton radio slectionn est renvoye la base de donnes au moment o un enregistrement y est crit.
Vous ne pouvez pas afficher plusieurs enregistrements lorsque vous utilisez un ensemble de donnes unidirectionnel. Vous pouvez concevoir une interface utilisateur qui affiche la fois les champs dun mme enregistrement et les grilles qui reprsentent plusieurs enregistrements. Voici deux modles qui combinent ces deux approches : Fiches matre-dtail : Vous pouvez reprsenter les informations la fois dune table matre et dune table dtail en incluant la fois les contrles qui affichent un champ unique et les contrles grille. Par exemple, vous pouvez afficher les informations sur un client unique et une grille dtail qui affiche les commandes passes par ce client. Pour plus dinformations sur la liaison de tables sous-jacentes dans une fiche matre-dtail, voir Cration de relations matre/dtail la page 18-40 et Etablissement de relations matre/dtail en utilisant des paramtres la page 18-55. Fiches dtail : dans une fiche qui affiche plusieurs enregistrements, vous pouvez inclure des contrles champ unique qui affichent les informations dtailles de lenregistrement slectionn. Cette approche est particulirement utile lorsque les enregistrements incluent de long mmos ou des informations graphiques. Lorsque lutilisateur passe en revue les enregistrements de la grille, le mmo ou le graphique se met jour pour reprsenter la valeur de lenregistrement slectionn. La mise en place de ce dispositif est trs facile. La synchronisation entre les deux affichages est automatique si la grille et le contrle mmo ou image partagent une source de donnes commune.
Astuce
Il est gnralement prfrable de ne pas combiner ces deux approches sur une mme fiche. Il est gnralement dlicat pour les utilisateurs de comprendre les relations entre les donnes de telles fiches.
15-17
Indicateur denregistrement
Trois facteurs affectent laspect des enregistrements affichs dans un contrle grille : Lexistence dobjets colonne persistante dfinis pour la grille laide de lditeur de colonnes. Les objets colonne persistante offrent une grande flexibilit pour configurer des grilles et dfinir laspect des donnes. Pour plus dinformations sur lutilisation de colonnes persistantes, voir Cration dune grille personnalise la page 15-19. La cration de composants champs persistants pour lensemble de donnes affich dans la grille. Pour plus dinformations sur la cration de ces composants avec lditeur de champs, voir chapitre 19, Manipulation des composants champ . La dfinition du paramtre ObjectView de lensemble de donnes pour laffichage des champs ADT et tableau dans la grille. Voir Affichage des champs ADT et tableau la page 15-26. Le contrle grille dispose dune proprit Columns qui est lenveloppe dun objet TDBGridColumns. TDBGridColumns contient une collection dobjets TColumn reprsentant toutes les colonnes du contrle grille. Vous pouvez utiliser lditeur de colonnes pour configurer les attributs de colonnes lors de la phase de conception, ou bien utiliser la proprit Columns pour accder aux mthodes, vnements et proprits de TDBGridColumns lexcution.
15-18
Guide du dveloppeur
champs de lensemble de donnes de la grille ou, en labsence de composants champs persistants, par les valeurs daffichage par dfaut. Lorsque la proprit Columns.State de la grille vaut csDefault, les colonnes des grilles sont gnres dynamiquement partir des champs visibles de lensemble de donnes, et leur ordre dans la grille correspond celui des champs dans lensemble de donnes. Chaque colonne de la grille est associe un composant champ. Les modifications des proprits des composants champ sont immdiatement refltes dans la grille. Il peut tre utile dutiliser un contrle grille ayant des colonnes dynamiquement gnres pour afficher et modifier le contenu de certaines tables slectionnes lexcution. La structure de la grille ntant pas dfinie, elle peut changer en temps rel pour afficher diffrents ensembles de donnes. Une grille unique avec des colonnes dynamiquement gnres peut afficher une table Paradox un certain moment, puis les rsultats dune requte SQL lorsque sa proprit DataSource est modifie, ou lorsque la proprit DataSet de la source des donnes est modifie. Lapparence dune colonne dynamique peut tre modifie lors de la conception ou lexcution ; dans les deux cas, ce sont les proprits correspondantes du composant champ affich dans la colonne que vous modifiez. La dure des proprits des colonnes dynamiques correspond la priode o une colonne est associe un champ particulier dans un ensemble de donnes unique. Par exemple, la modification de la proprit Width dune colonne change la proprit DisplayWidth du champ associ cette colonne. Les modifications de proprits de colonnes non bases sur des proprits de champs, telles que la proprit Font, ne sont valides que pendant lexistence de ces colonnes. Si lensemble de donnes dune grille consiste en un ensemble de composants champs dynamiques, les champs sont dtruits ds la fermeture de lensemble de donnes. Lorsque les composants champs sont dtruits, les colonnes qui leur sont associes sont galement dtruites. Si lensemble de donnes dune grille consiste en un ensemble de composants champs persistants, les composants champs existent mme si lensemble de donnes est ferm, de telle sorte que toutes les colonnes associes ces champs gardent leurs proprits la fermeture de lensemble de donnes.
Remarque
Si la proprit Columns.State dune grille est mise csDefault lexcution, tous les objets colonnes de la grille sont supprims (mme les colonnes persistantes) et les colonnes dynamiques sont reconstruites partir des champs visibles dans lensemble de donnes de la grille.
15-19
modifier laspect de la grille lexcution sans affecter les champs utiliss par la grille, ou lordre des champs de lensemble de donnes. Lutilisation des grilles personnalises est conseille avec les ensembles de donnes dont la structure est connue pendant la phase de conception. Comme elles sattendent ce que les noms des champs dfinis la conception existent dans lensemble de donnes, les grilles personnalises ne sont pas adaptes si vous devez utiliser des tables arbitraires slectionnes lexcution.
Etant donn que les colonnes persistantes nont pas besoin dtre associes un champ dun ensemble de donnes, et tant donn que plusieurs colonnes peuvent rfrencer le mme champ, la valeur de la proprit FieldCount dune grille personnalise peut tre infrieure ou gale au nombre de colonnes dune grille. Notez galement que si la colonne slectionne dans la grille personnalise
15-20
Guide du dveloppeur
nest pas associe un champ, la proprit SelectedField de la grille est NULL et la proprit SelectedIndex est 1. Les colonnes persistantes peuvent tre configures pour afficher des cellules de grille sous forme de liste droulante dans une bote options de valeurs de rfrence provenant dun autre ensemble de donnes ou dune liste de choix statique, ou sous forme dun bouton points de suspension () dans une cellule, sur laquelle lutilisateur peut cliquer pour lancer des visionneurs de donnes spciaux ou des botes de dialogue en relation avec la cellule en cours.
1 Slectionnez le composant grille dans la fiche. 2 Appelez lditeur de colonnes en double-cliquant sur la proprit Columns de la grille dans linspecteur dobjets.
La bote liste des colonnes affiche les colonnes persistantes dfinies pour la grille slectionne. Lorsque vous ouvrez lditeur de colonnes pour la premire fois, cette liste est vide car la grille est dans son mode par dfaut et ne contient que des colonnes dynamiques. Vous pouvez crer des colonnes pour tous les champs dun ensemble de donnes en une seule fois, ou vous pouvez crer des colonnes persistantes sur une base individuelle. Pour crer des colonnes persistantes pour tous les champs :
1 Cliquez avec le bouton droit de la souris pour appeler le menu contextuel et choisissez la commande Ajouter tous les champs. Si la grille nest associe aucune source de donnes, Ajouter tous les champs est dsactive. Associez la grille avec une source de donnes ayant un ensemble de donnes actif avant de choisir cette commande. 2 Si la grille contient dj des colonnes persistantes, une bote de dialogue vous demande si vous souhaitez supprimer les colonnes existantes. Si vous rpondez Oui, toutes les informations existantes sur les champs persistants sont supprimes et les champs de lensemble de donnes en cours sont insrs selon leur ordre dans lensemble de donnes. Si vous rpondez Non, les champs persistants existants restent intacts, et les nouvelles informations de colonnes bases sur les champs supplmentaires de lensemble de donnes sont ajoutes lensemble de donnes. 3 Cliquez sur la case de fermeture pour appliquer les colonnes persistantes la grille et fermer la bote de dialogue.
15-21
1 Choisissez le bouton Ajouter dans lditeur de colonnes. La nouvelle colonne sera slectionne dans la bote liste. Elle porte un numro et un nom par dfaut (comme, 0 - TColumn). 2 Pour associer un champ cette nouvelle colonne, dfinissez la proprit FieldName dans linspecteur dobjets. 3 Pour dfinir le titre de la nouvelle colonne, dveloppez la proprit Title dans linspecteur dobjets et dfinissez son option Caption. 4 Fermez lditeur de colonnes pour appliquer les colonnes persistantes la grille et fermer la bote de dialogue.
Lors de lexcution, vous pouvez passer aux colonnes persistantes en attribuant csCustomized la proprit Columns.State. Toutes les colonnes existantes de la grille sont dtruites et de nouvelles colonnes persistantes sont construites pour chaque champ de lensemble de donnes de la grille. Vous pouvez ensuite ajouter une colonne persistante lors de lexcution en appelant la mthode Add de la liste de colonnes :
DBGrid1.Columns.Add;
1 Double-cliquez sur la grille afin dafficher lditeur de colonnes. 2 Slectionnez le champ supprimer dans la bote liste des colonnes. 3 Cliquez sur Supprimer (vous pouvez aussi utiliser le menu contextuel ou la touche Suppr).
Remarque
Si vous supprimez toutes les colonnes dune grille, la proprit Columns.State revient ltat csDefault et cre automatiquement des colonnes dynamiques pour chaque champ de lensemble de donnes. Pour supprimer une colonne persistante lors de lexcution, il vous suffit de librer lobjet colonne :
DBGrid1.Columns[5].Free;
1 Slectionnez la colonne dans la bote liste des colonnes. 2 Faites-la glisser vers son nouvel emplacement dans la bote liste.
15-22
Guide du dveloppeur
Vous pouvez aussi modifier lordre des colonnes en cliquant sur le titre dune colonne dans la grille elle-mme puis en faisant glisser la colonne jusqu une nouvelle position, comme vous le feriez lexcution.
Remarque
Le dplacement des champs persistants dans lditeur de champs a pour effet de dplacer les colonnes dans une grille par dfaut mais pas dans une grille personnalise. Vous ne pouvez pas, en phase de conception, dplacer des colonnes dans les grilles contenant des colonnes et des champs dynamiques, car aucun lment persistant ne peut enregistrer la modification. Lutilisateur peut, lexcution, utiliser la souris pour faire glisser une colonne un nouvel emplacement de la grille si sa proprit DragModevaut dmManual. Le changement de lordre des colonnes dune grille pour lesquelles la proprit State vaut csDefault, provoque galement la modification de lordre des composants champs dans lensemble de donnes sous-jacent. Lordre des champs dans la table elle-mme nest pas affect. Pour empcher le changement de lordre des colonnes lexcution, il faut mettre la proprit DragMode dmAutomatic. A lexcution, lvnement OnColumnMoved dune grille se dclenche aprs le dplacement dune colonne.
Important
Color
DropDownRows Expanded
15-23
Le tableau ci-dessous rsume les proprits pouvant tre dfinies pour la proprit Title.
Tableau 15.3 Proprit
Alignment Caption Color Font
15-24
Guide du dveloppeur
proprit PickList de la colonne dans linspecteur dobjets. Cela active lditeur de liste de chanes, dans lequel vous pouvez entrer les valeurs qui constituent la liste de slection de la colonne. Par dfaut, la liste droulante affiche 7 valeurs. Vous pouvez modifier la longueur de cette liste en dfinissant la proprit DropDownRows.
Remarque
Pour restaurer le comportement par dfaut dune colonne contenant une liste de slection explicite, supprimez tout le texte de la liste de slection laide de lditeur de liste de chane.
1 Slectionnez la colonne dans la bote liste Colonnes. 2 Choisissez cbsEllipsiscomme valeur de la proprit ButtonStyle. 3 Ecrivez un gestionnaire dvnement OnEditButtonClick.
15-25
15-26
Guide du dveloppeur
Les figures suivantes montrent la grille dote dun champ ADT et dun champ tableau. La premire figure montre les champs rduits. Cet tat ne permet pas de les modifier. La seconde figure montre les champs tendus. Pour tendre et rduire les champs, cliquez sur la flche dans leur barre de titre.
Figure 15.3 Contrle TDBGrid avec Expanded dfini False
Le tableau suivant numre les proprits qui affectent laffichage des champs ADT et tableau dans un objet TDBGrid :
Tableau 15.4 Proprit
Expandable
Utilisation
Indique si la colonne peut tre tendue pour afficher les champs enfants dans des colonnes spares et modifiables. (lecture seule) Spcifie si la colonne est tendue. Spcifie le nombre maximum de lignes de titre pouvant apparatre dans la grille.
Expanded MaxTitleRows
TColumn TDBGrid
15-27
Utilisation
Spcifie si les champs apparaissent aplanis, ou dans un mode objet, o chaque champ objet peut tre dvelopp et rduit. Fait rfrence lobjet TColumn auquel appartient la colonne du champ enfant.
ParentColumn
Remarque
Outre des champs ADT et array, certains ensembles de donnes comprennent des champs qui font rfrence un autre ensemble de donnes (champs ensemble de donnes) ou un enregistrement appartenant dautres champs ensemble de donnes (rfrence). Les grilles orientes donnes affichent respectivement ces champs sous les formes Ensemble de donnes ou Rfrence. A lexcution, un bouton points de suspension apparat droite. Le fait de cliquer sur ce bouton active une nouvelle fiche dont la grille affiche le contenu du champ. Dans le cas dun champ ensemble de donnes, cette grille affiche lensemble de donnes correspondant la valeur du champ. Dans le cas dun champ rfrence, cette grille contient une seule ligne qui affiche lenregistrement dun autre ensemble de donnes.
dgAlwaysShowEditor
dgTitles
15-28
Guide du dveloppeur
dgColumnResize
dgColLines
dgRowLines
dgTabs
True : (valeur par dfaut) autorise la tabulation entre les champs des enregistrements. False : la tabulation fait sortir du contrle grille. True : la barre de slection occupe toute la largeur de la grille. False : (valeur par dfaut) la slection dun champ dun enregistrement ne slectionne que ce champ.
dgRowSelect
dgAlwaysShowSelection
True : (valeur par dfaut) la barre de slection de la grille est toujours visible, m me si un autre contrle a la focalisation. False : la barre de slection napparat dans la grille que si la grille a la focalisation. True : (valeur par dfaut) demande la confirmation de la suppression denregistrements (Ctrl+Suppr). False : supprime les enregistrements sans confirmation. True : (valeur par dfaut) annule une insertion en attente lorsque la focalisation quitte la grille. Cela permet dviter des validations involontaires denregistrements vierges ou partiellement vierges. False : permet une insertion en attente dtre valide. True : permet aux utilisateurs de slectionner des lignes non contigus en utilisant les touches Ctrl+Maj ou Maj+flche. False : (valeur par dfaut) ne permet pas lutilisateur de slectionner plusieurs lignes.
dgConfirmDelete
dgCancelOnExit
dgMultiSelect
15-29
La proprit ReadOnly de la grille est False. Lorsquun utilisateur modifie un enregistrement de la grille, les modifications apportes chaque champ sont mises dans le tampon interne des enregistrements, et ne sont pas mises (ou valides) tant que lutilisateur nest pas pass un autre enregistrement de la grille. Mme si vous utilisez la souris pour dplacer la focalisation sur un autre contrle de la fiche, la grille ncrit vos modifications que lorsque vous changez denregistrement en cours. Lorsquun enregistrement est crit, le systme vrifie si le statut des composants orients donnes associs lensemble de donnes a t modifi. En cas de problme de mise jour dun champ contenant des donnes modifies, la grille provoque une exception et ne modifie pas lenregistrement.
Remarque
Si votre application place les mises jour en mmoire cache, les modifications apportes aux enregistrements sont uniquement envoyes dans un cache interne. Elles ne sont rpercutes dans la table de base de donnes sous-jacente que lorsque votre application applique les mises jour. Vous pouvez annuler toutes les modifications dun enregistrement en appuyant sur Echap dans un champ avant dactiver un autre enregistrement.
15-30
Guide du dveloppeur
15-31
Il y a de nombreuses utilisations possibles pour ces vnements. Par exemple, il est possible dcrire pour lvnement OnDblClick, un gestionnaire qui fasse apparatre une liste surgissante dans laquelle lutilisateur peut choisir la valeur entrer dans la colonne. Un tel gestionnaire utiliserait la proprit SelectedField pour dterminer la ligne et la colonne actives.
1 Placez une grille de contrle de base de donnes sur la fiche. 2 Donnez la proprit DataSource le nom de la source de donnes. 3 Placez des contrles de donnes dans la cellule de conception de la grille. (la cellule qui se trouve le plus haut ou le plus gauche de la grille, la seule dans laquelle vous puissiez placer des contrles). 4 Donnez la proprit DataField de chaque contrle de donnes le nom dun champ. La source de donnes de ces contrles est dj dfinie comme la source de la grille de contrle de base de donnes. 5 Disposez les contrles dans la cellule comme vous lentendez.
Lorsque vous compilez et excutez une application contenant une grille de contrle de base de donnes, la disposition des contrles orients donnes dans la cellule de conception (dfinie lexcution) est duplique dans chaque cellule de la grille. Chaque cellule affiche un enregistrement distinct dun ensemble de donnes.
Figure 15.5 TDBCtrlGrid en mode conception
15-32
Guide du dveloppeur
Le tableau ci-dessous rsume les proprits uniques des grilles de contrle de base de donnes que vous pouvez dfinir en phase de conception :
Tableau 15.7 Proprit
AllowDelete AllowInsert ColCount Orientation PanelHeight PanelWidth RowCount ShowFocus
Pour plus dinformations sur les proprits et les mthodes des grilles de contrle de base de donnes, voir la Rfrence VCL en ligne.
15-33
15-34
Guide du dveloppeur
Quand la valeur dun bouton est False, il est supprim du composant TDBNavigator et tous les autres boutons sagrandissent pour occuper toute la largeur du contrle. Vous pouvez faire glisser les poignes de celui-ci pour redimensionner les boutons.
15-35
15-36
Guide du dveloppeur
16
Chapitre 16
Chapitre
Les composants daide la dcision permettent de crer des graphes et des tableaux de rfrences croises pour visualiser et analyser des donnes selon diffrentes perspectives. Pour plus dinformations sur les rfrences croises, voir Prsentation des rfrences croises la page 16-2.
Prsentation
Les composants daide la dcision apparaissent sur la page Decision Cube de la palette des composants : Le cube de dcision, TDecisionCube, est un lieu de stockage de donnes multidimensionnelles. La source de dcision, TDecisionSource, dfinit ltat actuel du pivot dune grille ou dun graphe de dcision. La requte de dcision, TDecisionQuery, est une forme spcialise de TQuery utilise pour dfinir les donnes dun cube de dcision. Le pivot de dcision, TDecisionPivot, vous permet douvrir et de fermer les dimensions, ou champs, dun cube de dcision, en appuyant sur des boutons. La grille de dcision, TDecisionGrid, affiche des donnes unidimensionnelles ou multidimensionnelles sous forme dun tableau. Le graphe de dcision, TDecisionGraph, affiche les champs en provenance dune grille de dcision sous forme dun graphe dynamique, qui change lorsque les dimensions des donnes sont modifies. La figure suivante montre tous les composants daide la dcision placs dans une fiche au moment de la conception.
16-1
Pivot de dcision
Grille de dcision
Graphe de dcision
16-2
Guide du dveloppeur
16-3
Pour crer une fiche avec des tableaux et des graphes de donnes multidimensionnelles, suivez ces tapes :
1 Crez une fiche. 2 Ajoutez ces composants la fiche et utilisez linspecteur dobjets pour les lier comme indiqu :
un ensemble de donnes, habituellement TDecisionQuery (pour plus de dtails, reportez-vous Cration densembles de donnes de dcision avec lditeur de requte de dcision la page 16-6) ou TQuery ; un cube de dcision, TDecisionCube, li lensemble de donnes en dfinissant la proprit DataSet du cube de dcision par le nom de lensemble de donnes ; une source de dcision, TDecisionSource, lie au cube de dcision en dfinissant la proprit DecisionCube de la source de dcision par le nom du cube de dcision.
3 Ajoutez un pivot de dcision, TDecisionPivot, et liez-le la source de dcision dans linspecteur dobjets en dfinissant la proprit DecisionSource du pivot par le nom de la source de dcision. Le pivot de dcision est facultatif mais utile ; il permet au dveloppeur de fiches et lutilisateur final de changer les dimensions affiches dans les grilles ou les graphes de dcision en appuyant sur des boutons.
Dans son orientation par dfaut (horizontale), les boutons de gauche du pivot de dcision correspondent aux champs de gauche de la grille de dcision (les lignes) ; les boutons de droite correspondent aux champs du haut de la grille de dcision (les colonnes). Vous pouvez dterminer lendroit o apparaissent les boutons du pivot de dcision en dfinissant sa proprit GroupLayout par xtVertical, xtLeftTop ou xtHorizontal (la valeur par dfaut). Pour plus dinformations sur les proprits du pivot de dcision, reportez-vous Utilisation de pivots de dcision la page 16-10.
4 Ajoutez un ou plusieurs graphes et/ou grilles de dcision, lis la source de dcision. Pour plus de dtails, reportez-vous Cration et utilisation de grilles de dcision la page 16-11 et Cration et utilisation de graphes de dcision la page 16-14. 5 Utilisez lditeur de requte de dcision ou la proprit SQL de TDecisionQuery (ou TQuery) pour spcifier les tables, les champs et les calculs rcapitulatifs afficher dans la grille ou dans le graphe. Le dernier champ de SQL SELECT peut tre un champ rcapitulatif. Les autres champs de SELECT doivent tre des champs GROUP BY. Pour en savoir plus, reportez-vous Cration densembles de donnes de dcision avec lditeur de requte de dcision la page 16-6. 6 Dfinissez la proprit Active de la requte de dcision (ou dun autre composant ensemble de donnes) True.
16-4
Guide du dveloppeur
7 Utilisez la grille et le graphe de dcision pour montrer et reprsenter graphiquement les diffrentes dimensions des donnes. Reportez-vous Utilisation de grilles de dcision la page 16-12 et Utilisation de graphes de dcision la page 16-15, pour avoir des instructions et des suggestions.
Pour voir une illustration dans une fiche de tous les composants daide la dcision, reportez-vous la figure 16.1 la page 16-2.
16-5
moyennes, lagrgat peut tre utilis pour tous les champs. Nutilisez COUNT(*) que dans les cas o aucun des champs ne peut contenir de valeurs vierges ou si loprateur COUNT nest pas disponible pour tous les champs.
Lordre des champs dans linstruction SELECT doit correspondre lordre des champs de GROUP BY. Avec TTable, vous devez spcifier au cube de dcision les informations sur les champs de la requte qui servent de regroupement et ceux servant de rcapitulatifs. Pour ce faire, remplissez la zone Type de dimension pour chaque champ du DimensionMap du cube de dcision. Il faut spcifier pour chaque champ si cest une dimension ou un rcapitulatif et dans ce cas le type de rcapitulatif. Comme le calcul de moyenne de pivot dpend du calcul SUM/ COUNT, il faut galement spcifier le nom de champ de base afin de permettre au cube de dcision dassocier les paires de rcapitulatifs SUM et COUNT.
1 Slectionnez le composant requ te de dcision dans la fiche, puis cliquez avec le bouton droit de la souris et choisissez Editeur de requte de dcision. La bote de dialogue Editeur de requte de dcision apparat.
16-6
Guide du dveloppeur
2 Choisissez la base de donnes utiliser. 3 Pour des requtes sur une seule table, cliquez Slection des tables et champs.
Pour les requtes complexes mettant en uvre des jointures multitables, cliquez sur le bouton Constructeur de requtes pour afficher le constructeur SQL ou tapez linstruction SQL dans la bote de saisie de la page donglet SQL.
4 Revenez la bote de dialogue Editeur de requte de dcision. 5 Dans la bote de dialogue Editeur de requte de dcision, slectionnez les champs dans la bote liste des champs disponibles et placez-les dans Dimensions ou Rcapitulatifs en cliquant sur le bouton flche droite appropri. A mesure que vous ajoutez des champs dans la liste Rcapitulatifs, slectionnez dans le menu affich le type de rcapitulatif utiliser : somme, nombre ou moyenne. 6 Par dfaut, tous les champs et calculs rcapitulatifs dfinis dans la proprit SQL de la requ te de dcision apparaissent dans les botes liste Dimensions et Rcapitulatifs. Pour supprimer une dimension ou un rcapitulatif, slectionnez llment dans la liste et cliquez sur la flche gauche situe ct de la liste, ou double-cliquez sur llment supprimer. Pour lajouter nouveau, slectionnez-le dans la bote liste des champs disponibles et cliquez sur la flche droite approprie.
Lorsque le contenu de la requte de dcision est dfini, vous pouvez manipuler ensuite laffichage des dimensions avec la proprit DimensionMap et les boutons de TDecisionPivot. Pour plus dinformations, voir la section suivante, Utilisation des cubes de dcision, Utilisation de sources de dcision la page 16-10, et Utilisation de pivots de dcision la page 16-10.
Remarque
Quand vous utilisez lditeur de requte de dcision, la requte est initialement gre en utilisant la syntaxe SQL ANSI-92 puis, si cest ncessaire, elle est ensuite traduite dans le dialecte utilis par le serveur. Lditeur ne lit et naffiche que du SQL ANSI standard. La traduction dans le dialecte appropri est affecte automatiquement la proprit SQL du TDecisionQuery. Pour modifier une requte, ditez la version ANSI-92 dans lditeur et pas celle contenue dans la proprit SQL.
16-7
16-8
Guide du dveloppeur
Ces informations apparaissent dans les botes situes sur le ct droit de lditeur : Pour modifier le nom dune dimension ou dun champ rcapitulatif apparaissant sur le pivot, la grille ou le graphe de dcision, entrez un nouveau nom dans la bote de saisie Nom affiche. Pour savoir si le champ slectionn est une dimension ou un champ rcapitulatif, lisez le texte se trouvant dans la bote de saisie Type. Si lensemble de donnes est un composant TTable, vous pouvez utiliser Type pour spcifier si le champ slectionn est une dimension ou un champ rcapitulatif. Pour dsactiver ou activer la dimension ou le champ rcapitulatif slectionn, modifiez le paramtrage de la bote liste droulante Type actif : Actif, Si besoin ou Inactif. Dsactiver une dimension ou la dfinir par Si besoin conomise de la mmoire. Pour modifier le format de cette dimension ou de ce champ rcapitulatif, entrez une chane de formatage dans la bote de saisie Format. Pour afficher cette dimension ou ce champ rcapitulatif par Anne, Trimestre ou Mois, changez le paramtrage de la bote liste droulante Groupage. Dans la bote liste Groupage, vous pouvez placer la dimension ou le rcapitulatif slectionn dans un tat perfor permanent. Cela peut tre utile pour conomiser de la mmoire lorsquune dimension a de nombreuses valeurs. Pour plus dinformations, voir Considrations relatives au contrle de la mmoire la page 16-21. Pour dterminer le point de dpart des intervalles, commencez par choisir la valeur adapte de regroupement dans la liste droulante Groupage puis entrez la valeur de dpart de lintervalle dans la liste droulante Valeur initiale.
16-9
Proprits et vnements
Voici les proprits et les vnements spciaux qui contrlent laspect et le comportement des sources de dcision : La proprit ControlType de TDecisionSource indique si les boutons du pivot de dcision doivent agir comme des cases cocher (slections multiples) ou des boutons radio (slections mutuellement exclusives). Les proprits SparseCols et SparseRows de TDecisionSource indiquent si les colonnes ou les lignes sans valeur doivent tre affiches ; si True, les colonnes ou les lignes vides sont affiches. TDecisionSource possde les vnements suivants : OnLayoutChange se produit lorsque lutilisateur effectue des pivotements ou des perforations qui rorganisent les donnes. OnNewDimensions se produit lorsque les donnes elles-mmes sont modifies, par exemple lorsque les champs rcapitulatifs ou les dimensions sont modifis. OnSummaryChange se produit lorsque la valeur rcapitulative en cours est modifie. OnStateChange se produit quand le cube de dcision est activ ou dsactiv. OnBeforePivot se produit lorsque les modifications sont valides mais pas encore refltes par linterface utilisateur. Les dveloppeurs ont la possibilit deffectuer les changements, par exemple de capacit ou de ltat du pivot, avant que lutilisateur de lapplication ne puisse voir le rsultat de son action. OnAfterPivot est dclench aprs une modification de ltat du pivot. Les dveloppeurs peuvent intercepter des informations ce moment.
16-10
Guide du dveloppeur
valeurs rcapitulatives pour une catgorie particulire de la dimension apparaissent. Vous pouvez utiliser le pivot de dcision pour rorganiser les dimensions affiches par la grille et le graphe de dcision. Faites simplement glisser un bouton vers la partie des lignes ou celle des colonnes, ou rorganisez les boutons dans la mme partie. Pour voir des illustrations de pivots de dcision pendant la conception, reportezvous aux figures 16.1, 16.2 et 16.3.
1 Suivez les tapes 1 3 de la section Instructions relatives lutilisation de composants daide la dcision la page 16-3.
16-11
2 Ajoutez un ou plusieurs composants grille de dcision (TDecisionGrid) et dfinissez dans linspecteur dobjets leur proprit DecisionSource par le nom du composant source de dcision, TDecisionSource, auquel vous voulez relier les grilles. 3 Continuez par les tapes 5 7 de la section Instructions relatives lutilisation de composants daide la dcision la page 16-3
Pour avoir la description de ce qui apparat dans la grille de dcision et savoir comment lutiliser, lisez Utilisation de grilles de dcision la page 16-12. Pour ajouter un graphe la fiche, suivez les instructions de Cration de graphes de dcision la page 16-14.
Pour plus dinformations sur les proprits et les vnements relatifs la grille de dcision, voir Proprits des grilles de dcision la page 16-13.
16-12
Guide du dveloppeur
16-13
dimensions, cliquez sur un composant dans la fiche ou choisissez le composant dans la liste droulante situe en haut de linspecteur dobjets. La proprit Options de TDecisionGrid vous permet de contrler laffichage des lignes de la grille (cgGridLines = True), dactiver la fonction de rduction et de dveloppement des dimensions avec les indicateurs + et - (cgOutliner = True) et dactiver la possibilit de pivoter par glisser-dplacer (cgPivotable = True). Lvnement OnDecisionDrawCell de TDecisionGrid vous permet de changer laspect de chaque cellule au moment o elle est dessine. Lvnement passe en tant que paramtres par rfrence les valeurs de String, Font et Color de la cellule en cours. Vous tes libre de modifier ces paramtres pour raliser des effets, par exemple choisir une couleur particulire pour les valeurs ngatives. En plus de la proprit DrawState qui est passe par TCustomGrid, lvnement transmet la valeur de TDecisionDrawState, qui peut tre utilise pour dterminer le type de cellule dessiner. Dautres informations concernant la cellule peuvent tre extraites via les fonctions Cells, CellValueArray ou CellDrawState. Lvnement OnDecisionExamineCell de TDecisionGrid vous permet de connecter lvnement clic-droit aux cellules de donnes, afin de pouvoir afficher des informations (par exemple, des enregistrements dtail) sur une cellule particulire. Lorsque lutilisateur clique avec le bouton droit de la souris sur une cellule, lvnement est fourni avec toutes les informations qui entrent en jeu, cest--dire la valeur rcapitulative en cours et un tableau ValueArray contenant toutes les valeurs de la dimension utilises pour calculer la valeur rcapitulative.
1 Suivez les tapes 1 3 de la section Instructions relatives lutilisation de composants daide la dcision la page 16-3. 2 Ajoutez un ou plusieurs composants graphe de dcision (TDecisionGraph ) et dfinissez dans linspecteur dobjets leur proprit DecisionSource par le nom du composant source de dcision, TDecisionSource, auquel vous voulez relier les graphes.
16-14
Guide du dveloppeur
3 Continuez avec les tapes 5 7 de la section Instructions relatives lutilisation de composants daide la dcision la page 16-3. 4 Enfin, cliquez avec le bouton droit de la souris sur le graphe et choisissez Modifier le graphe pour changer laspect des sries du graphe. Vous pouvez dfinir des proprits modles pour chaque dimension du graphe, puis dfinir les proprits de chaque srie pour remplacer ces valeurs par dfaut. Pour plus de dtails, voir Personnalisation du graphe de dcision la page 16-17.
Pour avoir la description de ce qui apparat dans le graphe de dcision et savoir comment lutiliser, lisez la section suivante, Utilisation de graphes de dcision. Pour ajouter une grille de dcision (ou tableau crois) la fiche, suivez les instructions de Cration et utilisation de grilles de dcision la page 16-11.
16-15
Pour plus dinformations sur ce qui apparat dans un graphe de dcision, voir la section suivante, Affichage du graphe de dcision. Pour crer un graphe de dcision, voir la section prcdente, Cration de graphes de dcision. Pour connatre les proprits des graphes de dcision et savoir comment changer laspect et le comportement des graphes de dcision, voir Personnalisation du graphe de dcision la page 16-17.
16-16
Guide du dveloppeur
Si vous utilisez un pivot de dcision, vous pouvez appuyer sur ses boutons pour dterminer les champs (dimensions) du cube de dcision qui doivent tre reprsents. Pour changer les axes du graphe, faites glisser les boutons de dimension du pivot de dcision de part et dautre de lespace sparateur. Si le graphe est unidimensionnel, avec tous les boutons dun ct de lespace sparateur, vous pouvez utiliser les icnes de lignes ou de colonnes comme cible du dplacement pour ajouter des boutons de lautre ct du sparateur et rendre le graphe multidimensionnel. Si vous voulez quune seule ligne ou quune seule colonne soit active la fois, vous pouvez donner la valeur xtRadio la proprit ControlType de TDecisionSource. Un seul champ pourra alors tre actif la fois, et la fonctionnalit du pivot de dcision correspondra au comportement du graphe. xtRadioEx fonctionne comme xtRadio, mais nautorise pas ltat o les dimensions de toutes les lignes ou de toutes les colonnes sont fermes. Si vous avez la fois une grille et un graphe de dcision connects la mme TDecisionSource, il vaudra mieux dfinir ControlType par xtCheck pour revenir au comportement le plus souple de TDecisionGrid.
1 Cliquez dessus avec le bouton droit de la souris et choisissez Modifier le graphe. La bote de dialogue de modification de graphe apparat. 2 Utilisez la page Graphe de la bote de dialogue de modification de graphe pour voir la liste des sries visibles, slectionner la dfinition de srie utiliser si deux ou plus sont disponibles pour la mme srie, changer le type de graphe dun modle ou dune srie et dfinir les proprits globales du graphe.
La liste Sries de la page Graphe montre toutes les dimensions du cube de dcision (prcdes de Modle:) et les catgories actuellement visibles. Chaque catgorie, ou srie, est un objet spar. Vous pouvez : ajouter ou supprimer des sries drives des sries existantes du graphe. Les sries drives peuvent fournir des annotations pour des sries existantes ou reprsenter des valeurs calcules partir dautres sries ; changer le type de graphe par dfaut et changer le titre des modles et des sries. Vous trouverez dans laide en ligne la description des autres onglets de la page Graphe.
16-17
3 Utilisez la page Sries pour tablir les modles de dimensions, puis personnaliser les proprits de chaque srie du graphe.
Par dfaut, les sries sont reprsentes par des barres dhistogramme qui peuvent avoir jusqu 16 couleurs. Vous pouvez modifier le type et les proprits du modle pour crer un nouveau modle par dfaut. Lorsque vous utilisez le pivot pour faire passer la source de dcision par diffrents tats, le modle est utilis pour crer de faon dynamique la srie de chaque nouvel tat. Pour avoir plus de dtails sur les modles, voir Dfinition des modles de graphe de dcision par dfaut la page 16-18. Pour personnaliser une srie individuelle, suivez les instructions de Personnalisation des sries dun graphe de dcision la page 16-19. Vous trouverez dans laide en ligne la description des autres onglets de la page Sries.
1 Slectionnez un modle dans la liste Sries de la page Graphe de la bote de dialogue de modification de graphe. 2 Cliquez sur le bouton Modifier. 3 Slectionnez un nouveau type et fermez la bote de dialogue Galerie.
16-18
Guide du dveloppeur
1 Slectionnez la page Sries, en haut de la bote de dialogue de modification de graphe. 2 Choisissez un modle dans la liste droulante en haut de la page. 3 Choisissez longlet correspondant la proprit modifier et faites vos choix.
1 Slectionnez la page Graphe en haut de la bote de dialogue de modification de graphe. 2 Choisissez longlet correspondant la proprit modifier et faites vos choix.
1 Slectionnez une srie dans la liste Sries de la page Graphe de lditeur de graphe. 2 Cliquez sur le bouton Modifier.
16-19
3 Slectionnez un nouveau type et fermez la bote de dialogue Galerie. 4 Activez la case cocher denregistrement des sries.
1 Slectionnez la page Sries, en haut de la bote de dialogue de modification de graphe. 2 Choisissez une srie dans la liste droulante, en haut de la page. 3 Choisissez longlet correspondant la proprit modifier et faites vos choix. 4 Activez la case cocher denregistrement des sries.
16-20
Guide du dveloppeur
Cliquer avec le bouton gauche sur un bouton de dimension, aprs avoir choisi la commande de forage et slectionner : ouvrir dimension, pour revenir au niveau suprieur de cette dimension ; toutes les valeurs, pour basculer entre laffichage dans les grilles de dcision des rcapitulations seulement ou des rcapitulations plus les autres valeurs. partir de la liste des catgories disponibles, une catgorie forer pour connatre les valeurs dtail. Cliquer avec le bouton gauche sur un bouton de dimension pour ouvrir ou fermer cette dimension. Faire glisser les boutons de dimension depuis la partie lignes vers la partie colonnes et rciproquement ; ils peuvent ensuite les placer ct des boutons existant dans cette partie ou sur licne de lignes ou de colonnes.
16-21
consommation de mmoire pour les dimensions augmente plus vite. Lajout dune dimension de 10 valeurs multiplie par 10 la consommation de mmoire (par rapport lajout dune dimension qui aurait une seule valeur) et lajout dune dimension de 100 valeurs la multiplie par 100. Lajout de dimensions un cube de dcision peut avoir un effet dramatique sur lutilisation de la mmoire et entraner trs vite une baisse des performances. Cet effet est particulirement prononc quand les dimensions ajoutes comportent de nombreuses valeurs. Les composants daide la dcision contiennent un certain nombre doptions qui vous aident contrler comment et quand la mmoire est utilise. Pour plus dinformations sur les proprits et les techniques indiques ici, recherchez TDecisionCube dans laide en ligne.
16-22
Guide du dveloppeur
Cest--dire quune dimension ou un champ rcapitulatif ne sera pas en mmoire quand il nest pas utilis. Dfinir par AsNeeded les dimensions qui ne sont pas frquemment utilises entrane de meilleures performances pour le chargement et le pivotement, malgr le temps daccs aux dimensions non charges.
16-23
16-24
Guide du dveloppeur
17
Chapitre 17
Chapitre
La plupart des composants ensemble de donnes peuvent se connecter directement un serveur de bases de donnes. Une fois connect, lensemble de donnes communique avec le serveur automatiquement. Lorsque vous ouvrez lensemble de donnes, il se remplit avec les donnes du serveur et, lorsque vous validez des enregistrements, ceux-ci sont envoys au serveur et appliqus. Un composant connexion peut tre partag par plusieurs ensembles de donnes, ou chaque ensemble de donnes peut utiliser sa propre connexion. Chaque type densemble de donnes se connecte au serveur de bases de donnes laide de son propre type de composant connexion, qui utilise un mcanisme unique daccs aux donnes. Le tableau suivant prsente ces mcanismes et les composants connexion associs :
Tableau 17.1 Composants connexion de base de donn es Composant connexion
TDatabase TADOConnection TSQLConnection TIBDatabase
Remarque
Pour une prsentation de certains avantages et inconvnients de chacun de ces mcanismes, voir Utilisation des bases de donnes la page 14-1. Le composant connexion fournit toutes les informations ncessaires ltablissement dune connexion de base de donnes. Ces informations diffrent dun type de composant connexion lautre : Pour la description dune connexion BDE, voir Identification de la base de donnes la page 20-15. Pour la description dune connexion ADO, voir Connexion un stockage de donnes avec TADOConnection la page 21-3.
17-1
Pour la description dune connexion dbExpress, voir Configuration de TSQLConnection la page 22-3. Pour la description dune connexion InterBase Express, voir laide en ligne de TIBDatabase. Bien que chaque type densemble de donnes utilise un composant connexion diffrent, ils drivent tous de TCustomConnection. Ils effectuent tous la plupart des mmes tches et mettent disposition la plupart des mmes proprits, mthodes et vnements. Ce chapitre prsente de nombreuses tches communes.
17-2
Guide du dveloppeur
Lorsquun composant connexion nest pas connect un serveur et quune application essaie douvrir lun de ses ensembles de donnes associs, lensemble de donnes appelle automatiquement la mthode Open du composant connexion. Lorsque vous attribuez Connected la valeur True, le composant connexion gnre dabord un vnement BeforeConnect, dans lequel vous pouvez effectuer toute initialisation. Par exemple, vous pouvez utiliser cet vnement pour modifier les paramtres de connexion. Aprs lvnement BeforeConnect, il est possible que le composant connexion affiche une bote de dialogue douverture de session par dfaut, suivant votre choix en matire de contrle de connexion au serveur. Il transmet ensuite le nom dutilisateur et le mot de passe au pilote et ouvre une connexion. Une fois la connexion ouverte, le composant connexion gnre un vnement AfterConnect, dans lequel vous pouvez effectuer toute tche ncessitant une connexion ouverte.
Remarque
Certains composants connexion gnrent galement des vnements supplmentaires lors de ltablissement dune connexion. Une fois tablie, la connexion est conserve tant quau moins un ensemble de donnes actif lutilise. Si aucun ensemble de donnes nest plus actif, le
17-3
composant connexion abandonne la connexion. Certains composants connexion mettent disposition une proprit KeepConnection qui permet la connexion de demeurer ouverte mme si tous les ensembles de donnes qui lutilisent sont ferms. Si KeepConnection a pour valeur True, la connexion est maintenue. Pour les connexions vers des serveurs de bases de donnes distants, ou pour les applications qui ouvrent et ferment frquemment des ensembles de donnes, il est prfrable que KeepConnection ait pour valeur True afin de rduire le trafic sur le rseau et dacclrer lapplication. Si KeepConnection a pour valeur False, la connexion est ferme ds quil ny a plus densemble de donnes actif utilisant la base de donnes. Si un ensemble de donnes (qui utilise la base de donnes) est ultrieurement ouvert, la connexion doit tre nouveau tablie et initialise.
Le fait dappeler Close ou dattribuer Connected la valeur False provoque la dconnexion dun serveur de base de donnes mme si le composant connexion dispose dune proprit KeepConnection ayant pour valeur True.
17-4
Guide du dveloppeur
A lexcution, trois moyens permettent de grer la procdure de connexion dun serveur : Laisser la bote de dialogue de connexion par dfaut demander et traiter la connexion. Cest lapproche par dfaut. Initialisez la proprit LoginPrompt du composant connexion True (valeur par dfaut) et ajoutez DBLogDlg la clause uses de lunit qui dclare le composant connexion. Votre application affiche la bote de dialogue standard de connexion lorsque le serveur attend un nom dutilisateur et un mot de passe. Fournir les informations de connexion avant la tentative de connexion. Chaque type de composant connexion utilise un mcanisme diffrent pour spcifier le nom dutilisateur et le mot de passe : Pour les ensembles de donnes BDE, dbExpress et InterBase Express, les paramtres de connexion du nom dutilisateur et du mot de passe sont accessibles par le biais de la proprit Params. (Pour les ensembles de donnes BDE, les valeurs de paramtre peuvent galement tre associes un alias BDE, tandis que pour les ensembles de donnes dbExpress, elles peuvent galement tre associes un nom de connexion). Pour les ensembles de donnes ADO, le nom dutilisateur et le mot de passe peuvent tre inclus dans la proprit ConnectionString (ou fournis comme paramtres de la mthode Open). Si vous spcifiez le nom dutilisateur et le mot de passe avant que le serveur ne les demande, veillez affecter au paramtre LoginPrompt la valeur False afin que la bote de dialogue de connexion par dfaut ne saffiche pas. Par exemple, le code suivant dfinit le nom dutilisateur et le mot de passe sur un composant connexion SQL dans le gestionnaire dvnement BeforeConnect, en dcodant un mot de passe crypt associ au nom de connexion en cours :
procedure TForm1.SQLConnectionBeforeConnect(Sender: TObject); begin with Sender as TSQLConnection do begin if LoginPrompt = False then begin Params.Values[User_Name] := SYSDBA; Params.Values[Password] := Decrypt(Params.Values[Password]); end; end; end;
Linitialisation du nom dutilisateur et du mot de passe la conception ou lutilisation de chanes codes en dur dans le code gnrent lintgration des valeurs dans le fichier excutable de lapplication. Cette approche compromet la scurit du serveur car elle permet de les trouver facilement. Fournir votre propre traitement de lvnement de connexion. Le composant connexion gnre un vnement lorsquil requiert le nom dutilisateur et le mot de passe. Pour TDatabase, TSQLConnection et TIBDatabase, il sagit dun vnement OnLogin. Le gestionnaire dvnement possde deux paramtres, le
17-5
composant connexion et une copie locale des paramtres de nom dutilisateur et de mot de passe dans une liste de chanes. (TSQLConnection comprend galement le paramtre de base de donnes). Vous devez affecter la proprit LoginPrompt la valeur True pour que cet vnement puisse se produire. Lorsque la proprit LoginPrompt a pour valeur False et quun gestionnaire est affect pour lvnement OnLogin, il est impossible dtablir une connexion la base de donnes, car la bote de dialogue par dfaut ne saffiche pas, et le gestionnaire dvnement OnLogin ne sexcute jamais. Pour TADOConnection, lvnement est un vnement OnWillConnect. Le gestionnaire dvnement possde cinq paramtres, le composant connexion et quatre paramtres qui renvoient les valeurs dterminant la connexion (notamment deux paramtres pour le nom dutilisateur et le mot de passe). Cet vnement se produit toujours, quelle que soit la valeur de LoginPrompt. Ecrivez un gestionnaire pour lvnement dans lequel vous dfinissez les paramtres de connexion. Dans lexemple suivant, les valeurs des paramtres USER NAME et PASSWORD sont fournies laide dune variable globale (UserName) et dune mthode qui renvoie un mot de passe en fonction dun nom dutilisateur (PasswordSearch) :
procedure TForm1.Database1Login(Database: TDatabase; LoginParams: TStrings); begin LoginParams.Values[USER NAME] := UserName; LoginParams.Values[PASSWORD] := PasswordSearch(UserName); end;
Comme dans les autres mthodes de transmission de paramtres de connexion, lorsque vous crivez un gestionnaire dvnement OnLogin ou OnWillConnect, vitez de coder en dur le mot de passe dans le code de votre application. Il doit apparatre uniquement sous la forme dune valeur crypte, dune entre de base de donnes scurise utilise par votre application pour rechercher la valeur, ou tre dynamiquement obtenu auprs de lutilisateur.
17-6
Guide du dveloppeur
donnes qui noffrent aucune prise en charge des transactions, la plupart des bases de donnes fournissent leur propre modle de gestion des transactions. Si votre serveur de base de donnes le permet, vous pouvez coder directement votre propre gestion des transactions afin de tirer parti des fonctionnalits avances de gestion des transactions, telles que la mise en mmoire cache des schmas. Si vous navez pas besoin dutiliser de fonctionnalits avances, les composants connexion fournissent un ensemble de mthodes et de proprits permettant de grer les transactions sans explicitement mettre de commande SQL. Grce ces proprits et mthodes, vous navez pas besoin de personnaliser votre application en fonction de chaque type de serveur de base de donnes utilis, sous rserve que le serveur prenne en charge les transactions. (Le moteur BDE offre galement une prise en charge limite des transactions pour les tables locales sans prise en charge des transactions du serveur. Lorsque le moteur BDE nest pas utilis, toute tentative de dmarrage de transactions sur une base de donnes qui ne les prend pas en charge amne les composants connexion dclencher une exception.)
Attention
lorsquun composant fournisseur densemble de donnesapplique des mises jour, il gnre implicitement les transactions pour toutes les mises jour. Veillez ce que toutes les transactions explicitement dmarres nentrent pas en conflit avec celles gnres par le fournisseur.
BeginTrans renvoie le niveau dimbrication de la transaction dmarre. Une transaction imbrique est une transaction qui fait partie dune autre transaction parent. Une fois que le serveur a dmarr la transaction, la connexion ADO reoit un vnement OnBeginTransComplete. Pour TDatabase, utilisez la mthode StartTransaction TDataBase ne prend pas en charge les transactions imbriques ou se chevauchant. Si vous appelez la
17-7
mthode StartTransaction du composant TDatabase alors quune autre transaction est en cours, une exception est dclenche. Pour viter dappeler StartTransaction, vous pouvez vrifier la proprit InTransaction :
if not Database1.InTransaction then Database1.StartTransaction;
TSQLConnection utilise galement la mthode StartTransaction dans une version qui offre davantage de contrle. Notamment, StartTransaction accepte un descripteur de transaction qui permet de grer plusieurs transactions simultanes et de spcifier le niveau disolement des transactions pour chaque transaction. (Pour plus dinformations sur les niveaux de transaction, voir Spcification du niveau disolement des transactions la page 17-10.) Pour grer plusieurs transactions simultanes, attribuez au champ TransactionID du descripteur de transaction une valeur unique. TransactionID peut prendre nimporte quelle valeur, sous rserve quelle soit unique (cest--dire non conflictuelle avec une transaction en cours). Suivant le serveur, les transactions dmarres par TSQLConnection peuvent tre imbriques (comme dans le cas dune connexion ADO) ou se chevaucher.
var TD: TTransactionDesc; begin TD.TransactionID := 1; TD.IsolationLevel := xilREADCOMMITTED; SQLConnection1.StartTransaction(TD);
Par dfaut, dans le cas des transactions se chevauchant, la premire transaction devient inactive lorsque la seconde dmarre, bien que vous puissiez diffrer la validation ou lannulation de la premire. Si vous utilisez TSQLConnection avec une base de donnes InterBase, vous pouvez identifier chaque ensemble de donnes dans votre application avec une transaction active particulire, en dfinissant sa proprit TransactionLevel. En dautres termes, aprs le dmarrage dune seconde transaction, vous pouvez continuer utiliser les deux transactions simultanment, en associant simplement un ensemble de donnes la transaction qui vous intresse.
Remarque
Contrairement TADOConnection, TSQLConnection et TDatabase ne reoivent pas dvnements au dmarrage des transactions. InterBase Express offre davantage de contrle que TSQLConnection en utilisant un composant transaction distinct au lieu de dmarrer les transactions au moyen du composant connexion. Vous pouvez, toutefois, utiliser TIBDatabase pour dmarrer une transaction par dfaut :
if not IBDatabase1.DefaultTransaction.InTransaction then IBDatabase1.DefaultTransaction.StartTransaction;
Vous pouvez obtenir des transactions se chevauchant laide de deux composants transaction spars. Chaque composant transaction possde un ensemble de paramtres qui permettent de configurer les proprits de la transaction. Ces paramtres vous permettent de spcifier le niveau disolement, ainsi que dautres proprits de la transaction.
17-8
Guide du dveloppeur
Dans le cas de TSQLConnection, vous utilisez galement la mthode Commit, mais vous devez spcifier la transaction valider en fournissant le descripteur de transaction communiqu la mthode StartTransaction :
MyOracleConnection.Commit(TD);
Dans le cas de TIBDatabase, vous validez un objet transaction laide de sa mthode Commit :
IBDatabase1.DefaultTransaction.Commit;
Dans le cas de TADOConnection, vous validez une transaction laide de la mthode CommitTrans :
ADOConnection1.CommitTrans; Remarque
Il est possible de valider une transaction imbrique de sorte que seules les modifications ultrieures soient annules si la transaction parent est annule. Une fois la transaction correctement valide, un composant connexion ADO reoit un vnement OnCommitTransComplete. Les autres composants connexion ne reoivent pas dvnements similaires. Un appel pour valider la transaction en cours est gnralement tent dans une instruction try...except. Ainsi, si une transaction ne peut pas tre correctement valide, vous pouvez utiliser le bloc except pour traiter lerreur et renouveler lopration ou pour annuler la transaction.
17-9
Dans le cas de TDatabase, vous annulez une transaction en appelant la mthode Rollback :
MyOracleConnection.Rollback;
Dans le cas de TSQLConnection, vous utilisez galement la mthode Rollback, mais vous devez spcifier la transaction annuler en fournissant le descripteur de transaction communiqu la mthode StartTransaction :
MyOracleConnection.Rollback(TD);
Dans le cas de TIBDatabase, vous annulez un objet transaction en appelant sa mthode Rollback :
IBDatabase1.DefaultTransaction.Rollback;
Dans le cas de TADOConnection, vous annulez une transaction en appelant la mthode RollbackTrans :
ADOConnection1.RollbackTrans;
Une fois la transaction correctement annule, un composant connexion ADO reoit un vnement OnRollbackTransComplete. Les autres composants connexion ne reoivent pas dvnements similaires. Un appel pour annuler la transaction en cours se produit gnralement Dans un code de gestion des exceptions, lorsque vous ne pouvez pas rtablir la situation aprs une erreur de base de donnes. Dans un code dvnement de bouton ou de menu, comme lorsquun utilisateur clique sur un bouton Annuler.
17-10
Guide du dveloppeur
processus de lecture. Ce niveau est disponible pour toutes les transactions lexception des transactions locales gres par le BDE. RepeatableRead : lorsque le niveau disolement a pour valeur RepeatableRead, votre transaction est en mesure de voir un tat cohrent des donnes de la base de donnes. Votre transaction voit une seule capture instantane des donnes. Elle ne peut pas voir les changements de donnes ultrieurs apports par dautres transactions simultanes, mmes si elles sont valides. Ce niveau disolement garantit qu aprs la lecture dun enregistrement par la transaction, la vue de cet enregistrement ne changera pas. Cest le niveau o votre transaction est la mieux isole des changements apports par dautres transaction. Ce niveau nest pas disponible sur certains serveurs, tels que Sybase et MS-SQL, ni pour les transactions locales gres par le BDE. En outre, TSQLConnection vous permet dadapter les niveaux disolement aux bases de donnes. Les niveaux disolement personnaliss sont dfinis par le pilote dbExpress. Reportez-vous la documentation du pilote pour plus dinformations.
Remarque
Pour une description dtaille de la mise en uvre de chaque niveau disolement, reportez-vous la documentation de votre serveur. TDatabase et TADOConnection vous permettent de spcifier le niveau disolement des transactions par le biais de la proprit TransIsolation. Lorsque vous attribuez TransIsolation une valeur non prise en charge par le serveur de bases de donnes, vous obtenez le niveau disolement immdiatement suprieur (ventuellement disponible). En labsence de niveau suprieur, le composant connexion dclenche une exception en cas de tentative de dmarrage dune transaction. Lorsque vous utilisez TSQLConnection, le niveau disolement des transactions est contrl par le champ IsolationLevel du descripteur de transaction. Lorsque vous utilisez InterBase Express, le niveau disolement des transactions est contrl par un paramtre de transaction.
17-11
renvoient pas non plus densemble de rsultat. Les instructions DML ralisant une action sur des donnes mais ne renvoyant pas densemble de rsultat sont les suivantes : INSERT, DELETE et UPDATE. La syntaxe de la mthode Execute dpend du type de connexion : Dans le cas de TDatabase, Execute possde quatre paramtres : une chane qui spcifie une instruction SQL unique excuter, un objet TParams qui fournit toutes les valeurs de paramtre de linstruction, une valeur boolenne qui indique si linstruction doit tre place en mmoire cache en vue dun appel ultrieur et un pointeur vers un curseur BDE pouvant tre renvoy (il est recommand dindiquer nil). Dans le cas de TADOConnection, il existe deux versions de la mthode Execute. La premire possde une valeur WideString qui spcifie linstruction SQL et un second paramtre qui dsigne un ensemble doptions qui dterminent si linstruction est excute de faon asynchrone et si elle renvoie des enregistrements. Cette premire syntaxe renvoie une interface pour les enregistrements renvoys. La seconde syntaxe possde une valeur WideString qui spcifie linstruction SQL, un deuxime paramtre qui renvoie le nombre denregistrements affects par lexcution de linstruction et un troisime qui dsigne des options, telles que lexcution ou non de linstruction de faon asynchrone. Aucune des syntaxes ne permet la transmission de paramtres. Dans le cas de TSQLConnection, Execute possde trois paramtres : une chane qui spcifie une instruction SQL unique excuter, un objet TParams qui fournit les valeurs de paramtre de cette instruction et un pointeur qui peut recevoir un objet TCustomSQLDataSet cr pour renvoyer les enregistrements.
Remarque
Execute ne peut excuter quune instruction SQL en mme temps. A la diffrence des utilitaires de script SQL, un seul appel dExecute ne permet pas dexcuter plusieurs instructions SQL. Pour ce faire, appelez Execute autant de fois que ncessaire. Il est relativement facile dexcuter une instruction ne comprenant aucun paramtre. Par exemple, le code suivant excute une instruction CREATE TABLE (DDL) sans aucun paramtre sur un composant TSQLConnection :
procedure TForm1.CreateTableButtonClick(Sender: TObject); var SQLstmt: String; begin SQLConnection1.Connected := True; SQLstmt := CREATE TABLE NewCusts + ( + CustNo INTEGER, + Company CHAR(40), + State CHAR(2), + PRIMARY KEY (CustNo) + ); SQLConnection1.Execute(SQLstmt, nil, nil); end;
Pour utiliser des paramtres, vous devez crer un objet TParams. Pour chaque valeur de paramtre, utilisez la mthode TParams.CreateParam afin dajouter un
17-12
Guide du dveloppeur
objet TParam. Ensuite, utilisez les proprits de TParam pour dcrire le paramtre et dfinir sa valeur. Ce processus est illustr dans lexemple suivant, qui utilise TDatabase pour excuter une instruction INSERT. Linstruction INSERT possde un paramtre unique nomm :StateParam. Un objet TParams (appel stmtParams) est cr afin de fournir la valeur CA pour ce paramtre.
procedure TForm1.INSERT_WithParamsButtonClick(Sender: TObject); var SQLstmt: String; stmtParams: TParams; begin stmtParams := TParams.Create; try Database1.Connected := True; stmtParams.CreateParam(ftString, StateParam, ptInput); stmtParams.ParamByName(StateParam).AsString := CA; SQLstmt := INSERT INTO "Custom.db" + (CustNo, Company, State) + VALUES (7777, "Robin Dabank Consulting", :StateParam); Database1.Execute(SQLstmt, stmtParams, False, nil); finally stmtParams.Free; end; end;
Si linstruction SQL comprend un paramtre mais que vous ne fournissez pas dobjet TParam pour indiquer sa valeur, linstruction SQL peut gnrer une erreur lors de son excution (cela dpend du type de la base de donnes utilise). Si un objet TParam est fourni alors quaucun paramtre ne lui correspond dans linstruction SQL, une exception est dclenche lorsque lapplication tente dutiliser le TParam.
17-13
Obtention de mtadonnes
Pour fermer tous les ensembles de donnes ouverts sans provoquer la dconnexion du serveur, vous pouvez utiliser la mthode CloseDataSets. Dans le cas de TADOConnection et TIBDatabase, lappel de CloseDataSets laisse toujours la connexion ouverte. Dans le cas de TDatabase et TSQLConnection, vous devez galement attribuer la proprit KeepConnection la valeur True.
Lorsque vous utilisez un ensemble de donnes client spcialis pour placer les mises jour en mmoire cache (par opposition lensemble de donnes client gnrique TClientDataSet), la proprit DataSets comprend lensemble de donnes interne dtenu par lensemble de donnes client, non celui-ci. Vous pouvez utiliser DataSets avec DataSetCount pour effectuer un cycle sur tous les ensembles de donnes actuellement actifs depuis votre code. Par exemple, le code suivant parcourt tous les ensembles de donnes actifs et dsactive tous les contrles qui utilisent les donnes quils fournissent :
var I: Integer; begin with MyDBConnection do begin for I := 0 to DataSetCount - 1 do DataSets[I].DisableControls; end; end;
Remarque
TADOConnection gre les objets commande ainsi que les ensembles de donnes. A limage des ensembles de donnes, vous pouvez parcourir les objets commande, laide des proprits Commands et CommandCount.
Obtention de mtadonnes
Tous les composants connexion de base de donnes peuvent extraire du serveur de bases de donnes des listes de mtadonnes, bien que le type des mtadonnes extraites est variable. Les mthodes qui extraient les mtadonnes remplissent une liste de chanes avec les noms de diffrentes entits disponibles sur le serveur. Vous pouvez alors utiliser ces informations pour, par exemple, permettre aux utilisateurs de slectionner une table dynamiquement lexcution.
17-14
Guide du dveloppeur
Obtention de mtadonnes
Vous pouvez utiliser un composant TADOConnection pour extraire les mtadonnes des tables et procdures stockes disponibles sur le stockage de donnes ADO. Vous pouvez alors utiliser ces informations pour, par exemple, permettre aux utilisateurs de slectionner une table ou procdure stocke dynamiquement lexcution.
GetTableNames possde deux paramtres : la liste de chanes remplir avec les noms de table et une valeur boolenne qui indique si la liste doit comprendre les tables systme ou les tables ordinaires. Notez que, tous les serveurs nutilisant pas des tables systme pour stocker les mtadonnes, la demande de tables systme peut aboutir la gnration dune liste vide.
Remarque
Pour la plupart des composants connexion de base de donnes, GetTableNames renvoie la liste de toutes les tables non-systme disponibles lorsque le second paramtre a pour valeur False. Dans le cas de TSQLConnection, toutefois, vous contrlez plus facilement les types ajouts la liste lorsque vous ne rcuprez pas uniquement les noms de tables systme. Lorsque vous utilisez TSQLConnection, les types de noms ajouts la liste sont contrls par la proprit TableScope. TableScope indique si la liste doit contenir tout ou partie des lments suivants : tables ordinaires, tables systme, synonymes et vues.
17-15
Obtention de mtadonnes
GetIndexNames est uniquement disponible pour TSQLConnection, bien que la plupart des ensembles de type table possdent une mthode quivalente.
Vous pouvez convertir les descriptions de paramtre ajoutes la liste en lobjet plus courant TParams en appelant la procdure globale LoadParamListItems GetProcedureParams allouant dynamiquement les diffrents enregistrements, votre application doit les librer lorsquelle na plus besoin des informations. La routine globale FreeProcParams peut effectuer cette opration.
Remarque
17-16
Guide du dveloppeur
18
Chapitre 18
Chapitre
Lunit fondamentale pour accder aux donnes est la famille dobjets ensemble de donnes. Les applications utilisent des ensembles de donnes pour tous les accs aux bases de donnes. Un objet ensemble de donnes reprsente un ensemble denregistrements dune base de donnes organis en une table logique. Ces enregistrements peuvent tre issus dune seule table de base de donnes ou peuvent reprsenter les rsultats de lexcution dune requte ou dune procdure stocke. Tous les objets ensemble de donnes utiliss dans des applications de bases de donnes descendent de TDataSet et hritent des champs de donnes, proprits, mthodes et vnements de cette classe. Ce chapitre dcrit les fonctionnalits de TDataSet hrites par les objets ensemble de donnes utiliss dans les applications de bases de donnes. Avant dutiliser tout objet de base de donnes, vous devez avoir assimil ces fonctionnalits partages. TDataSet est un ensemble de donnes virtuel, ce qui signifie que la plupart de ses proprits et mthodes sont dclares comme virtual ou abstract. Une mthode virtuelle est une dclaration de fonction ou de procdure dont limplmentation est redfinie par les objets descendants. Une mthode abstract est une fonction ou une procdure sans vritable implmentation. La dclaration est un prototype qui dcrit une mthode (ainsi que ses paramtres et le type renvoy, le cas chant) devant tre implmente dans tous les objets ensemble de donnes descendants (limplmentation peut tre diffrente pour chaque ensemble de donnes). Etant donn que TDataSet contient des mthodes abstract, vous ne pouvez pas lutiliser directement dans une application sans gnrer derreur dexcution. A la place, soit vous crez des instances des descendants de TDataSet intgrs et les utilisez dans votre application, soit vous drivez votre propre objet ensemble de donnes depuis TDataSet ou depuis ses descendants et crivez des implmentations pour toutes ses mthodes abstract.
18-1
TDataSet dfinit la plupart des fonctionnalits communes tous les objets ensemble de donnes. Ainsi, il dfinit la structure de base de tous les ensembles de donnes : un tableau de composants TField qui correspond aux colonnes dune ou de plusieurs tables de bases de donnes, aux champs de rfrence ou aux champs calculs fournis par votre application. Pour plus dinformations sur les composants TField, voir chapitre 19, Manipulation des composants champ. Ce chapitre dcrit lutilisation des fonctionnalits de bases de donnes courantes associes TDataSet. Gardez cependant lesprit que, bien que TDataSet introduise les mthodes lies ces fonctionnalits, tous les objets dpendants de TDataSet ne les implmentent pas. En particulier, les ensembles de donnes unidirectionnels nen implmentent quun sous-ensemble limit.
18-2
Guide du dveloppeur
de donnes client spcifiques un mcanisme daccs aux donnes (TBDEClientDataSet, TSQLClientDataSet et TIBClientDataSet), qui utilisent un ensemble de donnes source interne. Les fonctionnalits uniques des ensembles de donnes client sont dcrites dans le chapitre 23, Utilisation densembles de donnes client. Les avantages et inconvnients des divers mcanismes daccs aux donnes employs par ces descendants de TDataSet sont dcrits dans Utilisation des bases de donnes la page 14-1. En plus des ensembles de donnes intgrs, vous pouvez crer vos propres descendants TDataSet personnaliss, par exemple pour fournir des donnes partir dun processus autre quun serveur de base de donnes, comme une feuille de calcul. Lcriture densembles de donnes personnaliss vous offre la souplesse de grer les donnes avec la mthode de votre choix tout en continuant dutiliser les contrles donnes de la VCL pour construire votre interface utilisateur. Pour plus dinformations sur la cration de composants personnaliss, voir chapitre 40, Prsentation gnrale de la cration dun composant. Bien que chaque descendant de TDataSet ait ses propres proprits et mthodes uniques, certaines des proprits et mthodes introduites par les classes descendantes sont les mmes que celles introduites par dautres classes descendantes utilisant un autre mcanisme daccs aux donnes. Par exemple, il y a des similitudes entre les divers composants table (TTable, TADOTable, TSQLTable et TIBTable). Pour plus dinformations sur les similitudes introduites par les descendants de TDataSet, voir Types densembles de donnes la page 18-27.
Signification
Lensemble de donnes est ferm. Ses donnes sont indisponibles. Lensemble de donnes est ouvert. Ses donnes peuvent tre vues mais pas modifies. Cest ltat par dfaut dun ensemble de donnes ouvert. Lensemble de donnes est ouvert. La ligne en cours peut tre modifie. (non support par les ensembles de donnes unidirectionnels)
dsEdit
Edition
18-3
Valeurs possibles pour la propri t State des ensembles de donnes (suite) Etat
Insertion
Signification
Lensemble de donnes est ouvert. Une nouvelle ligne peut tre insre. (non support par les ensembles de donnes unidirectionnels) Lensemble de donnes est ouvert. Active la dfinition de portes et de valeurs cl pour les oprations portant sur des portes et les oprations GotoKey. (non support par tous les ensembles de donnes) Lensemble de donnes est ouvert. Indique quun vnement OnCalcFields est en cours. Interdit toute modification de champ non calcul. Lensemble de donnes est ouvert. Indique que la proprit CurValue des champs est lue par un gestionnaire dvnement qui rpond aux erreurs en appliquant des mises jour en mmoire cache. Lensemble de donnes est ouvert. Indique que la proprit NewValue des champs est lue par un gestionnaire dvnement qui rpond aux erreurs en appliquant des mises jour en mmoire cache. Lensemble de donnes est ouvert. Indique que la proprit OldValue des champs est lue par un gestionnaire dvnement qui rpond aux erreurs en appliquant des mises jour en mmoire cache. Lensemble de donnes est ouvert. Indique quune opration de filtrage est en cours. Un ensemble de donnes restreint peut tre visualis, sans quaucune donne ne puisse tre change. (non support par les ensembles de donnes unidirectionnels) Lensemble de donnes est ouvert. Les contrles orients donnes ne sont pas mis jour et les vnements ne sont pas dclenchs lorsque lenregistrement en cours est modifi. Lensemble de donnes est ouvert. Un vnement OnCalcFields est en cours pour des valeurs calcules stockes avec lenregistrement. (uniquement pour les ensembles de donnes client) Lensemble de donnes est dans le processus douverture, mais na pas fini. Cet tat arrive quand lensemble de donnes est ouvert pour une lecture asynchrone.
dsSetKey
Indexation (SetKey)
dsCalcFields
dsCurValue
dsNewValue
NewValue
dsOldValue
OldValue
dsFilter
Filtrage
dsBlockRead
dsInternalCalc
dsOpening
Ouverture
En gnral, une application vrifie ltat de lensemble de donnes pour dterminer le moment deffectuer certaines oprations. Par exemple, vous pouvez chercher ltat dsEdit ou dsInsert pour savoir sil faut valider les mises jour.
Remarque
A chaque fois que ltat dun ensemble de donnes change, lvnement OnStateChange est appel pour tous les composants source de donnes associs. Pour plus dinformations concernant les composants source de donnes et sur OnStateChange, voir Rponse aux modifications effectu es par le biais de la source de donnes la page 15-5.
18-4
Guide du dveloppeur
Quand vous ouvrez lensemble de donnes, celui-ci reoit dabord un vnement BeforeOpen, puis il ouvre un curseur, se remplit lui-mme de donnes et, enfin, reoit un vnement AfterOpen. Lensemble de donnes qui vient dtre ouvert est en mode visualisation, ce qui veut dire que votre application peut lire des donnes et naviguer dans cet ensemble de donnes. Il y a deux faons de fermer un ensemble de donnes, Dfinir la proprit Active de lensemble de donnes par False, soit dans linspecteur dobjets la conception, soit dans le code lexcution :
CustQuery.Active := False;
De mme que lensemble de donnes reoit les vnements BeforeOpen et AfterOpen quand vous louvrez, il reoit les vnements BeforeClose et AfterClose quand vous le fermez. Ces gestionnaires rpondent la mthode Close dun ensemble de donnes. Vous pouvez utiliser ces vnements, par exemple, pour inviter lutilisateur valider les modifications en attente ou les annuler avant de fermer lensemble de donnes. Le code suivant illustre un tel gestionnaire :
procedure TForm1.CustTableVerifyBeforeClose(DataSet: TDataSet); begin if (CustTable.State in [dsEdit, dsInsert]) then begin case MessageDlg(Emettre les modifications avant de fermer?, mtConfirmation, mbYesNoCancel, 0) of mrYes: CustTable.Post; { enregistrer les modifications } mrNo: CustTable.Cancel; { abandonner les modifications } mrCancel: Abort; { annuler la fermeture de lensemble de donnes } end; end; end; Remarque
Il est parfois ncessaire de fermer au pralable lensemble de donnes pour changer certaines de ses proprits, comme la proprit TableName sur un composant TTable. Lorsque vous rouvrez lensemble de donnes, la nouvelle valeur de proprit prend effet.
18-5
Le composant visuel, orient donnes, TDBNavigator, encapsule ces mthodes sous la forme de boutons sur lesquels lutilisateur peut cliquer pour se dplacer parmi les enregistrements lors de lexcution. Pour plus dinformations sur le composant navigateur, voir Navigation et manipulation denregistrements la page 15-33. Chaque fois que vous changez lenregistrement en cours laide dune de ces mthodes (ou dune autre mthode de navigation base sur un critre de recherche), lensemble de donnes reoit deux vnements : BeforeScroll (avant de quitter lenregistrement en cours) et AfterScroll (aprs avoir atteint le nouvel enregistrement). Vous pouvez utiliser ces vnements pour mettre jour votre interface utilisateur (par exemple, pour mettre jour une barre dtat qui donne des informations sur lenregistrement en cours).
18-6
Guide du dveloppeur
TDataSet dfinit deux proprits boolennes qui donnent des indications utiles pour parcourir les enregistrements dun ensemble de donnes.
Tableau 18.3 Proprit
Bof (Dbut de fichier)
La mthode Last place le curseur sur la dernire ligne dun ensemble de donnes et dfinit la proprit Eof par True. Si le curseur est dj sur la dernire ligne, Last na aucun effet. Le code suivant permet daller sur le dernier enregistrement de CustTable :
CustTable.Last; Remarque Conseil
La mthode Last dclenche une exception dans les ensembles de donnes unidirectionnels. Bien quil puisse exister de nombreuses raisons pour aller sur la premire ou sur la dernire ligne dun ensemble de donnes sans que lutilisateur nintervienne, vous pouvez offrir ce dernier la possibilit de naviguer parmi les enregistrements en utilisant le composant TDBNavigator. Le composant navigateur contient des boutons qui, sils sont actifs et visibles, permettent lutilisateur daller sur la premire ou la dernire ligne de lensemble de donnes actif. Les vnements OnClick de ces boutons appellent les mthodes First et Last de lensemble de donnes. Pour plus dinformations concernant le fonctionnement du composant navigateur, voir Navigation et manipulation denregistrements la page 15-33.
18-7
La mthode Prior dplace le curseur dune ligne en arrire dans lensemble de donnes et dfinit la proprit Eof par False si lensemble de donnes nest pas vide. Si le curseur se trouve dj sur la premire ligne dans lensemble de donnes, lorsque vous appelez Prior, celle-ci na aucun effet. Par exemple, le code suivant permet daller sur lenregistrement prcdent de CustTable :
CustTable.Prior; Remarque
La mthode Prior dclenche une exception dans les ensembles de donnes unidirectionnels.
La mthode MoveBy dclenche une exception dans les ensembles de donnes unidirectionnels si vous utilisez un argument ngatif. MoveBy renvoie le nombre de lignes effectivement parcourues. Si le dplacement voulu va au-del du dbut ou de la fin de lensemble de donnes, le nombre de lignes renvoyes par MoveBy sera diffrent de celui voulu pour le dplacement. Cest parce que MoveBy sarrte quand il atteint le premier ou le dernier enregistrement de lensemble de donnes. Le code suivant provoque un dplacement de deux enregistrements vers larrire dans CustTable :
CustTable.MoveBy(-2);
Remarque
Si votre application utilise MoveBy dans un environnement de base de donnes multi-utilisateur, ne perdez pas de vue que les ensembles de donnes sont fluides. Un enregistrement qui se trouvait cinq enregistrements en arrire il y a un instant, peut se retrouver maintenant quatre, six ou mme un nombre
18-8
Guide du dveloppeur
denregistrements inconnu en arrire si plusieurs utilisateurs accdent simultanment la base de donnes et font des modifications.
Eof
Quand la valeur de Eof est True, cela indique que le curseur se trouve sans quivoque sur la dernire ligne de lensemble de donnes. Eof passe True quand une application : Ouvre un ensemble de donnes vide. Russit appeler la mthode Last de lensemble de donnes. Appelle la mthode Next de lensemble de donnes et que son excution choue (car le curseur se trouve dj sur la dernire ligne de lensemble de donnes). Appelle SetRange sur une porte ou un ensemble de donnes vide. Eof vaut False dans tous les autres cas ; vous devez supposer que Eof vaut False sauf si lune des conditions ci-dessus est vrifie et si vous avez test directement la valeur de la proprit. Le test sur Eof se fait gnralement dans une condition de boucle pour contrler le processus itratif sur tous les enregistrements dun ensemble de donnes. Si vous ouvrez un ensemble de donnes contenant plusieurs enregistrements (ou si vous appelez First) Eof vaut False. Pour parcourir un un les enregistrements dun ensemble de donnes, vous devez crer une boucle qui avance sur chaque enregistrement en appelant Next, et se termine quand Eof vaut True. Eof reste False jusqu ce que vous appeliez Next alors que le curseur se trouve dj sur le dernier enregistrement. Lexemple suivant montre lune des faons de programmer une boucle de traitement denregistrements pour un ensemble de donnes appel CustTable :
CustTable.DisableControls; try CustTable.First; { Se positionne sur le premier enregistrement ; Eof devient False } while not CustTable.Eof do { boucle jusqu ce que Eof devienne True } begin { Le traitement de lenregistrement se fait ici } CustTable.Next; { Eof vaut false en cas de russite; Eof vaut True si Next choue sur le dernier enregistrement} end; finally CustTable.EnableControls; end;
18-9
Conseil
Cet exemple montre aussi comment dsactiver puis ractiver des contrles visuels, orients donnes, rattachs lensemble de donnes. Si vous dsactivez les contrles visuels pendant la dure de litration sur lensemble de donnes, le traitement sera acclr car votre application na pas mettre jour le contenu des contrles au fur et mesure de lvolution de lenregistrement en cours. Une fois litration acheve, les contrles doivent tre ractivs pour tre mis jour en fonction de la nouvelle ligne en cours. Notez que lactivation de contrles visuels a lieu dans la clause finally dune instruction try...finally. Cela garantit que les contrles ne resteront pas dsactivs, mme si une exception termine le traitement de la boucle de faon prmature.
Bof
Quand la valeur de Bof est True, cela indique que le curseur se trouve sans quivoque sur la premire ligne de lensemble de donnes. Bof est mis True lorsquune application : Ouvre un ensemble de donnes. Appelle la mthode First de lensemble de donnes. Appelle la mthode Prior de lensemble de donnes et que son excution choue (car le curseur se trouve dj sur la premire ligne de lensemble de donnes). Appelle SetRange sur une porte ou un ensemble de donnes vide. Bof prend la valeur False dans tous les autres cas ; vous devez supposer que Bof vaut False sauf si lune des conditions ci-dessus est vrifie et si vous avez test directement la valeur de la proprit. Comme Eof, Bof peut se trouver dans une condition de boucle pour contrler un processus itratif sur des enregistrements dun ensemble de donnes. Lexemple suivant montre lune des faons de programmer une boucle de traitement denregistrements pour un ensemble de donnes appel CustTable: :
CustTable.DisableControls; { acclre le traitement et empche les rafrachissements cran } try while not CustTable.Bof do { boucle jusqu ce que Bof devienne True } begin { Le traitement de lenregistrement se fait ici } CustTable.Prior; { Bof vaut false en cas de russite; Bof vaut True si Prior choue sur le premier enregistrement } end; finally CustTable.EnableControls; { affiche la nouvelle ligne en cours dans les contrles } end;
18-10
Guide du dveloppeur
Marquage denregistrements
Outre la possibilit de se dplacer dun enregistrement un autre dans un ensemble de donnes (ou de se dplacer selon un nombre dtermin denregistrements), il est possible de marquer un emplacement particulier dans un ensemble de donnes de faon y revenir rapidement le moment voulu. TDataSet introduit une fonction de marquage constitue dune proprit Bookmark et de cinq mthodes de dfinition de signets. TDataSet implmente des mthodes virtuelles de gestion des signets. Bien que ces mthodes garantissent que chaque objet ensemble de donnes driv de TDataSet renvoie une valeur si une mthode de signet est appele, les valeurs renvoyes sont simplement des valeurs par dfaut qui nindiquent pas la position en cours. Les descendants de TDataSet ont des niveaux de support de signets diffrents. Les ensembles de donnes dbExpress ne supportent pas les signets. Les ensembles de donnes ADO peuvent prendre en charge les signets, en fonction des tables de la base de donnes sous-jacente. Les ensembles de donnes BDE, InterBase express et client prennent toujours en charge les signets.
La proprit Bookmark
La proprit Bookmark indique quel est le signet en cours dans votre application. Bookmark est une chane qui identifie le signet en cours. Tout nouveau signet ajout devient le signet en cours.
La mthode GetBookmark
Pour crer un signet, vous devez dclarer une variable de type TBookmark dans votre application, puis appeler GetBookmark pour allouer un espace de stockage la variable et dfinir sa valeur par un emplacement particulier dans lensemble de donnes. Le type TBookmark est un pointeur.
La mthode CompareBookmarks
Vous pouvez aussi appeler CompareBookmarks pour voir si un signet sur lequel vous voulez vous dplacer est diffrent dun autre signet ou du signet en cours. Si les deux signets font rfrence au mme enregistrement (ou si tous les deux sont nil), CompareBookmarks renvoie 0.
La mthode FreeBookmark
FreeBookmark restitue la mmoire alloue un signet lorsquil nest plus ncessaire. Vous devez galement appeler FreeBookmark avant de rutiliser un signet existant.
18-11
Avant dentrer dans le processus de parcours des enregistrements, les contrles sont dsactivs. Mme si une erreur se produit durant le balayage des enregistrements, la clause finally permet dtre sr que les contrles seront toujours ractivs et que le signet sera toujours restitu, mme si la boucle se termine prmaturment.
Certains descendants de TDataSet offrent une famille supplmentaire de mthodes de recherche bases sur un index. Pour plus dinformations sur ces mthodes supplmentaires, voir Utilisation dindex pour chercher des enregistrements la page 18-32.
18-12
Guide du dveloppeur
correspondances de cls partielles. (Correspondances dans lesquelles la chane de critre peut se limiter un prfixe de la valeur de champ.) Par exemple, le code suivant dplace le curseur sur la premire ligne de CustTable pour laquelle la valeur dans la colonne Company est Professional Divers, Ltd. :
var LocateSuccess: Boolean; SearchOptions: TLocateOptions; begin SearchOptions := [loPartialKey]; LocateSuccess := CustTable.Locate(Company, Professional Divers, Ltd., SearchOptions); end;
Si Locate trouve une correspondance, le premier enregistrement contenant cette correspondance devient lenregistrement en cours. Locate renvoie True si une correspondance est trouve et False dans le cas contraire. Si la recherche choue, lenregistrement en cours reste le mme. Le vrai potentiel de Locate se manifeste quand vous effectuez une recherche sur plusieurs colonnes et que vous spcifiez plusieurs valeurs recherches. Celles-ci sont des Variants, et vous pouvez donc sp cifier des types de donnes diffrents pour vos critres de recherche. Pour spcifier plusieurs colonnes dans une chane de recherche, sparez les lments de la chane par des points-virgules. Les valeurs recherches tant des Variants, vous devez soit transmettre un type tableau de Variants comme argument (par exemple, les valeurs renvoyes par la mthode Lookup), soit construire le tableau de Variants la vole en utilisant la fonction VarArrayOf. Le code suivant illustre une recherche sur plusieurs colonnes faisant intervenir de multiples valeurs de recherche et utilisant les correspondances de cls partielles :
with CustTable do Locate(Company;Contact;Phone, VarArrayOf([Sight Diver,P]), loPartialKey);
Locate utilise la mthode de recherche la plus rapide pour trouver les correspondances denregistrements. Si les colonnes de la recherche sont indexes et que lindex est compatible avec les options de recherche spcifies, Locate utilise cet index.
18-13
Professional Divers, Ltd., puis renvoie le nom de la socit, le nom du contact commercial et son numro de tlphone :
var LookupResults: Variant; begin LookupResults := CustTable.Lookup(Company, Professional Divers, Ltd., Company;Contact; Phone); end;
Lookup renvoie les valeurs des champs spcifis du premier enregistrement quelle trouve. Les valeurs sont renvoyes en tant que Variants. Si plusieurs valeurs ont t demandes, Lookup renvoie un tableau de Variants. Sil nexiste aucun enregistrement correspondant, Lookup renvoie un Variant Null. Pour plus dinformations concernant les tableaux de Variants, voir laide en ligne. Le vrai potentiel de Lookup se manifeste quand vous effectuez une recherche sur plusieurs colonnes et que vous spcifiez plusieurs valeurs rechercher. Pour spcifier des chanes contenant plusieurs colonnes ou des champs de rsultats, vous devez sparer les lments de la chane par des points-virgules. Les valeurs recherches tant des Variants, pour transmettre plusieurs valeurs, vous devez soit transmettre un type tableau de Variants comme argument (par exemple, les valeurs renvoyes par la mthode Lookup), soit construire le tableau de Variants la vole en utilisant la fonction VarArrayOf. Le code suivant illustre une recherche sur plusieurs colonnes :
var LookupResults: Variant; begin with CustTable do LookupResults := Lookup(Company; City, VarArrayOf([Sight Diver, Christiansted]), Company; Addr1; Addr2; State; Zip); end;
Comme Locate, Lookup utilise la mthode de recherche la plus rapide pour trouver les correspondances denregistrements. Si les colonnes de la recherche sont indexes, Lookup utilise lindex.
18-14
Guide du dveloppeur
Avec des ensembles de donnes unidirectionnels, vous ne pouvez limiter les enregistrements de lensemble de donnes que par le biais dune requte. Avec dautres descendants de TDataSet, vous pouvez toutefois dfinir un sousensemble dans les donnes dj extraites. Pour limiter laccs dune application un sous-ensemble de tous les enregistrements de lensemble de donnes, vous pouvez utiliser des filtres. Le filtre spcifie des conditions quun enregistrement doit satisfaire pour tre affich. Les conditions de filtre peuvent tre stipules dans la proprit Filter de lensemble de donnes ou codes dans son gestionnaire dvnement OnFilterRecord. Les conditions de filtre sont bases sur les valeurs contenues dans un nombre quelconque de champs dun ensemble de donnes, que ces champs soient indexs ou non. Ainsi, pour ne visualiser que les enregistrements correspondant des entreprises situes en Californie, un filtre simple consistera rechercher les enregistrements contenant la valeur CA dans le champ Etat.
Remarque
Les filtres sont appliqus chaque enregistrement rcupr dans lensemble de donnes. Pour extraire des volumes importants de donnes, il est plus efficace dutiliser une requte pour restreindre la rcupration des enregistrements ou de dfinir une porte sur un ensemble de donnes client indexe plutt que dutiliser des filtres.
1 Crer un filtre. 2 Dfinir des options de filtre pour les tests de filtres bass sur des chanes, si ncessaire. 3 Dfinir la proprit Filtered par True.
Lorsque le filtrage est activ, seuls les enregistrements correspondant au critre de filtre sont disponibles pour une application. Le filtrage est toujours une condition temporaire. Vous pouvez dsactiver le filtrage en dfinissant la proprit Filtered par False.
Cration de filtres
Les deux mthodes suivantes permettent de crer un filtre pour un ensemble de donnes : Spcifiez des conditions de filtre dans la proprit Filter. Filter est particulirement utile pour crer et appliquer des filtres lexcution. Ecrivez un gestionnaire dvnement OnFilterRecord pour les conditions de filtre simples ou complexes. Avec OnFilterRecord, les conditions de filtre sont spcifies en mode conception. A la diffrence de la proprit Filter, qui se limite une seule chane contenant une logique de filtre, lvnement
18-15
OnFilterRecord peut utiliser la logique des branchements et des boucles pour crer des conditions de filtre multiniveaux et complexes. Lorsque vous crez des filtres en utilisant la proprit Filter, votre application peut crer, modifier et appliquer des filtres dynamiquement (en rponse des saisies utilisateur, par exemple). Linconvnient est que les conditions de filtre doivent pouvoir sexprimer dans une seule chane texte, ne peuvent pas utiliser des constructions base de branchements ou de boucles, et que leurs valeurs ne peuvent tre ni testes ni compares des valeurs ne figurant pas encore dans lensemble de donnes. La puissance de lvnement OnFilterRecord rside dans la possibilit pour un filtre dtre complexe et variable, dtre bas sur plusieurs lignes de code utilisant des constructions de branchements et de boucles, et de pouvoir tester et comparer les valeurs de lensemble de donnes avec des valeurs figurant lextrieur de lensemble de donnes, comme le texte dune zone de saisie. Son inconvnient est que le filtre doit tre dfini en mode conception et quil ne peut pas tre modifi en rponse des saisies utilisateur. Vous pouvez toutefois crer plusieurs gestionnaires de filtres et permuter de lun lautre en rponse certaines conditions dapplication. Les sections suivantes dcrivent comment crer des filtres en utilisant la proprit Filter et le gestionnaire dvnement OnFilterRecord.
La valeur de la proprit Filter peut aussi tre dfinie partir du texte saisi dans un contrle. Par exemple, linstruction suivante affecte le texte dune zone de saisie la proprit Filter :
Dataset1.Filter := Edit1.Text;
Vous pouvez aussi crer une chane partir de texte cod en dur et de donnes saisies par lutilisateur dans un contrle :
Dataset1.Filter := State = + QuotedStr(Edit1.Text);
Les enregistrements vierges ne saffichent que sils sont explicitement inclus dans le filtre :
Dataset1.Filter := State <> CA or State = BLANK; Remarque
Aprs avoir spcifi une valeur pour la proprit Filter, pour appliquer le filtre lensemble de donnes, dfinissez la proprit Filtered par True.
18-16
Guide du dveloppeur
Les oprateurs logiques et de comparaison suivants permettent de comparer les valeurs des champs des littraux et des constantes :
Tableau 18.4 Oprateur
< > >= <= = <> AND NOT OR + * / *
En utilisant des combinaisons de ces oprateurs, il est possible de crer des filtres sophistiqus. Par exemple, linstruction suivante vrifie que deux conditions de test sont remplies avant dafficher un enregistrement :
(Custno > 1400) AND (Custno < 1500); Remarque
Lorsque le filtrage est activ, les modifications apportes par lutilisateur peuvent entraner que lenregistrement ne rponde plus aux conditions du filtre. La prochaine fois que lenregistrement sera extrait de lensemble de donnes, il napparatra plus. Dans ce cas, le prochain enregistrement rpondant la condition de filtre devient lenregistrement en cours.
18-17
Par exemple, le filtre suivant affiche uniquement les enregistrements pour lesquels le champ State vaut CA :
procedure TForm1.Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean); begin Accept := DataSet[State].AsString = CA; end;
Quand le filtrage est activ, lensemble de donnes gnre un vnement OnFilterRecord pour chaque enregistrement rcupr. Le gestionnaire dvnement teste chaque enregistrement et seuls ceux rpondant aux conditions de filtre apparaissent dans lapplication. Les performances tant directement drives du nombre de fois que lvnement se dclenche et de la dure du traitement de chaque vnement, il est conseill de rduire autant que possible le code du gestionnaire dvnement OnFilterRecord.
Par exemple, les instructions suivantes dfinissent un filtre qui ignore les diffrences majuscules/minuscules lors de la comparaison des valeurs dun champ State :
FilterOptions := [foCaseInsensitive]; Filter := State = + QuotedStr(CA);
18-18
Guide du dveloppeur
Par exemple, linstruction suivante trouve le premier enregistrement filtr dans un ensemble de donnes :
DataSet1.FindFirst;
Dans la mesure o la proprit Filter a t dfinie ou que vous avez cr un gestionnaire dvnement OnFilterRecord pour votre application, ces mthodes positionnent le curseur sur lenregistrement spcifi, que le filtre soit ou non activ. Si ces mthodes sont appeles lorsque le filtrage nest pas activ, elles provoquent les effets suivants : Le filtrage est temporairement activ. En cas de correspondance, le curseur est positionn sur un enregistrement. Le filtrage est dsactiv.
Remarque
Si le filtrage est dsactiv, si la proprit Filter na pas t dfinie et si aucun gestionnaire dvnement OnFilterRecord na t cr, ces mthodes ont le mme effet que First, Last, Next et Prior. Toutes les mthodes navigationnelles relatives aux filtres positionnent le curseur sur un enregistrement (si un enregistrement correspond au filtre spcifi), le traitent comme lenregistrement en cours et True. Si aucun enregistrement ne correspond au filtre, la position du curseur reste inchange, et les mthodes renvoient False. Vous pouvez vrifier ltat de la proprit Found pour envelopper ces appels et nagir que lorsque Found vaut True. Par exemple, si le curseur est dj positionn sur le dernier enregistrement correspondant de lensemble de donnes lorsque vous appelez FindNext, la mthode renvoie False, et lenregistrement en cours reste le mme.
18-19
Cancel Delete
Modification denregistrements
Un ensemble de donnes doit tre en mode dsEdit pour que lapplication puisse modifier des enregistrements. Dans votre code, vous pouvez utiliser la mthode Edit pour basculer un ensemble de donnes en mode dsEdit si la proprit en lecture seule CanModify de lensemble de donnes vaut True. Quand un ensemble de donnes passe en mode dsEdit, il reoit dabord un vnement BeforeEdit. Une fois le passage en mode dition russi, lensemble de donnes reoit un vnement AfterEdit. En gnral, ces vnements sont utiliss pour mettre jour linterface utilisateur afin quelle indique ltat en cours de lensemble de donnes. Si lensemble de donnes ne peut passer en mode dition pour une raison ou pour une autre, un vnement OnEditError survient, grce auquel vous pouvez informer lutilisateur du problme ou essayer de corriger la situation qui a empch lensemble de donnes de passer en mode dition. Dans les fiches de votre application, certains contrles orients donnes pourront mettre automatiquement votre ensemble de donnes ltat dsEdit si La proprit ReadOnly du contrle vaut False (la valeur par dfaut). La proprit AutoEdit de la source de donnes du contrle vaut True et La proprit CanModify de lensemble de donnes vaut True.
18-20
Guide du dveloppeur
Remarque
Mme si un ensemble de donnes est ltat dsEdit, la modification denregistrements peut chouer pour les bases de donnes SQL si lutilisateur de votre application ne dispose pas des droits daccs SQL appropris. Quand un ensemble de donnes se trouve en mode dsEdit, lutilisateur peut modifier toutes les valeurs de champ de lenregistrement qui apparat dans les contrles orients donnes dune fiche. Les contrles orients donnes, pour lesquels la modification est active automatiquement, appellent Post quand lutilisateur accomplit une action qui change la position du curseur (comme le dplacement vers un autre enregistrement dans une grille). Si vous avez mis un composant navigateur dans votre fiche, lutilisateur peut annuler les modifications en cliquant sur le bouton Annuler du navigateur. Lannulation des modifications renvoie lensemble de donnes ltat dsBrowse. Dans votre code, vous devez valider ou annuler les modifications en appelant les mthodes appropries. Les modifications sont valides par lappel de Post. Vous les annulez en appelant Cancel. Les mthodes Edit et Post sont souvent utilises conjointement. Par exemple,
with CustTable do begin Edit; FieldValues[CustNo] := 1234; Post; end;
Dans lexemple prcdent, la premire ligne du fragment de code place lensemble de donnes en mode dsEdit. La ligne suivante affecte la chane 1234 au champ CustNo de lenregistrement en cours. Pour finir, la dernire ligne crit (met) lenregistrement modifi. Si les mises jour ne sont pas en mmoire cache, les modifications sont crites en retour dans la base de donnes. Si les mises jour sont en mmoire cache, les modifications sont crites dans un tampon temporaire, o elles restent jusqu ce que la mthode ApplyUpdates de lensemble de donnes soit appele.
18-21
Dans les fiches de votre application, les contrles orients donnes grille et navigateur pourront mettre automatiquement votre ensemble de donnes ltat dsInsert si les conditions suivantes sont runies : La proprit ReadOnly du contrle vaut False (la valeur par dfaut). La proprit CanModify de lensemble de donnes vaut True.
Remarque
Mme si un ensemble de donnes est ltat dsInsert, lajout denregistrements peut chouer pour les bases de donnes SQL si lutilisateur de votre application ne dispose pas des droits daccs SQL appropris. Quand un ensemble de donnes se trouve en mode dsInsert, lutilisateur ou bien lapplication peut entrer des valeurs dans les champs associs au nouvel enregistrement. Sauf pour les contrles grille et navigateur, il ny a aucune diffrence apparente entre Insert et Append. Lors dun appel Insert, une ligne vide apparat dans la grille au-dessus de lenregistrement en cours. Lors dun appel Append, la grille dfile jusquau dernier enregistrement de lensemble de donnes, une ligne vide apparat la fin de la grille, et les boutons Suivant et Prcdent sont griss sur tout composant navigateur associ lensemble de donnes. Les contrles orients donnes, pour lesquels linsertion est active automatiquement, appellent Post quand lutilisateur accomplit une action qui change la position du curseur (comme le dplacement vers un autre enregistrement dans une grille). Vous devez sinon appeler Post dans votre code. Post crit le nouvel enregistrement dans la base de donnes ou, si vous utilisez les mises jour en mmoire cache, Post crit lenregistrement dans un cache en mmoire. Pour crire les insertions mises en mmoire cache et les ajouter la base de donnes, appelez la mthode ApplyUpdates de lensemble de donnes.
Insertion denregistrements
Insert ouvre un nouvel enregistrement vide avant lenregistrement en cours, puis positionne le curseur sur ce nouvel enregistrement de faon que les valeurs de champ puissent tre entres par lutilisateur ou par le code de votre application. Quand une application Post (ou ApplyUpdates si vous utilisez les mises jour en mmoire cache), le nouvel enregistrement insr peut tre crit comme suit dans le journal des modifications : Pour les tables Paradox et dBASE indexes, lenregistrement est insr dans lensemble de donnes une position dtermine par lindex. Pour les tables Paradox et dBASE non indexes, lenregistrement est insr dans lensemble de donnes sa position actuelle. Pour les bases de donnes SQL, lemplacement physique de linsertion est spcifique limplmentation. Si la table est indexe, lindex est mis jour avec les donnes du nouvel enregistrement.
18-22
Guide du dveloppeur
Suppression denregistrements
Utilisez la mthode Delete pour supprimer lenregistrement en cours dun ensemble de donnes actif. Quand la mthode Delete est appele,
1 Lensemble de donnes reoit un vnement BeforeDelete. 2 Lensemble de donnes tente de supprimer lenregistrement en cours. 3 Lensemble de donnes revient ltat dsBrowse. 4 Lensemble de donnes reoit un vnement AfterDelete.
Si vous voulez empcher la suppression dans le gestionnaire dvnement BeforeDelete, vous pouvez appeler la procdure globale Abort :
procedure TForm1.TableBeforeDelete (Dataset: TDataset)begin if MessageDlg(Delete This Record?, mtConfirmation, mbYesNoCancel, 0) <> mrYes then Abort; end;
Si Delete choue, elle gnre un vnement OnDeleteError. Si le gestionnaire dvnement OnDeleteError ne peut pas corriger le problme, lensemble de donnes reste dans ltat dsEdit. Si Delete russit, lensemble de donnes revient ltat dsBrowse et lenregistrement suivant celui qui est supprim devient lenregistrement en cours. Si les mises jour sont en mmoire cache, lenregistrement supprim nest enlev de la table de la base de donnes sous-jacente que si vous appelez ApplyUpdates. Si vous avez dot vos fiches dun composant navigateur, les utilisateurs pourront supprimer lenregistrement en cours en cliquant sur le bouton deffacement. Dans votre code, vous devez appeler explicitement Delete pour supprimer lenregistrement en cours.
18-23
La mthodeClose nappelle pas implicitement Post. Utilisez lvnement BeforeClose pour valider explicitement toute modification en suspens.
18-24
Guide du dveloppeur
Pour une fiche, vous pouvez permettre lutilisateur dannuler les oprations de modification, dinsertion, et dajout en incluant le bouton Annuler dans un composant navigateur associ lensemble de donnes, ou bien le code de votre propre bouton dannulation.
Chacune de ces mthodes accepte comme argument un tableau de valeurs, o chaque valeur correspond une colonne de lensemble de donnes sous-jacent. Les valeurs peuvent tre littrales, variables ou NULL. Si le nombre de valeurs de largument est infrieur au nombre de colonnes dans lensemble de donnes, les valeurs restantes sont supposes avoir la valeur NULL. Pour les ensembles de donnes non indexs, AppendRecord ajoute un enregistrement la fin de lensemble de donnes et InsertRecord insre un enregistrement aprs la position en cours du curseur. Pour les ensembles de donnes indexs, les deux mthodes placent lenregistrement la bonne position dans la table, dtermine par lindex. Dans les deux cas, les deux mthodes dplacent le curseur sur le nouvel enregistrement. SetFields affecte les valeurs spcifies dans le tableau de paramtres aux champs de lensemble de donnes. Pour utiliser SetFields, lapplication doit dabord appeler Edit pour mettre lensemble de donnes en mode dsEdit. Pour appliquer les modifications dans lenregistrement en cours, elle doit excuter Post. Si vous utilisez SetFields pour modifier certains champs, et non tous les champs dun enregistrement existant, vous pouvez transmettre des valeurs NULL pour les champs que vous ne voulez pas changer. Si vous ne fournissez pas un
18-25
Champs calculs
nombre de valeurs correspondant au nombre de champs dun enregistrement, SetFields leur affecte la valeur NULL. Les valeurs NULL crasent les valeurs existantes de ces champs. Par exemple, supposons quune base de donnes dispose dune table COUNTRY avec les colonnes Name, Capital, Continent, Area et Population. Si un composant TTable appel CountryTable a t li la table COUNTRY, linstruction suivante insrera un enregistrement dans la table COUNTRY :
CountryTable.InsertRecord([Japan, Tokyo, Asia]);
Cette instruction ne spcifie aucune valeur pour Area et Population, des valeurs NULL leur sont donc affectes. La table est indexe sur Name, lenregistrement est donc insr la position alphabtique de Japan. Pour mettre jour lenregistrement, lapplication peut utiliser le code suivant :
with CountryTable do begin if Locate(Name, Japan, loCaseInsensitive) then; begin Edit; SetFields(nil, nil, nil, 344567, 164700000); Post; end; end;
Ce code affecte des valeurs aux champs Area et Population, avant de les enregistrer dans la base de donnes. Les trois pointeurs NULL agissent comme marqueurs de remplissage des trois premires colonnes pour indiquer que leur contenu actuel doit tre prserv.
Champs calculs
En utilisant lditeur de champs, vous pouvez dfinir des champs calculs pour vos ensembles de donnes. Quand un ensemble de donnes contient des champs calculs, vous fournissez le code calculant les valeurs de ces champs dans un gestionnaire dvnement OnCalcFields. Pour des dtails sur la dfinition des champs calculs en utilisant lditeur de champs, voir Dfinition dun champ calcul la page 19-8. La proprit AutoCalcFields dtermine quand OnCalcFields est appel. Si AutoCalcFields vaut True, OnCalcFields est appel quand : Un ensemble de donnes est ouvert. Lensemble de donnes passe en mode dition. Un enregistrement est rcupr dans la base de donnes. La focalisation se dplace dun composant visuel un autre, ou bien dune colonne une autre dans un contrle grille orient donnes.
18-26
Guide du dveloppeur
Si AutoCalcFields vaut False, alors OnCalcFields nest pas appel quand on modifie individuellement des champs se trouvant lintrieur dun enregistrement (la quatrime condition ci-dessus).
Attention
Comme OnCalcFields est frquemment appel, lexcution du code que vous crivez pour ce gestionnaire doit tre brve. En outre, si AutoCalcFields vaut True, OnCalcFields ne doit accomplir aucune action qui modifie lensemble de donnes (ou lensemble de donnes li sil fait partie dune relation matre-dtail), car cela induit une rcursion. Par exemple, si OnCalcFields excute Post, et que AutoCalcFields True, alors OnCalcFields est nouveau appel, provoquant un nouvel appel Post, etc. Quand OnCalcFields sexcute, lensemble de donnes passe en mode dsCalcFields. Cet tat empche les modifications et les ajouts dans les enregistrements sauf sils sappliquent aux champs calculs modifis par le gestionnaire lui-mme. La raison qui empche dautres modifications est que OnCalcFields utilise les valeurs des autres champs pour driver celles des champs calculs. Sinon, les changements des autres champs pourraient invalider les valeurs affectes aux champs calculs. Lexcution de OnCalcFields acheve, lensemble de donnes revient ltat dsBrowse.
18-27
Les ensembles de donnes de type requte sont TQuery, TADOQuery, TSQLQuery et TIBQuery. Pour utiliser efficacement un ensemble de donnes de type requte, vous devez tre familier de SQL et de limplmentation SQL de votre serveur, y compris des limitations et des extensions du standard SQL-92. Si vous dbutez dans SQL, vous pouvez vous procurer un manuel externe qui traite de SQL en dtail. Un des meilleurs est Understanding the New SQL: A Complete Guide, de Jim Melton et Alan R. Simpson, Morgan Kaufmann Publishers. Ensembles de donnes de type procdure : Les ensembles de donnes de type procdure reprsentent une procdure stocke sur le serveur de base de donnes. Les ensembles de donnes de type procdure sont TStoredProc, TADOStoredProc, TSQLStoredProc et TIBStoredProc. Une procdure stocke est un programme autonome crit dans le langage de procdure et de dclenchement propre au systme de base de donnes utilis. Elles grent, en gnral, les tches trs rptitives sur les bases de donnes et sont particulirement utiles pour les oprations qui sappliquent un grand nombre denregistrements ou qui utilisent des fonctions statistiques et mathmatiques. Les procdures stockes amliorent gnralement les performances des applications de bases de donnes, car : Elles tirent parti de la plus grande puissance et de la plus grande rapidit fournies par le serveur. Elles rduisent le trafic sur le rseau en dplaant le traitement sur le serveur. Les procdures stockes peuvent renvoyer des donnes ou non. Celles qui le font doivent renvoyer les donnes sous forme dun curseur (comme le rsultat dune requte SELECT), sous forme de plusieurs curseurs (en renvoyant rellement plusieurs ensembles de donnes), ou dans des paramtres de sortie. Ces diffrences proviennent en partie du serveur : certains dentre eux nautorisent pas les procdures stockes renvoyer des donnes ou nautorisent que les paramtres de sortie. Certains autres ne supportent pas les procdures stockes. Reportez-vous la documentation de votre serveur pour savoir ce quil propose.
Remarque
Vous pouvez, en gnral, utiliser un ensemble de donnes de type requte pour excuter des procdures stockes car la plupart des serveurs fournissent des extensions SQL permettant de travailler avec les procdures stockes. Mais, chaque serveur utilise pour cela sa propre syntaxe. Si vous choisissez dutiliser un ensemble de donnes de type requte la place dun ensemble de donnes de type procdure stocke, cherchez la syntaxe ncessaire dans la documentation de votre serveur. Outre les ensembles de donnes faisant clairement partie dune de ces trois catgories, quelques descendants de TDataSet appartiennent plusieurs catgories : TADODataSet et TSQLDataSetpossdent une proprit CommandType qui vous permet de spcifier sils reprsentent une table, une requte ou une procdure stocke. Les proprits et les mthodes sont presque les mmes que celles des
18-28
Guide du dveloppeur
ensembles de donnes de type requte, bien que TADODataSet vous permette de spcifier un index comme dans les ensembles de donnes de type table. TClientDataSet reprsente les donnes dun autre ensemble de donnes. De ce fait, il peut reprsenter une table, une requte et une procdure stocke. TClientDataSet se comporte pratiquement comme un ensemble de donnes de type table puisquil supporte les index. Mais, il possde aussi quelques fonctionnalits des requtes et des procdures stockes : la gestion des paramtres et la possibilit de sexcuter sans renvoyer densemble de rsultats. Dautres ensembles de donnes client (TBDEClientDataSet et TSQLClientDataSet ) possdent une proprit CommandType qui vous permet de spcifier sils reprsentent une table, une requ te ou une procdure stocke. Les proprits et mthodes sont comme TClientDataSet , y compris le support des paramtres, des index, et la possibilit de sexcuter sans renvoyer densemble de rsultats. TIBDataSet peut reprsenter la fois des requtes et des procdures stockes. En fait, il peut reprsenter plusieurs requ tes et procdures stockes simultanment, sans quil y ait des proprits diffrentes pour chacune.
1 Placez le composant appropri dans un module de donnes ou sur une fiche, et attribuez sa proprit Name une valeur unique approprie votre application. 2 Identifiez le serveur de base de donnes qui contient les donnes utiliser. Chaque ensemble de donnes de type table fait cela diffremment, mais, en gnral, il faut spcifier un composant de base de donnes :
Pour TTable, spcifiez un composant TDatabase ou un alias BDE en utilisant la proprit DatabaseName. Pour TADOTable, spcifiez un composant TADOConnection en utilisant la proprit Connection. Pour TSQLTable, spcifiez un composant TSQLConnection en utilisant la proprit SQLConnection. Pour TIBTable, spcifiez un composant TIBConnection en utilisant la proprit Database. Pour plus dinformations sur lutilisation des composants connexion aux bases de donnes, voir chapitre 17, Connexion aux bases de donnes.
3 Dfinissez la proprit TableName par le nom de la table de la base de donnes. Vous pouvez slectionner des tables dans une liste droulante si vous avez dj identifi un composant connexion aux bases de donnes.
18-29
4 Placez un composant source de donnes dans le module de donnes ou sur la fiche, et dfinissez sa proprit DataSet par le nom de lensemble de donnes. Le composant source de donnes est utilis pour transmettre un ensemble de rsultats afficher entre lensemble de donnes et les composants orients donnes.
De plus, la relation un--un entre les ensembles de donnes de type table et les tables de bases de donnes permet nombre dentre eux dtre utiliss pour les oprations suivantes : Contrle des accs en lecture/criture aux tables Cration et suppression des tables Vidage des tables Synchronisation des tables
18-30
Guide du dveloppeur
dindex valides. Par exemple, le code suivant remplit une bote liste des noms de tous les index dfinis pour lensemble de donnes CustomersTable :
CustomersTable.GetIndexNames(ListBox1.Items); Remarque
Pour les tables Paradox, lindex primaire nest pas nomm et nest donc pas renvoy par GetIndexNames. Vous pouvez quand mme redfinir en index primaire lindex dune table Paradox, lorsque vous avez utilis un autre index, en dfinissant la proprit IndexName par une chane vide. Pour obtenir des informations sur les champs de lindex en cours, utilisez les proprits IndexFieldCount, qui dtermine le nombre de colonnes de lindex. IndexFields, qui examine la liste des composants champ des colonnes qui constituent lindex. Le code suivant illustre lutilisation des proprits IndexFieldCount et IndexFields pour parcourir une liste de noms de colonnes dans une application :
var I: Integer; ListOfIndexFields: array[0 to 20} of string; begin with CustomersTable do begin for I := 0 to IndexFieldCount - 1 do ListOfIndexFields[I] := IndexFields[I].FieldName; end; end;
Remarque
IndexFieldCount nest pas valide pour une table dBASE ouverte sur une expression dindex.
18-31
IndexName et IndexFieldNames sexcluent mutuellement. Dfinir la valeur de lune efface la valeur de lautre. La valeur de IndexFieldNames est de type string. Pour spcifier un ordre de tri, indiquez chacun des noms de colonnes dans lordre o ils doivent tre utiliss en les dlimitant par des points-virgules. Le tri est uniquement croissant. La distinction majuscules/minuscules du tri dpend des capacits de votre serveur. Consultez la documentation de votre serveur pour davantage dinformations. Le code suivant dfinit lordre de tri de PhoneTable selon LastName, puis FirstName :
PhoneTable.IndexFieldNames := LastName;FirstName;
Remarque
Si vous utilisez IndexFieldNames sur des tables Paradox ou dBASE, lensemble de donnes tente de trouver un index utilisant les colonnes que vous avez spcifies. Sil nen trouve pas, il dclenche une exception.
18-32
Guide du dveloppeur
Indexation (SetKey)
GotoKeyet FindKey sont des fonctions boolennes qui, en cas de succs, placent le curseur sur un enregistrement correspondant et renvoient True. Si la recherche naboutit pas, le curseur nest pas dplac et ces fonctions renvoient False. GotoNearest et FindNearest provoquent toujours le repositionnement du curseur sur la premire correspondance exacte trouve ou, si aucune correspondance nest trouve, sur le premier enregistrement suprieur au critre de recherche spcifi.
1 Spcifiez lindex utiliser pour la recherche. Cest le mme index qui trie les enregistrements dans lensemble de donnes (voir Tri des enregistrements avec des index la page 18-30). Pour spcifier lindex, utilisez les proprits IndexName ou IndexFieldNames. 2 Ouvrez lensemble de donnes. 3 Mettez lensemble de donnes client ltat dsSetKey en appelant la mthode SetKey. 4 Spcifiez la ou les valeurs rechercher dans la proprit Fields. Fields est un objet TFields, qui gre une liste indexe de composants champ auxquels vous pouvez accder en spcifiant les numros ordinaux correspondant chaque colonne. Le premier numro de colonne dun ensemble de donnes est 0. 5 Recherchez et accdez au premier enregistrement trouv avec GotoKey ou GotoNearest.
Par exemple, le code ci-dessous, quand il est rattach lvnement OnClick dun bouton, utilise la mthode GotoKey pour passer au premier enregistrement dont la valeur du premier champ de lindex correspond exactement au texte de la zone de saisie :
procedure TSearchDemo.SearchExactClick(Sender: TObject); begin ClientDataSet1.SetKey; ClientDataSet1.Fields[0].AsString := Edit1.Text; if not ClientDataSet1.GotoKey then ShowMessage(Enregistrement non trouv); end;
18-33
GotoNearest est similaire. Elle recherche la premire occurrence correspondant une valeur de champ partielle. Elle ne peut tre utilise que pour des champs chane. Par exemple,
Table1.SetKey; Table1.Fields[0].AsString := Sm; Table1.GotoNearest;
Sil existe un enregistrement dont la valeur du premier champ index commence par les lettres Sm, le curseur se positionne dessus. Sinon, la position du curseur ne change pas et GotoNearest renvoie False.
1 Spcifiez lindex utiliser pour la recherche. Cest le mme index qui trie les enregistrement dans lensemble de donnes (voir Tri des enregistrements avec des index la page 18-30). Pour spcifier lindex, utilisez les proprits IndexName ou IndexFieldNames. 2 Ouvrez lensemble de donnes. 3 Recherchez et accdez au premier enregistrement correspondant plus proche avec FindKey ou FindNearest. Les deux mthodes ne quun seul argument : une liste de valeurs de champ dlimites virgules (chaque valeur correspond une colonne dindex de la jacente).
Remarque
18-34
Guide du dveloppeur
En ce qui concerne les ensembles de donnes de type table avec des cls multicolonnes, vous ne pouvez rechercher les valeurs que dans des colonnes contigus, en commenant par la premire. Par exemple, pour une cl portant sur trois colonnes, vous pouvez rechercher des valeurs dans la premire colonne, puis dans la premire et la seconde, ou bien dans la premire, la seconde et la troisime, mais pas seulement dans la premire et la troisime.
18-35
Un filtre est compos dun ensemble denregistrements qui partagent les valeurs spcifies, indpendamment de lindexation. Supposons que vous souhaitiez appliquer un filtre sur une base de donnes demploys vivant en Californie et ayant travaill depuis au moins cinq ans dans lentreprise. Bien quils puissent utiliser les index lors de leur application, les filtres ne dpendent pas deux. Les filtres sont appliqus enregistrement par enregistrement au fur et mesure quune application parcourt un ensemble de donnes. En principe, les filtres sont plus souples que les portes. Toutefois, les portes peuvent tre plus efficaces lorsque les ensembles de donnes sont trs grands et que les enregistrements susceptibles dintresser lapplication se trouvent dj dans des groupes dindex contigus. Pour les trs grands ensembles de donnes, il est souvent plus efficace dutiliser la clause WHERE dune requte pour slectionner les donnes. Pour plus de dtails sur la spcification dune requte, voir Utilisation densembles de donnes de type requte la page 18-49.
Spcification de portes
Deux moyens sexcluant mutuellement permettent de spcifier une porte : Spcifiez le dbut et la fin sparment en utilisant SetRangeStart et SetRangeEnd. Spcifier les valeurs des deux extrmits simultanment en utilisant SetRange.
Ce code vrifie que le texte saisi dans EndVal nest pas NULL avant daffecter des valeurs Fields. Si le texte saisi dans StartVal vaut NULL, tous les enregistrements partir du dbut de lensemble de donnes seront inclus,
18-36
Guide du dveloppeur
puisque toutes les valeurs sont suprieures une valeur NULL. Par contre, si le texte entr dans EndVal a une valeur NULL, aucun enregistrement ne sera inclus, puisquaucun ne peut tre infrieur cette valeur. Pour un index plusieurs colonnes, vous pouvez spcifier une valeur de dpart pour tous les champs de lindex ou pour certains de ces champs. Si aucune valeur nest fournie pour lun des champs utilis dans lindex, une valeur NULL est affecte au champ lors de lapplication de la porte. Si vous essayez de dfinir une valeur pour un champ ne figurant pas dans lindex, lensemble de donnes dclenche une exception.
Conseil
Pour commencer au dbut de lensemble de donnes, nappelez pas SetRangeStart. Pour mettre fin la spcification du dbut de la porte, appelez SetRangeEnd ou appliquez ou annulez la porte. Pour plus dinformations sur lapplication et lannulation des portes, voir Application ou annulation dune porte la page 18-40.
Pour quune porte se termine sur le dernier enregistrement de lensemble de donnes, spcifiez des valeurs de fin. Si vous ne fournissez pas de valeur de fin, Delphi suppose sinon que la valeur de fin est une valeur NULL. Une porte contenant des valeurs de fin NULL est toujours vide. La faon la plus simple daffecter des valeurs de fin de porte est dappeler la mthode FieldByName. Par exemple,
with Contacts do begin SetRangeStart; FieldByName(LastName).AsString := Edit1.Text; SetRangeEnd; FieldByName(LastName).AsString := Edit2.Text; ApplyRange; end;
Comme dans la spcification des valeurs de dbut de porte, si vous essayez de dfinir une valeur pour un champ ne figurant pas dans lindex, lensemble de donnes dclenche une exception. Pour mettre fin la spcification de fin de la porte, appliquez ou annulez la porte. Pour plus dinformations sur lapplication et lannulation des portes, Application ou annulation dune porte la page 18-40.
18-37
Pour un index plusieurs colonnes, vous pouvez spcifier une valeur de dpart et de fin pour tous les champs de lindex ou pour certains de ces champs. Si aucune valeur nest fournie pour lun des champs utilis dans lindex, une valeur NULL est affecte au champ lors de lapplication de la porte. Pour ne pas spcifier de valeur pour le premier champ de lindex et spcifier des valeurs pour les champs suivants, passez une valeur NULL ou une valeur vide au premier champ. Spcifiez toujours des valeurs de fin pour une porte, mme si vous voulez quelle se termine sur le dernier enregistrement de lensemble de donnes. Lensemble de donnes suppose sinon que la valeur de fin est une valeur NULL. Une porte contenant des valeurs de fin NULL est toujours vide car la porte de dpart est suprieure ou gale la porte de fin.
Ce code inclut tous les enregistrements dans une porte o LastName est suprieur ou gal Smith. La spcification des valeurs peut galement se prsenter ainsi :
Contacts[LastName] := Sm;
Cette instruction inclut les enregistrements o LastName est suprieur ou gal Sm.
18-38
Guide du dveloppeur
Si vous prfrez, vous pouvez donner la proprit KeyExclusive dun ensemble de donnes la valeur True pour quelle exclue les enregistrements gaux la porte de fin. Par exemple,
Contacts.KeyExclusive := True; Contacts.SetRangeStart; Contacts[LastName] := Smith; Contacts.SetRangeEnd; Contacts[LastName] := Tyler; Contacts.ApplyRange;
Ce code inclut tous les enregistrements dune porte pour lesquels LastName est suprieur ou gal Smith et infrieur Tyler.
1 Mettez lensemble de donnes ltat dsSetKey et modifiez la valeur de dbut de lindex pour la porte. 2 Modifiez la valeur de fin de lindex pour la porte. 3 Appliquez la porte lensemble de donnes.
Vous pouvez modifier les valeurs de dbut ou de fin dune porte, ou bien modifier les deux la fois. Si vous modifiez les conditions relatives aux limites dune porte actuellement applique lensemble de donnes, les modifications ne sont pas appliques tant que vous navez pas rappel ApplyRange.
Si vous avez initialement cr une porte de dbut base sur une cl partielle, vous pouvez utiliser EditRangeStart pour tendre la valeur de dbut de la porte. Pour plus dinformations sur les portes bases sur des cls partielles, voir Spcification dune porte partir de cls partielles la page 18-38.
18-39
18-40
Guide du dveloppeur
Chacune de ces approches prsente ses propres avantages. La liaison des curseurs vous permet de crer des relations matre/dtail dans lesquelles la table matre est un ensemble de donnes de nimporte quel type. Avec les dtails imbriqus, le type densemble de donnes qui peut agir en tant que table dtail est limit, mais ils offrent davantage de faons dafficher les donnes. Si le matre est un ensemble de donnes client, les dtails imbriqus fournissent un mcanisme plus robuste pour lapplication des mises jour en mmoire cache.
Pour crer des liens fiables entre deux ensembles de donnes, vous pouvez utiliser le concepteur de liaisons de champs. Pour ce faire, aprs avoir spcifi un MasterSource et un index, double-cliquez sur la proprit MasterFields dans linspecteur dobjets. En suivant les procdures dcrites ci-dessous, vous pourrez crer une fiche dans laquelle un utilisateur pourra parcourir les enregistrements sur des clients et affichera toutes les commandes passes par le client en cours. La table matre est CustomersTable, la table dtail OrdersTable. Lexemple utilise le composant BDE TTable, mais vous pouvez utiliser les mmes mthodes pour lier nimporte quels ensembles de donnes de type table.
1 Placez deux composants TTable et deux composants TDataSource dans un module de donnes. 2 Dfinissez les proprits du premier composant TTable comme suit :
DatabaseName : DBDEMOS
18-41
6 Placez deux composants TDBGrid sur une fiche. 7 Choisissez Fichier|Utiliser lunit pour indiquer que la fiche doit utiliser le module de donnes. 8 Donnez la proprit DataSource de la premire grille la valeur CustSource, et donnez la proprit DataSource de la deuxime grille la valeur OrdersSource. 9 Dfinissez la proprit MasterSource de OrdersTable par CustSource. Cela lie la table CUSTOMER (la table matre) la table ORDERS (la table dtail). 10 Double-cliquez dans la zone de la valeur de la proprit MasterFields dans linspecteur dobjets pour appeler le concepteur de liaisons de champs afin de dfinir les proprits suivantes :
Dans le champ Index disponibles, choisissez CustNo pour lier les deux tables sur le champ CustNo. Slectionnez CustNo dans les deux listes de champs Champs dtail et Champs matre. Cliquez sur Ajouter pour ajouter cette condition de jointure. Dans la liste Champs joints, CustNo -> CustNo apparat. Cliquez sur OK pour valider vos slections et quitter le concepteur de liaisons de champs.
11 Dfinissez les proprits Active de CustomersTable et de OrdersTable par True pour afficher les donnes dans les grilles de la fiche. 12 Compilez lapplication et excutez-la.
Si vous lancez lapplication maintenant, vous pouvez constater que les tables sont lies et que quand vous vous dplacez sur un nouvel enregistrement de la table CUSTOMER, seuls apparaissent les enregistrements de la table ORDERS appartenant au client en cours.
18-42
Guide du dveloppeur
Pour TClientDataSet, lutilisation des ensembles dtail imbriqus simpose si vous souhaitez appliquer les mises jour partir de tables matre et dtail dans un serveur de base de donnes. Pour utiliser des ensembles dtail imbriqus, la proprit ObjectView de lensemble de donnes client doit tre True. Lorsque votre ensemble de donnes de type table contient des ensembles de donnes dtail imbriqus, TDBGrid permet dafficher les dtails imbriqus dans une fentre surgissante. Pour plus dinformations, voir Affichage des champs ensemble de donnes la page 19-30. Vous pouvez aussi afficher et diter ces ensembles de donnes dtail dans des contrles orients donnes en utilisant un composant ensemble de donnes spar pour lensemble dtail. A la conception, crez des champs persistants pour les champs de votre ensemble de donnes (matre), en utilisant lditeur de champs : cliquez avec le bouton droit sur lensemble de donnes matre et choisissez Editeur de champs. Ajoutez un nouveau champ persistant votre ensemble de donnes client en cliquant avec le bouton droit et en choisissant Ajouter des champs. Dfinissez votre nouveau champ avec le type champ ensemble de donnes. Dans lditeur de champs, dfinissez la structure de la table dtail. Vous devez aussi ajouter des champs persistants pour tous les autres champs utiliss dans votre ensemble de donnes dtail. Le composant ensemble de donnes pour la table dtail est un ensemble de donnes descendant dun type autoris pour la table matre. Les composants TTable acceptent uniquement les composantsTNestedDataSet comme ensembles de donnes imbriqus. Les composants TSQLTable acceptent dautres composants TSQLTable. Les composants TClientDataset acceptent dautres ensembles de donnes client. Choisissez un ensemble de donnes du type appropri dans la palette de composants et ajoutez-le votre fiche ou votre module de donnes. Affectez la proprit DataSetField de cet ensemble de donnes dtail le champ persistant DataSet de lensemble de donnes matre. Enfin, placez un composant source de donnes dans le module de donnes ou sur la fiche, et dfinissez sa proprit DataSet par lensemble de donnes dtail. Les contrles orients donnes peuvent utiliser cette source de donnes pour accder aux donnes de lensemble de donnes dtail.
18-43
Ce nest pas vrai pour TClientDataSet, qui dtermine si les utilisateurs peuvent modifier des donnes partir dinformations procures par le fournisseur de lensemble de donnes avec les paquets de donnes. Ce nest pas vrai non plus pour TSQLTable, qui est un ensemble de donnes unidirectionnel, et donc toujours en lecture seule. Quand une table souvre, vous pouvez vrifier la proprit CanModify pour savoir si la base de donnes sous-jacente (ou le fournisseur de lensemble de donnes) autorise les utilisateurs modifier les donnes de la table. Si CanModify vaut False, lapplication ne peut pas crire dans la base de donnes. Si CanModify vaut True, votre application peut crire dans la base de donnes si la proprit ReadOnly de la table vaut False. ReadOnly dtermine si un utilisateur peut la fois voir et modifier les donnes. Quand ReadOnly vaut False (valeur par dfaut), un utilisateur peut la fois voir et modifier les donnes. Pour limiter un utilisateur la visualisation des donnes, dfinissez ReadOnly par True avant douvrir la table.
Remarque
ReadOnly est implmente sur tous les ensembles de type table, lexception de TSQLTable, qui est toujours en lecture seule.
Cration de tables
TTable et TIBTable vous permettent tous deux de crer la table de base de donnes sous-jacente sans utiliser SQL. De mme, TClientDataSet vous permet de crer un ensemble de donnes quand vous ne travaillez pas avec un fournisseur densemble de donnes. En utilisant TTable et TClientDataSet, vous pouvez crer la table pendant la conception ou pendant lexcution. TIBTable vous permet de crer des tables uniquement lexcution.
18-44
Guide du dveloppeur
Avant de crer la table, vous devez dfinir des proprits pour spcifier la structure de la table que vous crez. En particulier, vous devez spcifier : La base de donnes qui contiendra la nouvelle table. Pour TTable, vous spcifiez la base de donnes en utilisant la proprit DatabaseName. Pour TIBTable, vous devez utiliser un composant TIBDataBase, qui est affect la proprit Database. (Les ensembles de donnes client nutilisent pas de base de donnes.) Le type de base de donnes (TTable seulement). Dfinissez la proprit TableType par le type de table souhait. Pour les tables Paradox, dBASE ou ASCII, dfinissez TableType par ttParadox, ttDBase ou ttASCII, respectivement. Pour tous les autres types de tables, dfinissez TableType par ttDefault. Le nom de la table que vous voulez crer. TTable et TIBTable ont tous deux une proprit TableName pour stocker le nom de la nouvelle table. Les ensembles de donnes client nutilisent pas de nom de table, mais vous devez spcifier la proprit FileName avant denregistrer la nouvelle table. Si vous crez une table qui reprend le nom dune table existante, la table existante et toutes ses donnes sont remplaces par la nouvelle table. Lancienne table et ses donnes ne peuvent pas tre rcupres. Pour viter de remplacer une table existante, vous devez vrifier la proprit Exists lexcution. Exists est disponible uniquement sur TTable et TIBTable. Les champs de la nouvelle table. Pour ce faire, vous pouvez procder de deux faons : Vous pouvez ajouter des dfinitions de champs la proprit FieldDefs. En conception double-cliquez sur la proprit FieldDefs dans linspecteur dobjets pour afficher lditeur de collection. Utilisez lditeur de collection pour ajouter, supprimer ou modifier les proprits de dfinitions de champs. A lexcution, effacez toutes les dfinitions de champs existantes et utilisez ensuite la mthode AddFieldDef pour ajouter chaque nouvelle dfinition de champ. Pour chaque nouvelle dfinition de champ, dfinissez les proprits de lobjet TFieldDef pour spcifier les attributs du champ. Vous pouvez utiliser la place des composants champs persistants. En conception double-cliquez sur lensemble de donnes pour afficher lditeur de champs. Dans lditeur de champs, cliquez avec le bouton droit et choisissez la commande Nouveau champ. Dcrivez les principales proprits de votre champ. Une fois que le champ est cr, vous pouvez modifier ses proprits dans linspecteur dobjets en le slectionnant dans lditeur de champs. Les index de la nouvelle table (facultatif). En conception double-cliquez sur la proprit IndexDefs dans linspecteur dobjets pour afficher lditeur de collection. Utilisez lditeur de collection pour ajouter, supprimer ou modifier les proprits de dfinitions dindex. A lexcution, effacez toutes les dfinitions dindex existantes et utilisez ensuite la mthode AddIndexDef pour ajouter chaque nouvelle dfinition dindex. Pour chaque nouvelle dfinition dindex, dfinissez les proprits de lobjet TIndexDef pour spcifier les attributs de lindex.
18-45
Remarque
Vous ne pouvez pas dfinir dindex pour la nouvelle table si vous utilisez des composants champ persistant au lieu dobjets dfinition de champ. Pour crer la table pendant la conception, cliquez avec le bouton droit sur lensemble de donnes et choisissez Crer table (TTable) ou Crer ensemble de donnes (TClientDataSet ). Cette commande napparat pas dans le menu contextuel tant que navez pas spcifi toutes les informations ncessaires. Pour crer la table lexcution, appelez la mthode CreateTable (TTable et TIBTable) ou la mthode CreateDataSet (TClientDataSet).
Remarque
Vous pouvez tablir les dfinitions pendant la conception, puis appeler la mthode CreateTable (ou CreateDataSet) lexcution pour crer la table. Cependant, pour faire cela vous devrez indiquer que les dfinitions spcifies lexcution seront enregistres avec le composant ensemble de donnes. (par dfaut, les dfinitions de champs et dindex sont gnres de faon dynamique lexcution). Spcifiez que les dfinitions doivent tre enregistres avec lensemble de donnes en dfinissant sa proprit StoreDefs par True. Si vous utilisez TTable, vous pouvez pr-charger les dfinitions de champs et dindex dune table existante pendant la conception. Dfinissez les proprits DatabaseName et TableName pour spcifier la table existante. Cliquez avec le bouton droit sur le composant table et choisissez Mettre jour la dfinition de table. Cela dfinit automatiquement les valeurs des proprits FieldDefs et IndexDefs pour dcrire les champs et les index de la table existante. Ensuite, rinitialisez DatabaseName et TableName pour spcifier la table que vous voulez crer, en annulant toutes les demandes de renommer la table existante. Quand vous crez des tables Oracle8, vous ne pouvez pas crer de champs objets (champs ADT, champs de tableaux et champs densembles de donnes). Le code suivant cre une nouvelle table lexcution et lassocie lalias DBDEMOS. Avant de crer la nouvelle table, il vrifie que le nom de la table fourni ne correspond pas au nom dune table existante :
var TableFound: Boolean; begin with TTable.Create(nil) do // cre un composant TTable temporaire begin try { dfinit les proprits du composant TTable temporaire } Active := False; DatabaseName := DBDEMOS; TableName := Edit1.Text; TableType := ttDefault; { dfinit les champs de la nouvelle table } FieldDefs.Clear; with FieldDefs.AddFieldDef do begin Name := First; DataType := ftString; Size := 20; Required := False; end; with FieldDefs.AddFieldDef do begin
Conseil
Remarque
18-46
Guide du dveloppeur
Name := Second; DataType := ftString; Size := 30; Required := False; end; { dfinit les index de la nouvelle table } IndexDefs.Clear; with IndexDefs.AddIndexDef do begin Name := ; Fields := First; Options := [ixPrimary]; end; TableFound := Exists; // vrifie si la table existe dj if TableFound then if MessageDlg(Remplacer la table existante + Edit1.Text + ?, mtConfirmation, mbYesNoCancel, 0) = mrYes then TableFound := False; if not TableFound then CreateTable; // cre la table finally Free; // dtruit le composant TTable temporaire la fin end; end; end;
Suppression de tables
TTable et TIBTable vous permettent de supprimer des tables de la base de donnes sous-jacente sans utiliser SQL. Pour supprimer une table lexcution, appelez la mthode DeleteTable de lensemble de donnes. Par exemple, linstruction suivante supprime la table sous-jacente dun ensemble de donnes :
CustomersTable.DeleteTable; Attention
Quand vous supprimez une table avec DeleteTable, la table et toutes ses donnes disparaissent. Si vous utilisez TTable, vous pouvez aussi supprimer des tables pendant la conception : cliquez avec le bouton droit sur le composant table et slectionnez Supprimer une table dans le menu contextuel. Loption de menu Supprimer une table nest prsente que si le composant table reprsente une table de base de donnes existante (les proprits DatabaseName et TableName spcifient une table existante).
18-47
Pour TSQLTable, vous pouvez aussi utiliser la mthode DeleteRecords. Notez, cependant, que la version TSQLTable de DeleteRecords ne prend jamais de paramtre.
PhoneTable.DeleteRecords;
Pour les ensembles de donnes client, vous pouvez utiliser la mthode EmptyDataSet .
PhoneTable.EmptyDataSet; Remarque Attention
Pour les tables des serveurs SQL, ces mthodes russissent uniquement si vous avez le privilge DELETE pour cette table. Quand vous videz un ensemble de donnes, les donnes que vous supprimez disparaissent dfinitivement.
Si votre application doit synchroniser des ensembles de donnes de cette manire, placez les ensembles de donnes dans un module de donnes et ajoutez lunit du module de donnes la clause uses de chaque unit qui accde aux tables. Pour synchroniser des ensembles de donnes de fiches distinctes, vous devez ajouter lunit dune fiche la clause uses de lautre, et qualifier au moins un des ensembles de donnes par le nom de sa fiche. Par exemple :
CustomerTableOne.GotoCurrent(Form2.CustomerTableTwo);
18-48
Guide du dveloppeur
1 Placez le composant appropri dans un module de donnes ou sur une fiche, et attribuez sa proprit Name une valeur unique approprie votre application. 2 Identifiez le serveur de base de donnes qui envoyer la requte. Chaque ensemble de donnes de type requte fait cela diffremment, mais, en gnral, il faut spcifier un composant de base de donnes :
Pour TQuery, spcifiez un composant TDatabase ou un alias BDE en utilisant la proprit DatabaseName. Pour TADOQuery, spcifiez un composant TADOConnection en utilisant la proprit Connection. Pour TSQLQuery, spcifiez un composant TSQLConnection en utilisant la proprit SQLConnection. Pour TIBQuery, spcifiez un composant TIBConnection en utilisant la proprit Database. Pour plus dinformations sur lutilisation des composants connexion aux bases de donnes, voir chapitre 17, Connexion aux bases de donnes.
3 Spcifiez une instruction SQL dans la proprit SQL de lensemble de donnes et, ventuellement, spcifiez les paramtres de linstruction. Pour plus dinformations, voir Spcification de la requte la page 18-50 et Utilisation de paramtres dans les requtes la page 18-52. 4 Si les donnes de la requte doivent tre utilises avec des contrles de donnes visuels, ajoutez un composant source de donnes au module de donnes et dfinissez sa proprit DataSet par lensemble de donnes de type requte. Le composant source de donnes suit les rsultats de la requte (que lon appelle ensemble de rsultats) que les composants orients donnes affichent. Connectez les composants orients donnes la source de donnes laide de leurs proprits DataSource et DataField. 5 Activez le composant requte. Pour les requtes qui renvoient un ensemble de rsultats, utilisez la proprit Active ou la mthode Open. Pour excuter des requtes qui effectuent seulement une action sur une table et ne renvoient aucun ensemble de rsultats, utilisez la mthode ExecSQL lexcution. Si vous prvoyez dexcuter la requ te plusieurs fois, vous pouvez appeler Prepare pour initialiser la couche daccs aux donnes et les valeurs des paramtres de liaison dans la requte. Pour plus dinformations sur la prparation dune requte, voir Prparation des requtes la page 18-56.
18-49
Spcification de la requte
Pour les vritables ensembles de donnes de type requte, vous utilisez la proprit SQL pour sp cifier linstruction SQL excuter par lensemble de donnes. Certains ensembles de donnes, comme TADODataSet, TSQLDataSet, et les ensembles de donnes client, utilisent une proprit CommandText pour faire la mme chose. La plupart des requtes qui renvoient des enregistrements sont des commandes SELECT. Gnralement, elles dfinissent les champs inclure, les tables dans lesquelles les slectionner, les conditions qui limitent les enregistrements inclure, lordre de lensemble de donnes rsultant. Par exemple :
SELECT CustNo, OrderNo, SaleDate FROM Orders WHERE CustNo = 1225 ORDER BY SaleDate
Les requtes qui ne renvoient pas denregistrements contiennent des instructions qui utilisent des instructions DDL (langage de dfinition des donnes) ou DML (langage de manipulation des donnes) autres que les instructions SELECT (Par exemple, les commandes INSERT, DELETE, UPDATE, CREATE INDEX et ALTER TABLE ne renvoient aucun enregistrement). Le langage utilis dans les commandes est spcifique au serveur mais gnralement conforme au standard SQL-92 du langage SQL. La commande SQL que vous excutez doit tre acceptable pour le serveur que vous utilisez. Les ensembles de donnes nvaluent pas la commande SQL et ne lexcutent pas. Ils transmettent simplement la commande au serveur pour son excution. Dans la plupart des cas, la commande SQL doit tre constitue dune seule instruction SQL complte, mme si cette instruction peut tre aussi complexe que ncessaire (par exemple, une instruction SELECT avec une clause WHERE qui utilise plusieurs oprateurs logiques imbriqus comme AND et OR). Certains serveurs supportent galement la syntaxe batch qui autorise plusieurs instructions ; si votre serveur supporte cette syntaxe, vous pouvez entrer plusieurs instructions pour spcifier la requte. Les instructions SQL utilises par les requtes peuvent tre textuelles ou peuvent contenir des paramtres remplacer. Les requtes qui utilisent des paramtres sont appeles requtes paramtres. Quand vous utilisez des requtes paramtres, les valeurs relles affectes aux paramtres sont insres dans la requte avant dexcuter cette dernire. Lutilisation des requtes paramtres est trs souple, car vous pouvez, lexcution, changer la vue dun utilisateur et accder aux donnes la vole, sans avoir modifier linstruction SQL. Pour plus dinformations sur les requtes paramtres, voir Utilisation de paramtres dans les requtes la page 18-52.
18-50
Guide du dveloppeur
TStrings est une ligne distincte de la requte. Lutilisation de plusieurs lignes naffecte pas la faon dont la requte sexcute sur le serveur, mais peut faciliter la modification et le dbogage de la requte si linstruction est divise en units logiques :
MyQuery.Close; MyQuery.SQL.Clear; MyQuery.SQL.Add(SELECT CustNo, OrderNO, SaleDate); MyQuery.SQL.Add( FROM Orders); MyQuery.SQL.Add(ORDER BY SaleDate); MyQuery.Open;
Le code ci-aprs montre la modification dune seule ligne dans une instruction SQL existante. Dans ce cas, la clause ORDER BY existe dj dans la troisime ligne de linstruction. Elle est rfrence via la proprit SQL en utilisant un index de 2.
MyQuery.SQL[2] := ORDER BY OrderNo; Remarque
Lensemble de donnes doit tre ferm lorsque vous spcifiez ou modifiez la proprit SQL. Pendant la conception, utilisez lditeur de liste de chanes pour spcifier la requte. Cliquez sur le bouton points de suspension de la proprit SQL, dans linspecteur dobjets, pour afficher lditeur de liste de chanes.
Remarque
Avec certaines versions de Delphi, si vous utilisez TQuery, vous pouvez aussi utiliser le constructeur SQL pour construire une requte base sur une reprsentation visible des tables et des champs dune base de donnes. Pour utiliser le constructeur SQL, slectionnez le composant requte, cliquez avec le bouton droit pour appeler le menu contextuel et choisissez lditeur de requtes graphique. Pour apprendre utiliser le constructeur de requtes, ouvrez-le et faites appel son aide en ligne. Comme la proprit SQL est un objet TStrings, vous pouvez charger le texte de la requte partir dun fichier, en appelant la mthode TStrings.LoadFromFile :
MyQuery.SQL.LoadFromFile(custquery.sql);
Vous pouvez aussi utiliser la mthode Assign de la proprit SQL pour copier le contenu dun objet liste de chanes dans la proprit SQL. La mthode Assign efface automatiquement le contenu en cours de la proprit SQL avant de copier la nouvelle instruction :
MyQuery.SQL.Assign(Memo1.Lines);
Pendant la conception, vous pouvez taper directement la requte dans linspecteur dobjets, ou, si lensemble de donnes SQL dispose dj dune connexion la base de donnes active, vous pouvez cliquer sur le bouton points de suspension de la proprit CommandText pour afficher lditeur de
18-51
CommandText. Lditeur de CommandText numre les tables disponibles et les champs contenus dans ces tables pour faciliter la composition de vos requtes.
Dans cette instruction SQL, :Name, :Capital et :Population sont des marques de rservation pour les valeurs relles fournies linstruction par votre application au cours de lexcution. Remarquez que les noms des paramtres commencent par un deux points. Le deux points est requis pour distinguer les noms de paramtres des valeurs littrales. Vous pouvez aussi inclure des paramtres non nomms en insrant un point dinterrogation (?) dans votre requ te. Les paramtres non nomms sont identifis par leur position, puisquils nont pas de nom. Avant que lensemble de donnes puisse excuter la requte, vous devez fournir une valeur pour chaque paramtre figurant dans le texte de la requte. TQuery, TIBQuery, TSQLQuery et les ensembles de donnes client utilisent la proprit Params pour stocker ces valeurs. TADOQuery utilise la place la proprit Parameters. Params (ou Parameters) est une collection dobjets paramtre (TParam ou TParameter), o chaque objet reprsente un seul paramtre. Quand vous spcifiez le texte de la requ te, lensemble de donnes gnre cet ensemble dobjets paramtre et (selon le type de lensemble de donnes) initialise les proprits qu il peut dduire de la requte.
Remarque
Vous pouvez supprimer la g nration automatique des objets paramtre en rponse au changement du texte de la requte, en dfinissant la proprit ParamCheck par False. Cest utile pour les instructions DDL (langage de dfinition des donnes) contenant des paramtres qui font partie de linstruction DDL et ne sont pas des paramtres de la requte. Par exemple, linstruction DDL pour crer une procdure stocke peut dfinir des paramtres faisant partie de cette procdure stocke. En dfinissant ParamCheck par False, vous empchez ces paramtres dtre pris par erreur pour les paramtres de la requte. Les valeurs de paramtres doivent tre lies linstruction SQL avant sa premire excution. Les composants requte le font pour vous automatiquement si vous nappelez pas explicitement la mthode Prepare avant lexcution dune requte.
Conseil
Cest une bonne habitude de programmation de fournir aux paramtres des noms de variable correspondant aux noms des colonnes avec lesquelles ils sont associs. Par exemple, si un nom de colonne est Number, alors le paramtre
18-52
Guide du dveloppeur
qui lui correspond peut tre :Number. Lutilisation de noms correspondants est particulirement importante si lensemble de donnes utilise une source de donnes pour obtenir les valeurs des paramtres dun autre ensemble de donnes. Ce processus est dcrit dans Etablissement de relations matre/dtail en utilisant des paramtres la page 18-55.
Lditeur de collection de paramtres est le mme diteur de collection que celui qui apparat pour dautres proprits de collection. Comme cet diteur est partag par dautre proprits, son menu contextuel (clic droit) contient les commandes Ajouter et Supprimer. Cependant, elles ne sont jamais actives pour les paramtres des requ tes. Le seul endroit o lon peut ajouter ou supprimer des paramtres est dans linstruction SQL elle-mme. Slectionnez chaque paramtre dans lditeur de collection de paramtres. Puis, utilisez linspecteur dobjets pour modifier ses proprits. Quand vous utilisez la proprit Params (objets TParam), vous pouvez inspecter ou modifier ce qui suit : La proprit DataType indique le type de donnes de la valeur du paramtre. Pour certains ensembles de donnes, cette valeur peut tre correctement initialise. Si lensemble de donnes ne peut pas dduire le type, DataType vaut ftUnknown, et vous devez la modifier et indiquer le type de la valeur du paramtre. La proprit DataType indique le type de donnes logique du paramtre. En gnral, ces types de donnes sont conformes aux types de donnes du serveur. Pour avoir la correspondance entre les types logiques et les types de donnes du serveur, consultez la documentation du mcanisme daccs aux donnes ((BDE, dbExpress, InterBase). La proprit ParamType indique le type du paramtre slectionn. Pour les requtes, elle est toujours initialise ptInput, car les requtes ne peuvent contenir que des paramtres dentre. Si la valeur de ParamType est ptUnknown, changez-la en ptInput. La proprit Value spcifie la valeur du paramtre slectionn. Vous pouvez laisser vide cette Value si votre application fournit les valeurs des paramtres au cours de lexcution.
18-53
Quand vous utilisez la proprit Parameters (objets TParameter), vous pouvez inspecter ou modifier ce qui suit : La proprit DataType indique le type de donnes de la valeur du paramtre. Pour certains types de donnes, vous pouvez ajouter dautres informations : La proprit NumericScale indique le nombre de dcimales des paramtres numriques. La proprit Precision indique le nombre total de chiffres des paramtres numriques. La proprit Size indique le nombre de caractres des paramtres chane. La proprit Direction indique le type du paramtre slectionn. Pour les requtes, elle est toujours initialise pdInput, car les requtes ne peuvent contenir que des paramtres dentre. La proprit Attributes indique le type des valeurs que le paramtre acceptera. Attributes peut tre dfini par une combinaison de psSigned, psNullable et psLong. La proprit Value spcifie la valeur du paramtre slectionn. Vous pouvez laisser vide cette Value si votre application fournit les valeurs des paramtres au cours de lexcution.
Le mme code peut tre rcrit en utilisant la proprit Params et lindice 0 (en supposant que le paramtre :Capital est le premier de linstruction SQL) :
SQLQuery1.Params[0].AsString := Edit1.Text;
La ligne de commande ci-dessous dfinit trois paramtres la fois, laide de la proprit Params.ParamValues :
Query1.Params.ParamValues[Name;Capital;Continent] := VarArrayOf([Edit1.Text, Edit2.Text, Edit3.Text]);
Remarquez que ParamValues utilise des variants, ce qui vite de transtyper des valeurs.
18-54
Guide du dveloppeur
1 Ajoutez un ensemble de donnes de type requte votre application et liez-le la table Customer. 2 Ajoutez un composant TDataSource nomm CustomerSource. D finissez sa proprit DataSet par lensemble de donnes ajout ltape 1. Cette source de donnes reprsente dsormais lensemble de donnes Customer. 3 Ajoutez un ensemble de donnes de type requte et dfinissez sa proprit SQL par
SELECT CustID, OrderNo, SaleDate FROM Orders WHERE CustID = :ID
Remarquez que le nom du paramtre est le mme que le nom du champ dans la table matre (Customer).
4 Dfinissez la proprit DataSource de lensemble de donnes dtail par CustomerSource. D finir cette proprit transforme lensemble dtail en requ te lie.
18-55
A lexcution, le paramtre :ID de linstruction SQL pour lensemble de donnes dtail, na pas de valeur, lensemble de donnes essaie alors de trouver une correspondance entre le nom du paramtre et le nom dune colonne de lensemble de donnes identifi par CustomerSource. CustomerSource obtient ses donnes de lensemble de donnes matre qui, son tour, drive ses donnes de la table Customer. Comme la table Customer contient un colonne appele ID, la valeur du champ ID dans lenregistrement en cours de lensemble de donnes matre est assigne au paramtre :ID de linstruction SQL de lensemble de donnes dtail. Les ensembles de donnes sont lis dans une relation matre/ dtail. Chaque fois que lenregistrement en cours change dans lensemble de donnes Customer, linstruction SELECT de lensemble de donnes dtail sexcute pour retrouver toutes les commandes sappliquant lidentificateur de client en cours.
Lorsque vous prparez lensemble de donnes de manire explicite, les ressources alloues lexcution de linstruction ne sont pas libres tant que vous ne dfinissiez pas Prepared par False. Dfinissez la proprit Prepared par False si vous voulez que lensemble de donnes soit re-prpar avant son excution (par exemple, si vous ajoutez un paramtre).
Remarque
Quand vous changez le texte de la proprit SQL dune requte, lensemble de donnes ferme automatiquement la requ te et annule sa prparation.
18-56
Guide du dveloppeur
Si vous excutez la requte plusieurs fois, cest une bonne ide de dfinir la proprit Preparedpar True. Mme si la requte ne renvoie aucun enregistrement, vous pouvez vouloir connatre le nombre denregistrements quelle affecte (par exemple, le nombre denregistrements supprims par une requte DELETE). La proprit RowsAffected donne le nombre denregistrements affects aprs lappel de la mthode ExecSQL.
Conseil
Quand vous ne savez pas au moment de la conception si la requte renvoie un ensemble de rsultats (par exemple, si lutilisateur fournit la requte lexcution de faon dynamique), vous pouvez programmer les deux types dinstructions dexcution de la requ te dans un bloc try...except. Placez un appel la mthode Open dans la clause try. Une requte daction est excute quand la requte est active avec la mthode Open, mais, en plus, une exception est dclenche. Vrifiez lexception et supprimez-la si elle indique simplement labsence densemble de rsultats. (Par exemple, TQuery lindique par une exception ENoResultSet.)
18-57
Si vous navez pas besoin de naviguer vers larrire dans un ensemble de rsultats, TQuery et TIBQuery vous permettent damliorer les performances de la requte en demandant la place un curseur unidirectionnel. Pour demander un curseur unidirectionnel, dfinissez la proprit UniDirectional par True. Dfinissez UniDirectional avant la prparation et lexcution de la requte. Le code suivant illustre la dfinition de la proprit UniDirectional avant la prparation et lexcution dune requte :
if not (CustomerQuery.Prepared) then begin CustomerQuery.UniDirectional := True; CustomerQuery.Prepared := True; end; CustomerQuery.Open; { renvoie un ensemble de rsultats avec un curseur unidirectionnel } Remarque
Ne confondez pas la proprit UniDirectional et un ensemble de donnes unidirectionnel. Les ensembles de donnes unidirectionnels (TSQLDataSet, TSQLTable, TSQLQuery et TSQLStoredProc) utilisent dbExpress, qui ne renvoie que des curseurs unidirectionnels. En plus de supprimer la navigation arrire, les ensembles de donnes unidirectionnels ne mettent pas les enregistrements en tampon, et ont donc dautres limites (comme lincapacit utiliser des filtres).
1 Placez le composant appropri dans un module de donnes ou sur une fiche, et attribuez sa proprit Name une valeur unique approprie votre application. 2 Identifiez le serveur de base de donnes qui dfinit la procdure stocke. Chaque ensemble de donnes de type procdure stocke fait cela diffremment, mais, en gnral, il faut spcifier un composant de base de donnes :
Pour TStoredProc, spcifiez un composant TDatabase ou un alias BDE en utilisant la proprit DatabaseName. Pour TADOStoredProc, spcifiez un composant TADOConnection en utilisant la proprit Connection. Pour TSQLStoredProc, spcifiez un composant TSQLConnection en utilisant la proprit SQLConnection. Pour TIBStoredProc, spcifiez un composant TIBConnection en utilisant la proprit Database.
18-58
Guide du dveloppeur
Pour plus dinformations sur lutilisation des composants connexion aux bases de donnes, voir chapitre 17, Connexion aux bases de donnes.
3 Spcifiez la procdure stocke excuter. Pour la plupart des ensembles de donnes de type procdure stocke, vous le faites en dfinissant la proprit StoredProcName. La seule exception est TADOStoredProc , qui dispose la place dune proprit ProcedureName. 4 Si la procdure stocke renvoie un curseur utiliser avec des contrles de donnes visuels, ajoutez un composant source de donnes au module de donnes et dfinissez sa proprit DataSet par lensemble de donnes de type procdure stocke. Connectez les composants orients donnes la source de donnes laide de leurs proprits DataSource et DataField. 5 Fournissez les valeurs des ventuels paramtres de la procdure stocke. Si le serveur ne fournit pas dinformation sur tous les paramtres des procdures stockes, vous devez fournir des informations supplmentaires sur les paramtres dentre, comme les noms et les types de donnes de ces paramtres. Pour plus dinformations sur lutilisation des paramtres des procdures stockes, voir Utilisation de paramtres avec les procdures stockes la page 18-59. 6 Excutez la procdure stocke. Pour les procdures stockes qui renvoient un curseur, utilisez la proprit Active ou la mthode Open. Pour excuter des procdures stockes qui ne renvoient pas de rsultat ou renvoient uniquement des paramtres de sortie, utilisez la mthode ExecProc lexcution. Si vous prvoyez dexcuter la procdure stocke plusieurs fois, vous pouvez appeler Prepare pour initialiser la couche daccs aux donnes et les valeurs des paramtres de liaison dans la procdure stocke. Pour plus dinformations sur la prparation dune procdure stocke, voir Excution de procdures stockes qui ne renvoient pas densemble de rsultats la page 18-63. 7 Traitez les ventuels rsultats. Ces rsultats peuvent tre renvoys sous forme de paramtres de rsultat et de sortie, ou bien sous forme dun ensemble de rsultats qui remplit lensemble de donnes de type procdure stocke. Certaines procdures stockes renvoient plusieurs curseurs. Pour plus de dtails sur la faon daccder aux curseurs supplmentaires, voir Lecture de plusieurs ensembles de rsultats la page 18-64.
18-59
Paramtres dentre/sortie, utiliss pour transmettre des valeurs une procdure stocke pour leur traitement, et utiliss par la procdure stocke pour transmettre en retour des valeurs une application. Un paramtre de rsultat, utilis par certaines procdures stockes pour renvoyer lapplication une erreur ou une valeur dtat. Une procdure stocke ne peut renvoyer quun seul paramtre de rsultat. Le type de paramtres utilis par une procdure stocke dpend de limplmentation gnrale propre au langage des procdures stockes sur votre serveur de base de donnes et de linstance spcifique de la procdure stocke. Quel que soit le serveur, certaines procdures stockes peuvent utiliser ou ne pas utiliser les paramtres dentre. Au contraire, certaines utilisations des paramtres sont spcifiques au serveur. Par exemple, sur MS-SQL Server et Sybase, les procdures stockes renvoient toujours un paramtre de rsultat, mais limplmentation InterBase dune procdure stocke ne renvoie jamais de paramtre de rsultat. Laccs aux paramtres des procdures stockes est fourni par la proprit Params (dans TStoredProc , TSQLStoredProc, TIBStoredProc) ou par la proprit Parameters (dans TADOStoredProc). Quand vous affectez une valeur la proprit StoredProcName (ou ProcedureName), lensemble de donnes gnre automatiquement un objet pour chaque paramtre de la procdure stocke. Pour certains ensembles de donnes, si le nom de la procdure stocke nest pas spcifi jusquau moment de lexcution, les objets correspondants chaque paramtre doivent tre crs par programme ce moment-l. Ne pas spcifier la procdure stocke et crer manuellement les objets TParam ou TParameter permet un ensemble de donnes seul dtre utilis avec un nombre quelconque de procdures stockes.
Remarque
Certaines procdures stockes renvoient un ensemble de donnes en plus des paramtres de sortie et de rsultat. Les applications peuvent afficher les enregistrements des ensembles de donnes dans des contrles orients donnes, mais doivent traiter sparment les paramtres de sortie et les paramtres de rsultat.
Vous pouvez donner des valeurs aux paramtres dentre en les slectionnant dans lditeur de collection de paramtres et en utilisant linspecteur dobjets pour dfinir la proprit Value. Mais, vous ne devez modifier ni les noms ni les types de donnes des paramtres dentre indiqus par le serveur. Si vous le faites, une exception se produit lorsque vous excutez la procdure stocke. Certains serveurs nindiquent pas les noms ni les types de donnes des paramtres. En ce cas, vous devez dfinir les paramtres manuellement en utilisant lditeur de collection de paramtres. Cliquez avec le bouton droit et choisissez Ajouter pour ajouter des paramtres. Vous devez dcrire entirement
18-60
Guide du dveloppeur
chaque paramtre que vous ajoutez. M me si vous navez pas besoin dajouter des paramtres, vous devez vrifier que les objets paramtre individuels sont corrects. Si lensemble de donnes a une proprit Params (objets TParam), les proprits suivantes doivent tre correctement spcifies : La proprit Name indique le type du paramtre slectionn. La proprit DataType indique le type de donnes de la valeur du paramtre. Lorsque vous utilisez TSQLStoredProc, certains types de donnes exigent des informations supplmentaires : La proprit NumericScale indique le nombre de dcimales des paramtres numriques. La proprit Precision indique le nombre total de chiffres des paramtres numriques. La proprit Size indique le nombre de caractres des paramtres chane. La proprit ParamType indique le type du paramtre slectionn. Ce peut tre ptInput (pour les paramtres dentre), ptOutput (pour les paramtres de sortie), ptInputOutput (pour les paramtres dentre/sortie) ou ptResult (pour les paramtres de rsultat). La proprit Value spcifie la valeur du paramtre slectionn. Vous ne pouvez pas dfinir la valeur des paramtres de sortie ou des paramtres de rsultat. Cest lexcution de la procdure stocke qui dfinit ces types de paramtres. Pour les paramtres dentre ou dentre/sortie, vous pouvez laisser Value vide si votre application fournit les valeurs des paramtres au cours de lexcution. Si lensemble de donnes utilise une proprit Parameters (objets TParameter), les proprits suivantes doivent tre correctement spcifies : La proprit Name indique le nom du paramtre tel quil est dfini par la procdure stocke. La proprit DataType indique le type de donnes de la valeur du paramtre. Pour certains types de donnes, vous pouvez ajouter dautres informations : La proprit NumericScale indique le nombre de dcimales des paramtres numriques. La proprit Precision indique le nombre total de chiffres des paramtres numriques. La proprit Size indique le nombre de caractres des paramtres chane. La proprit Direction indique le type du paramtre slectionn. Ce peut tre pdInput (pour les paramtres dentre), pdOutput (pour les paramtres de sortie), pdInputOutput (pour les paramtres dentre/sortie) ou pdReturnValue (pour les paramtres de rsultat).
18-61
La proprit Attributes indique le type des valeurs que le paramtre acceptera. Attributes peut tre dfini par une combinaison de psSigned, psNullable et psLong. La proprit Value spcifie la valeur du paramtre slectionn. Ne dfinissez pas la valeur des paramtres de sortie ou des paramtres de rsultat. Pour les paramtres dentre ou dentre/sortie, vous pouvez laisser vide cette Value si votre application fournit les valeurs des paramtres au cours de lexcution.
Mme si vous navez pas besoin dajouter les objets paramtre individuels lexcution, vous pouvez accder chacun deux en affectant des valeurs aux paramtres dentre et en rcuprant les valeurs des paramtres de sortie. Vous pouvez utiliser la mthode ParamByName de lensemble de donnes, pour accder aux paramtres individuels par leur nom. Par exemple, le code suivant dfinit la valeur dun paramtre dentre/sortie, excute la procdure stocke et rcupre la valeur renvoye :
with SQLStoredProc1 do begin ParamByName(IN_OUTVAR).AsInteger := 103; ExecProc; IntegerVar := ParamByName(IN_OUTVAR).AsInteger; end;
18-62
Guide du dveloppeur
Lorsque vous prparez lensemble de donnes de manire explicite, les ressources alloues lexcution de la procdure stocke ne sont pas libres tant que vous ne dfinissez pas Prepared par False. Dfinissez la proprit Prepared par False si vous voulez que lensemble de donnes soit re-prpar avant son excution (par exemple, si vous modifiez les paramtres quand vous utilisez les procdures Oracle surcharges).
TADOStoredProc na pas de mthode ParamByName. Pour obtenir les valeurs des paramtres de sortie lorsque vous utilisez ADO, accdez aux objets paramtre en utilisant la proprit Parameters. Si vous excutez la procdure stocke plusieurs fois, cest une bonne ide de dfinir la proprit Prepared par True.
Conseil
18-63
Dans TSQLStoredProc, NextRecordSet renvoie le composant TCustomSQLDataSet qui vient dtre cr et fournit laccs au prochain ensemble denregistrements. Dans TADOStoredProc, NextRecordset renvoie une interface qui peut tre affecte la proprit RecordSet dun ensemble de donnes ADO existant. Pour nimporte quelle classe, la mthode renvoie le nombre denregistrements de lensemble de donnes renvoy sous forme dun paramtre de sortie. La premire fois que vous appelez NextRecordSet, elle renvoie un ensemble de donnes pour le second ensemble denregistrements. Appeler nouveau NextRecordSet renvoie un troisime ensemble de donnes, et ainsi de suite jusqu ce quil ny ait plus densemble denregistrements. Lorsque quil ny a pas de curseur supplmentaire, NextRecordSet renvoie nil.
18-64
Guide du dveloppeur
19
Manipulation des composants champ
Chapitre 19
Chapitre
Ce chapitre dcrit les proprits, les vnements et les mthodes communes lobjet TField et ses descendants. Les composants champ reprsentent les diffrents champs (colonnes) des ensembles de donnes. Ce chapitre dcrit galement comment utiliser les composants champ pour contrler laffichage et ldition des donnes dans des applications. Les composants champ sont toujours associs un ensemble de donnes. Vous nutilisez jamais un objet TField directement dans vos applications. Au lieu de cela, chaque composant champ de votre application est un descendant de TField spcifique au type de donnes dune colonne dun ensemble de donnes. Les composants champ fournissent des contrles orients donnes tels que TDBEdit et TDBGrid afin daccder aux donnes dune colonne particulire de lensemble de donnes associ. Dune faon gnrale, un composant champ reprsente les caractristiques dune colonne, ou dun champ, dun ensemble de donnes (comme le type de donnes ou la taille du champ). Il reprsente galement les caractristiques daffichage du champ, comme lalignement, le format daffichage et le format ddition. Par exemple, un composant TFloatField est dot de quatre proprits qui affectent directement lapparence des donnes :
Tableau 19.1 Proprit
Alignment DisplayWidth DisplayFormat EditFormat
19-1
Lorsque vous passez dun enregistrement un autre dans un ensemble de donnes, un composant champ vous permet de visualiser et de modifier la valeur du champ dans lenregistrement en cours. Les composants champ ont de nombreuses proprits en commun (comme DisplayWidth et Alignment) ; ils ont galement des proprits spcifiques certains types de donnes (telles que Precision pour TFloatField). Chacune de ces proprits affecte laspect des donnes dans une fiche. Certaines dentre elles, comme Precision, peuvent galement affecter les donnes pouvant tre saisies par un utilisateur quand il modifie ou saisit des donnes. Tous les composants champ dun ensemble de donnes sont soit dynamiques (automatiquement g nrs partir de la structure sous-jacente des tables de bases de donnes) ou persistants (gnrs partir des noms de champs et des proprits dfinis dans lditeur de champs). Les champs dynamiques et les champs persistants ont des caractristiques diffrentes et sont appropris des situations prcises. Les sections suivantes dcrivent en dtail les champs persistants et les champs dynamiques et indiquent quand les utiliser.
19-2
Guide du dveloppeur
Champs persistants
1 Placez des ensembles de donnes et des sources de donnes dans un module de donnes. 2 Associez les ensembles de donnes aux donnes. Cela suppose lutilisation dun fournisseur ou composant connexion pour connecter la source des donnes et dfinir les proprits qui dterminent les donnes reprsentes par lensemble de donnes. 3 Associez les sources de donnes aux ensembles de donnes. 4 Placez des contrles orients donnes dans les fiches de votre application, ajoutez le module de donnes dans chaque clause uses des units de fiches, et associez chaque contrle orient donnes une source de donnes du module. Il faut aussi associer un champ chaque contrle orient donnes le ncessitant. Etant donn que vous utilisez des composants champ dynamiques, lexistence des noms des champs louverture de lensemble de donnes nest pas garantie. 5 Ouvrez les ensembles de donnes.
Les champs dynamiques prsentent malgr tout quelques limites. Sans crire de code, il est impossible de changer leurs paramtres par dfaut daffichage et ddition, il est difficile de modifier leur ordre daffichage sans prendre de risque et il est impossible dempcher laccs des champs de lensemble de donnes. Des champs supplmentaires comme les champs de rfrence ou les champs calculs ne peuvent pas tre crs pour lensemble de donnes et il est impossible de surcharger le type par dfaut dun champ dynamique. Pour un plus grand contrle des champs de vos applications de bases de donnes, vous devez appeler lditeur de champs et crer des champs persistants.
Champs persistants
Par dfaut, les champs des ensembles de donnes sont des champs dynamiques. Leurs proprits et leur disponibilit sont automatiquement dfinies et ne peuvent pas tre modifies. Pour contrler les proprits et les vnements dun champ, vous devez crer des champs persistants. Grce aux champs persistants, vous pouvez : dfinir ou modifier les caractristiques daffichage ou ddition du champ la conception ou lexcution ; crer de nouveaux champs, tels que des champs de rfrence, des champs calculs et des champs agrgs, dont les valeurs sont bases sur les champs dun ensemble de donnes ; valider les entres de donnes ; retirer des composants champ de la liste des composants persistants pour empcher votre application daccder des colonnes particulires dune base de donnes sous-jacente ;
19-3
Champs persistants
dfinir de nouveaux champs pour remplacer des champs existants, daprs les colonnes de la table ou de la requte sous-jacente dun ensemble de donnes. Au moment de la conception vous pouvez, ce qui est conseill, utiliser lditeur de champs pour crer des listes persistantes de composants champ utiliss par les ensembles de donnes de votre application. Ces listes sont stockes dans votre application et ne changent pas, mme si la structure de la base de donnes sous-jacente dun ensemble de donnes est modifie. Il est ensuite possible de crer des gestionnaires dvnements pour ces champs de faon ce quils puissent rpondre aux modifications de donnes et aux validations de saisies.
Remarque
Lorsque vous crez les champs persistants dun ensemble de donnes, seuls ceux slectionns sont disponibles pour votre application en mode conception et lexcution. Pendant la phase de conception, vous pouvez toujours utiliser lditeur de champs de faon ajouter ou supprimer des champs persistants pour un ensemble de donnes. La totalit des champs utiliss dans un ensemble de donnes sont soit persistants soit dynamiques. Il est impossible de combiner les deux types de champs au sein du mme ensemble de donnes. Si vous avez cr des champs persistants pour un ensemble de donnes, vous devrez tous les supprimer pour revenir des champs dynamiques. Pour plus dinformations sur les champs dynamiques, voir Composants champ dynamique la page 19-2.
Remarque
Lune des principales utilisations des champs persistants est de contrler laspect et laffichage des donnes. Vous pouvez galement contrler laspect des colonnes dans les grilles orientes donnes. Pour savoir comment grer laspect des colonnes dans les grilles, reportez-vous Cration dune grille personnalise la page 15-19.
1 Placez un ensemble de donnes dans un module de donnes. 2 Liez lensemble de donnes ses donnes sous-jacentes. Pour ce faire, vous devez gnralement associer lensemble de donnes un fournisseur ou composant connexion et spcifier les proprits permettant de dcrire les donnes. Par exemple, si vous utilisez TADODataSet, vous pouvez attribuer
19-4
Guide du dveloppeur
Champs persistants
la proprit Connection un composant TADOConnection correctement configur et la proprit CommandText une requte valide.
3 Double-cliquez sur le composant ensemble de donnes dans le module de donnes de faon appeler lditeur de champs. Ce dernier contient une barre de titre, des boutons de navigation et une bote liste.
La barre ou de la Ainsi, si donnes la partie de titre de lditeur de champs affiche le nom du module de donnes fiche contenant lensemble de donnes, ainsi que le nom de celui-ci. vous ouvrez lensemble de donnes Customers dans le module de CustomerData, la barre de titre affiche CustomerData.Customers, ou du nom quelle peut contenir.
Sous la barre de titre figure un ensemble de boutons de navigation vous permettant de faire dfiler un un les enregistrements dun ensemble de donnes au moment de la conception ; ces boutons vous permettent galement de passer directement au premier ou au dernier enregistrement. Les boutons de navigation sont estomps si vous navez pas encore cr de composant champ persistant pour lensemble de donnes ou si celui-ci nest pas actif. Si lensemble de donnes est unidirectionnel, les boutons permettant de se dplacer sur les dernier et prcdent enregistrements sont toujours estomps. La bote liste affiche le nom des composants champ persistants de lensemble de donnes. Lorsque vous lancez lditeur de champs la premire fois pour un nouvel ensemble de donnes, la liste est vide car les composants champ sont dynamiques et non persistants. Si vous lancez lditeur de champs pour un ensemble de donnes contenant dj des composants champ persistants, vous verrez leur nom dans la bote liste.
4 Choisissez loption dajout de champs dans le menu contextuel de lditeur de champs. 5 Dans la bote de dialogue dajout de champs, slectionnez les champs persistants. Par dfaut, tous les champs sont slectionns louverture de la bote de dialogue. Tous les champs que vous slectionnerez dans cette bote de dialogue deviendront des champs persistants.
La bote de dialogue dajout de champs se referme et les champs que vous avez slectionns apparaissent dans la bote liste de lditeur de champs ; ce sont les champs persistants. Si lensemble de donnes est actif, vous remarquerez galement que les boutons de navigation Dernier (si lensemble de donnes nest pas unidirectionnel) et Suivant, au-dessus de la bote liste sont activs. Dsormais, chaque fois que vous ouvrirez lensemble de donnes, il ne crera plus de composant champ dynamique pour chaque colonne de la base de donnes sous-jacente. Au lieu de cela, il ne crera des composants persistants que pour les champs spcifis. A chaque fois que vous ouvrirez lensemble de donnes, il vrifiera que chacun des champs persistants non calculs est prsent ou quil peut tre cr partir des donnes de la base. Sinon, il provoquera une exception vous avertissant que le champ nest pas valide et ne souvrira pas.
19-5
Champs persistants
1 Slectionnez-les. Vous pouvez slectionner et dplacer plusieurs champs la fois. 2 Faites-les glisser au nouvel emplacement.
Si vous slectionnez un ensemble de champs non contigus et les faites glisser vers un nouvel emplacement, ils sont insrs en tant que bloc contigu. A lintrieur de ce bloc, lordre des champs reste inchang. Pour changer lordre dun champ dans la liste, une autre mthode consiste slectionner le champ et utiliser les touches Ctrl+Haut et Ctrl+Bas.
19-6
Guide du dveloppeur
Champs persistants
La bote options Type vous permet de spcifier le type de donnes du composant champ. Vous devez obligatoirement indiquer un type de donnes pour chaque nouveau composant champ cr. Par exemple, pour afficher une valeur montaire virgule flottante dans un champ, slectionnez Currency dans la liste droulante. Utilisez la zone de saisie Taille pour spcifier le nombre maximum de caractres pouvant tre affichs ou entrs dans un champ chane, ou bien la taille des champs Bytes et VarBytes. Taille ne sutilise pour aucun autre type de donnes. La bote groupe Type de champ vous permet de spcifier le type du nouveau composant champ crer. Son type par dfaut est Donnes. Si vous choisissez Rfrence, les zones de saisie Ensemble de donnes et Champs cl de la bote groupe Dfinition de la rfrence sont actives. Il est aussi possible de crer des champs calculs, et si vous travaillez avec un ensemble de donnes client, vous pouvez mme crer des champs CalcInterne ou Agrgat. Le tableau suivant dresse la liste des champs pouvant tre crs :
Tableau 19.2
Champs de donnes Champs calculs CalcInterne Champs de rfrence Agrgat
Type de champ
La bote groupe Dfinition de la rfrence ne sutilise que pour crer des champs de rfrence. Elle est dcrite dans Dfinition dun champ de rfrence la page 19-10.
Mme si pour remplacer un champ existant vous en dfinissez un nouveau, celui-ci doit driver la valeur de ses donnes dune colonne dune table sousjacente dun ensemble de donnes. Pour crer un champ de donnes de remplacement dun champ de la table sousjacente un ensemble de donnes :
1 Retirez le champ de la liste des champs persistants affecte lensemble de donnes puis choisissez Nouveau champ dans le menu contextuel.
19-7
Champs persistants
2 Dans la bote de dialogue Nouveau champ, entrez dans la zone de saisie Nom le nom dun champ existant de la table de la base de donnes. Nentrez pas un nouveau nom de champ car vous spcifiez ici le nom dun champ existant dont le nouveau champ va driver ses donnes. 3 Choisissez un nouveau type de donnes dans la bote options Type. Celui-ci doit tre diffrent de celui du champ que vous remplacez. Il nest pas possible de remplacer un champ chane dune taille donne par un champ chane dune autre taille. Mme si le type de donnes doit tre diffrent il doit nanmoins tre compatible avec le type de donnes rel du champ de la table sous-jacente. 4 Le cas chant, entrez la taille du champ dans la zone de saisie correspondante. Cela ne sapplique quaux champs de type TStringField, TBytesField et TVarBytesField. 5 Slectionnez Donnes dans la bote groupe Type de champ. 6 Choisissez OK. La bote de dialogue Nouveau champ se referme, le nouveau champ remplace celui que vous avez spcifi ltape 1 et la dclaration de composant dans la dclaration de type du module de donnes ou de la fiche est mise jour.
Pour diter les proprits ou les vnements associs au composant champ, slectionnez le nom du composant dans la bote liste de lditeur de champs, puis ditez ses proprits ou vnements avec linspecteur dobjets. Pour plus de dtails sur ldition des proprits et des vnements dun composant champ, reportez-vous D finition des vnements et des proprits des champs persistants la page 19-13.
1 Saisissez un nom dans la zone de saisie Nom (attention ne pas entrer le nom dun champ existant). 2 Choisissez le type de donnes de ce champ dans la bote options Type. 3 Entrez la taille du champ dans la zone de saisie correspondante, le cas chant. La taille ne sapplique quaux champs de type TStringField, TBytesField et TVarBytesField. 4 Slectionnez Calcul ou CalcInterne dans la bote groupe Type de champ. InternalCalc est uniquement disponible si vous utilisez un ensemble de donnes client. La principale diffrence entre les deux types de champs calculs est que les valeurs calcules pour un champ CalcInterne sont stockes et extraites des donnes de lensemble de donnes client.
19-8
Guide du dveloppeur
Champs persistants
5 Choisissez OK. Le nouveau champ calcul est ajout automatiquement la fin de la liste des champs persistants de la bote liste de lditeur de champs et la dclaration du composant est ajoute automatiquement la dclaration de type du module de donnes ou de la fiche. 6 Introduisez le code qui calcule les valeurs du champ dans le gestionnaire dvnement OnCalcFields de lensemble de donnes. Pour savoir comment crire du code pour calculer la valeur des champs, voir Programmation dun champ calcul la page 19-9.
Remarque
Pour diter les proprits ou vnements associs au composant champ, slectionnez le nom du composant dans la bote liste de lditeur de champs, puis procdez ldition avec linspecteur dobjets. Pour en savoir plus ce sujet, reportez-vous D finition des vnements et des proprits des champs persistants la page 19-13.
1 Slectionnez le composant ensemble de donnes dans la liste droulante de linspecteur dobjets. 2 Choisissez la page Evnements dans linspecteur dobjets. 3 Double-cliquez sur la proprit OnCalcFields pour lancer ou crer une procdure CalcFields pour le composant ensemble de donnes. 4 Ecrivez le code dfinissant les valeurs et les autres proprits du champ calcul.
Supposons par exemple que vous ayez cr un champ calcul CityStateZip pour la table Customers dans le module de donnes CustomerData. CityStateZip affichera le nom de la ville et de ltat o se trouve lentreprise et le code postal sur une mme ligne dun contrle orient donnes. Pour ajouter du code la procdure CalcFields pour la table Customers, slectionnez celle-ci dans la liste droulante de linspecteur dobjets, passez la page Evnements et double-cliquez sur la proprit OnCalcFields. La procdure TCustomerData.CustomersCalcFields apparat dans la fentre de code source de lunit. Ajoutez le code suivant la procdure pour calculer le champ :
CustomersCityStateZip.Value := CustomersCity.Value + , + CustomersState.Value + + CustomersZip.Value; Remarque
Lorsque vous crivez le gestionnaire dvnement OnCalcFields pour un champ calcul de faon interne, vous pouvez amliorer les performances en consultant la proprit State de lensemble de donnes client et en recalculant la valeur uniquement si State vaut dsInternalCalc. Pour plus dinformations, voir
19-9
Champs persistants
Utilisation de champs calculs de faon interne dans les ensembles de donnes client la page 23-13.
Les ensembles de donnes unidirectionnels ne prennent pas en charge les champs de rfrence. Pour crer un champ de rfrence dans la bote de dialogue Nouveau champ :
1 Saisissez le nom du champ de rfrence dans la zone de saisie Nom. Attention ne pas saisir un nom de champ existant. 2 Dans la bote options Type, choisissez un type de donnes pour le champ. 3 Le cas chant, entrez la taille du champ dans la zone de saisie correspondante. La taille nest spcifier que pour les champs de type TStringField, TBytesField et TVarBytesField. 4 Slectionnez Rfrence dans la bote groupe Type de champ pour activer les botes options Ensemble de donnes et Champs cl. 5 Choisissez dans la liste droulante de la bote options Ensemble de donnes lensemble de donnes sur lequel doit porter la recherche des valeurs de champ. Lensemble de rfrence doit tre diffrent de celui du composant champ lui-mme, sinon une exception de rfrence circulaire sera provoque au moment de lexcution. En spcifiant un ensemble de donnes de rfrence, vous activez les botes options Cls de rfrence et Champ rsultat. 6 Dans la liste droulante Champs cl, choisissez dans lensemble de donnes actif le champ dont les valeurs doivent se correspondre. Pour faire correspondre plusieurs champs, entrez leur nom directement au lieu de les choisir dans la liste droulante. Sparez leur nom par des points-virgules. Si vous utilisez plusieurs champs, il faut employer des composants champ persistants. 7 Dans la liste droulante Cls de rfrence, choisissez un champ de lensemble de donnes de rfrence devant correspondre au champ source spcifi ltape 6. Si vous avez spcifi plusieurs champs cl, il faut spcifier le mme
19-10
Guide du dveloppeur
Champs persistants
nombre de cls de rfrence. Pour spcifier plusieurs champs, entrez leur nom directement. Sparez leur nom par des points-virgules.
8 Dans la liste droulante Champ rsultat, choisissez un champ de lensemble de donnes de rfrence renvoyer comme valeur du champ de rfrence que vous tes en train de crer.
Lorsque vous concevez et excutez votre application, les valeurs des champs de rfrence sont dtermines avant celles des champs calculs. Il est possible de crer des champs calculs bass sur des champs de rfrence mais il est impossible de crer des champs de rfrence bass sur des champs calculs. Vous pouvez affiner laide de la proprit LookupCache la faon dont les champs de rfrence sont dtermins. Cette proprit dtermine si les valeurs dun champ de rfrence sont places en mmoire cache lors de la premire ouverture dun ensemble de donnes ou si elles sont rfrences dynamiquement chaque modification de lenregistrement en cours dans lensemble de donnes. Mettez LookupCache True pour cacher les valeurs dun champ de rfrence lorsque la proprit LookupDataSet ne risque aucune modification et que le nombre de valeurs de rfrence est faible. La mise en mmoire cache des valeurs de rfrence permet dacclrer les performances, car les valeurs de rfrence relatives chaque ensemble de valeurs de la proprit LookupKeyFields sont prcharges louverture de lensemble de donnes. En cas de modification de lenregistrement en cours dans lensemble de donnes, lobjet champ peut localiser sa valeur (Value) dans la mmoire cache, plutt que daccder LookupDataSet. Cette amlioration des performances est apprciable si lensemble de donnes de rfrence ( LookupDataSet) est sur un rseau prsentant des temps daccs lents.
Conseil
Vous pouvez utiliser une mmoire cache de rfrence pour proposer les valeurs de rfrence par programme au lieu dutiliser un ensemble de donnes secondaire. V rifiez que la proprit LookupDataSet vaut nil. Utilisez ensuite la mthode Add de la proprit LookupList pour la remplir avec les valeurs de rfrence. Affectez la valeur True la proprit LookupCache. Le champ utilise la liste de rfrence spcifie sans redfinir ses valeurs avec celles dun ensemble de donnes de rfrence. Si chaque enregistrement de lensemble de donnes (DataSet) comporte des valeurs diffrentes pour KeyFields, le temps ncessaire la localisation des valeurs dans le cache peut tre suprieur aux gains de temps obtenus grce au placement en mmoire cache. Plus le nombre de valeurs distinctes dans KeyFields est lev, plus le temps de traitement pass localiser des valeurs dans la mmoire cache augmente. Si LookupDataSet risque de changer, le fait de placer des valeurs de rfrence en mmoire cache peut provoquer des rsultats errons. Appelez RefreshLookupList pour mettre jour les valeurs dans la mmoire cache. RefreshLookupList rgnre la proprit LookupList qui contient la valeur de la proprit LookupResultField de chaque ensemble de valeurs LookupKeyFields. Si LookupCache est dfinie lexcution, appelez RefreshLookupList pour initialiser la mmoire cache.
19-11
Champs persistants
1 Entrez un nom pour le champ agrgat dans la zone de saisie Nom. Nentrez pas le nom dun champ existant. 2 Choisissez le type de donnes dagrgat pour le champ dans la bote options Type. 3 Slectionnez loption dagrgat dans la bote groupe Type de champ. 4 Choisissez OK. Le champ agrgat nouvellement dfini est automatiquement ajout lensemble de donnes client et la proprit Aggregates de lensemble de donnes client est automatiquement mise jour pour inclure la spcification dagrgat approprie. 5 Placez le calcul de la somme dans la proprit ExprText du champ agrgat nouvellement cr. Pour plus dinformations sur la dfinition dune somme, voir Spcification dagrgats la page 23-14.
Une fois quun composant persistant TAggregateField est cr, un contrle TDBText peut tre li au champ agrgat. Le contrle TDBText affiche alors la valeur du champ agrgat en fonction de lenregistrement en cours de lensemble de donnes client sous-jacent.
1 Slectionnez les champs supprimer dans la bote liste de lditeur de champs. 2 Appuyez sur Suppr.
Remarque
Vous pouvez galement supprimer les champs slectionns en choisissant Supprimer dans le menu contextuel de lditeur de champs. Les champs supprims ne sont plus disponibles pour lensemble de donnes et ne peuvent plus tre affichs par les contrles orients donnes. Vous avez toujours la possibilit de recrer un composant champ persistant supprim par accident, mais les modifications pralablement apportes leurs proprits ou vnements seront perdues. Pour plus de dtails, reportez-vous Cration de champs persistants la page 19-4.
19-12
Guide du dveloppeur
Champs persistants
Remarque
Si vous supprimez tous les composants champ persistants dun ensemble de donnes, lensemble de donnes recommence utiliser des composants champ dynamiques pour chaque colonne de la table de base de donnes sous-jacente.
FieldKind FieldName
19-13
Champs persistants
HasConstraints ImportedConstraint Index LookupDataSet LookupKeyFields LookupResultField MaxValue MinValue Name Origin Precision ReadOnly
Size
Tag Transliterate
Visible
Toutes les proprits ne sont pas disponibles pour lensemble des composants champ. Par exemple, un composant champ de type TStringField ne peut pas avoir les proprits Currency, MaxValue ou DisplayFormat et un composant de type TFloatField ne peut pas avoir de proprit Size.
19-14
Guide du dveloppeur
Champs persistants
Alors que le rle de la plupart des proprits est vident, certaines comme Calculated ncessitent des tapes de programmation supplmentaires. D autres, comme DisplayFormat, EditFormat et EditMask sont relies entre elles ; leur configuration doit tre coordonne. Pour plus de dtails sur lutilisation des proprits DisplayFormat, EditFormat et EditMask, voir Contrle ou dissimulation de la saisie utilisateur la page 19-17.
Linstruction suivante change lordre des champs en donnant la valeur 3 la proprit Index du champ CityStateZip de la table Customers :
CustomersCityStateZip.Index := 3;
Les ensembles dattributs et le dictionnaire de donnes ne sont disponibles que pour les ensembles de donnes BDE. Pour crer un ensemble dattributs daprs un composant champ dun ensemble de donnes :
1 Double-cliquez sur lensemble de donnes pour lancer lditeur de champs. 2 Slectionnez le champ dont vous voulez dfinir les proprits. 3 Dfinissez les proprits voulues pour ce champ dans linspecteur dobjets. 4 Cliquez avec le bouton droit de la souris sur la bote liste de lditeur de champs pour ouvrir le menu contextuel. 5 Choisissez Enregistrer les attributs pour enregistrer la proprit du champ en cours comme ensemble dattributs dans le dictionnaire de donnes.
Par dfaut, lensemble dattributs prend le nom du champ en cours. Vous pouvez toutefois spcifier un nom diffrent en choisissant Enregistrer les attributs sous au lieu de la commande Enregistrer les attributs. Lorsque vous avez cr un nouvel ensemble dattributs et que vous lavez ajout au dictionnaire de donnes, vous pouvez lassocier dautres composants champ
19-15
Champs persistants
persistants. Mme si vous supprimez cette associationultrieurement, lensemble dattributs reste dfini dans le dictionnaire de donnes.
Remarque
Vous pouvez galement crer des ensembles dattributs directement depuis lexplorateur SQL. Lorsque vous crez un ensemble dattributs avec lexplorateur SQL, il est ajout au dictionnaire de donnes mais il nest pas encore appliqu un champ. Lexplorateur SQL vous permet de spcifier deux attributs supplmentaires : un type de champ (tel que TFloatField, TStringField, etc.) et un contrle orient donnes (TDBEdit, TDBCheckBox, etc.) plac automatiquement sur une fiche lorsque vous y faites glisser un champ bas sur lensemble dattributs. Pour en savoir plus ce sujet, reportez-vous laide en ligne de lexplorateur SQL.
1 Double-cliquez sur lensemble de donnes pour lancer lditeur de champs. 2 Slectionnez le champ auquel lensemble dattributs doit sappliquer. 3 Cliquez avec le bouton droit de la souris sur la bote liste et choisissez Associer les attributs. 4 Slectionnez ou entrez lensemble dattributs appliquer depuis la bote de dialogue Association dattributs. Si un ensemble dattributs porte ce nom dans le dictionnaire de donnes, il apparat dans la bote de saisie.
Important
Si lensemble dattributs dfini dans le dictionnaire de donnes est modifi par la suite, vous devrez nouveau lappliquer chaque composant champ qui lutilise. Vous pouvez appeler lditeur de champs et slectionner plusieurs composants champ de lensemble de donnes lorsque vous r-appliquez les attributs.
1 Appelez lditeur de champs correspondant depuis lensemble de donnes contenant le champ. 2 Slectionnez le champ pour lequel vous voulez supprimer lensemble dattributs.
19-16
Guide du dveloppeur
Champs persistants
Le fait de dissocier un ensemble dattributs ne modifie pas les proprits du champ. Le champ garde les paramtres quil avait lorsque lensemble dattributs lui a t affect. Pour modifier ces proprits, slectionnez le champ dans lditeur de champs et dfinissez les proprits dans linspecteur dobjets.
Pour les composants TStringField, la proprit EditMask dfinit aussi le format daffichage. Pour entrer un masque de saisie, appelez lditeur de masques de saisie dun composant champ :
1 Slectionnez le composant dans lditeur de champs ou dans linspecteur dobjets. 2 Cliquez sur la page Proprits de linspecteur dobjets. 3 Double-cliquez sur la colonne de la proprit EditMask dans linspecteur dobjets ou cliquez sur le bouton points de suspension. Lditeur de masques de saisie souvre.
La zone de saisie Masque vous permet de crer et dditer un format de masque. La grille Masques exemple vous permet de slectionner des masques prdfinis. Si vous en slectionnez un, son format apparat dans la zone de saisie et vous pouvez alors soit le modifier, soit lutiliser tel quel. La zone Test de saisie vous permet galement de tester les entres utilisateur. Le bouton Masques vous permet de charger un ensemble de masques personnalis (si vous en avez cr un) dans la grille Masques exemple.
Utilisation des formats par dfaut pour les champs numriques, date et heure
Delphi fournit des routines intgres daffichage et ddition ainsi quun formatage par dfaut intelligent pour les composants TFloatField, TCurrencyField, TBCDField, TFMTBCDField , TIntegerField, TSmallIntField, TWordField, TDateField, TDateTimeField, TTimeField et TSQLTimeStampField. Vous navez donc rien faire pour utiliser ces routines.
19-17
Champs persistants
Seules les proprits de format appropries au type de donnes dun composant champ sont disponibles pour un composant donn. Les conventions de format par dfaut des valeurs de date, dheure, montaire et numriques reposent sur les proprits des Options rgionales dfinies dans le Panneau de configuration. Par exemple, si vous utilisez les paramtres par dfaut des Etats-Unis, la colonne TFloatField dont la proprit Currency est True remplace la valeur 1234,56 de la proprit DisplayFormat par $1234.56, tandis que la valeur de EditFormat devient 1234.56. Au moment de la conception ou de lexcution, vous pouvez diter les proprits DisplayFormat et EditFormat dun composant champ pour ignorer la configuration daffichage par dfaut de ce champ. Vous pouvez galement crire des gestionnaires dvnements OnGetText et OnSetText pour effectuer un formatage personnalis des composants champ lors de lexcution.
Les vnements OnGetText et OnSetText sont surtout utiles aux programmeurs qui veulent aller au-del des fonctions de formatage intgres. OnChange permet deffectuer des tches spcifiques une application et associes aux modifications
19-18
Guide du dveloppeur
de donnes, comme lactivation ou la dsactivation de menus ou de contrles visuels. OnValidate est utile pour valider la saisie de donnes dans votre application avant de renvoyer les valeurs un serveur de base de donnes. Pour crire un gestionnaire dvnement pour un composant champ :
1 Slectionnez le composant. 2 Slectionnez la page Evnements dans linspecteur dobjets. 3 Double-cliquez sur la colonne des valeurs du gestionnaire dvnement pour ouvrir la fentre de code source correspondante. 4 Crez ou ditez le code du gestionnaire.
Le tableau suivant dresse la liste des autres mthodes des composants champ et prsente leur utilisation. Pour une liste complte des mthodes et des informations dtailles sur leur utilisation, voir les entres sur TField et ses descendants dans la Rfrence VCL.
Tableau 19.6 M thode
AssignValue Clear
19-19
19-20
Guide du dveloppeur
Cette mthode fonctionne bien pour les valeurs chane, mais elle peut ncessiter un surcrot de programmation pour pouvoir grer les conversions dautres types de donnes. Heureusement, les composants champ ont des proprits intgres leur permettant de le faire.
Remarque
Vous pouvez galement utiliser des Variants pour accder aux valeurs des champs et les dfinir. Pour plus de dtails sur lutilisation des variants pour accder aux valeurs des champs et les dfinir, reportez-vous Accs des valeurs par la proprit par dfaut dun ensemble de donnes la page 19-23.
AsVariant
TStringField TWideStringField TIntegerField TSmallIntField TWordField TLargeintField TFloatField TCurrencyField TBCDField TFMTBCDField TDateTimeField TDateField TTimeField TSQLTimeStampField TBooleanField TBytesField TVarBytesField TBlobField TMemoField TGraphicField TVariantField TAggregateField Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui N/D Oui
AsString
N/D Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui
AsInteger
Oui Oui N/D Oui Oui Oui Oui Oui Oui Oui
AsDateTime AsSQLTimeStamp
Oui Oui
AsBoolean
Oui Oui
Oui
Oui
Oui
Oui
19-21
Vous remarquerez que certaines colonnes du tableau font rfrence plusieurs proprits de conversion (telles que AsFloat, AsCurrency et AsBCD). En effet, tous les types de donnes de champ qui prennent en charge lune de ces proprits prennent galement en charge les autres. Vous remarquerez galement que la proprit AsVariant peut traduire tous les types de donnes. Pour tout type de donnes ne figurant pas dans la liste cidessus, AsVariant est galement disponible (et constitue, de fait, la seule option). Utilisez-la en cas de doute. Il est des cas o la conversion nest pas possible. Par exemple, AsDateTime permet de convertir une chane au format date, heure ou date/heure seulement si la valeur de la chane est dans un format date/heure identifiable. Lchec dune tentative de conversion a pour effet de provoquer une exception. Dans certains autres cas, la conversion est possible, mais les rsultats sont parfois imprvisibles. Par exemple, que signifie la conversion dune valeur TDateTimeField au format flottant ? AsFloat convertit la partie date du champ en nombre de jours partir du 31/12/1899 et la partie heure du champ en une fraction de 24 heures. Le tableau suivant donne la liste des conversions autorises qui donnent des rsultats spciaux :
Tableau 19.7 Conversion
De String Boolean De Float Integer De DateTime ou SQLTimeStamp Float De Boolean String
Dans les autres cas, la conversion est totalement impossible, toute tentative provoquant une exception. La conversion a toujours lieu avant laffectation. Par exemple, linstruction cidessous convertit la valeur de CustomersCustNo en chane et affecte celle-ci au texte dun contrle de saisie :
Edit1.Text := CustomersCustNo.AsString;
A linverse, linstruction suivante affecte le texte dun contrle de saisie au champ CustomersCustNo en tant quentier :
MyTableMyField.AsInteger := StrToInt(Edit1.Text);
19-22
Guide du dveloppeur
Accs des valeurs par la proprit par dfaut dun ensemble de donnes
La mthode la plus gnrale pour accder la valeur dun champ consiste recourir la proprit FieldValues. Par exemple, linstruction suivante prend la valeur dune zone de saisie et la transfre dans le champ CustNo de la table Customers :
Customers.FieldValues[CustNo] := Edit2.Text;
Etant donn que la proprit FieldValues est de type Variant, elle convertit automatiquement les autres types de donnes en une valeur Variant. Pour en savoir plus sur les Variants, voir laide en ligne.
A linverse, vous pouvez affecter une valeur un champ en dfinissant la proprit Fields de lensemble de donnes pour le champ voulu. Exemple :
begin Customers.Edit; Customers.Fields[6].AsString := Edit1.Text; Customers.Post; end;
19-23
Si la table de base de donnes sous-jacente dfinit une valeur par dfaut pour le champ, la valeur par dfaut que vous spcifiez dans DefaultExpression est prioritaire. En effet, DefaultExpression sapplique lorsque lensemble de donnes valide lenregistrement contenant le champ, cest--dire avant lapplication de lenregistrement modifi au serveur de base de donnes.
Utilisation de contraintes
Les composants champ des ensembles de donnes ou des ensembles de donnes BDE peuvent utiliser des contraintes SQL importes du serveur. De plus, vos applications peuvent crer et utiliser des contraintes personnalises appliques
19-24
Guide du dveloppeur
Utilisation de contraintes
ces ensembles de donns localement par rapport votre application. Toutes les contraintes sont des rgles ou des conditions qui imposent une limite la porte ou lintervalle des valeurs que le champ peut stocker.
Le nom utilis pour faire rfrence la valeur du champ peut tre toute chane autre qu un mot SQL rserv, tant quelle est utilise avec homognit lintrieur de lexpression de contrainte.
Remarque
Les contraintes spcialises ne sont disponibles que pour les ensembles de donnes BDE et client. Les contraintes spcialises sajoutent toute contrainte dfini par le serveur quant aux valeurs des donnes du champ. Pour connatre les contraintes imposes par le serveur, lisez la valeur de la proprit ImportedConstraint.
19-25
Ne modifiez pas la valeur de ImportedConstraint, sauf si vous voulez modifier des commandes SQL non standard ou propres un serveur qui ont t importes en tant que commentaires, car le moteur de bases de donnes na pas pu les interprter. Pour ajouter des contraintes supplmentaires sur la valeur dun champ, utilisez la proprit CustomConstraint. Les contraintes personnalises sont imposes en plus des contraintes importes. Si les contraintes du serveur changent, la valeur de ImportedConstraint change aussi, mais les contraintes introduites dans la proprit CustomConstraint persistent. La suppression des contraintes de la proprit ImportedConstraint nentrane pas la validit des valeurs de champs qui sont en violation avec ces contraintes. La suppression des contraintes signifie simplement que la vrification est effectue par le serveur et non plus localement. Lorsque les contraintes sont vrifies localement, le message derreur spcifi dans la proprit ConstraintErrorMessage apparat au moment o les violations sont dtectes (sinon, les messages derreur affichs proviennent du serveur).
Nom du composant
Quand vous ajoutez des champs avec lditeur de champs un ensemble de donnes contenant des champs objet, des champs objet persistants du type correct sont automatiquement crs pour vous. Lorsque vous ajoutez des champs objet persistants un ensemble de donnes, la proprit ObjectView de
19-26
Guide du dveloppeur
lensemble de donnes prend automatiquement la valeur True, ce qui amne lensemble de donnes stocker ces champs de faon hirarchise, plutt qu les aplanir comme si les champs enfants constitutifs taient des champs spars indpendants. Les proprits suivantes sont communes tous les champs objet et permettent de grer les ensembles de donnes et les champs enfants.
Tableau 19.9 Proprit
Fields ObjectType FieldCount FieldValues
19-27
enfant une zone de saisie appele CityEdit et utilisent la structure ADT suivante :
Address Street City State Zip
A partir de ces champs persistants, vous pouvez accder simplement aux champs enfants dun champ ADT par nom :
CityEdit.Text := CustomerAddrCity.AsString;
Bien que les champs persistants reprsentent la faon la plus facile daccder aux champs enfants ADT, il est impossible de les utiliser si la structure de lensemble de donnes est inconnue lors de la conception. Lorsque vous accdez des champs enfants ADT sans utiliser de champs persistants, vous devez attribuer la valeur True la proprit ObjectView de lensemble de donnes.
Vous pouvez ignorer le nom de la proprit (FieldValues) car FieldValues est la proprit par dfaut de lensemble de donnes.
Remarque
A la diffrence des autres mthodes disponibles lexcution pour accder aux valeurs de champs enfants ADT, la proprit FieldValues fonctionne mme si la proprit ObjectView de lensemble de donnes vaut False.
19-28
Guide du dveloppeur
FieldValues tant la proprit par dfaut de TADTField, le nom de proprit (FieldValues) peut tre ignor. Par consquent, linstruction suivante est quivalente la prcdente :
CityEdit.Text := TADTField(Customer.FieldByName(Address))[1];
ou par nom :
CityEdit.Text := TADTField(Customer.FieldByName(Address)).Fields.FieldByName(City).AsString;
19-29
A partir de ces champs persistants, le code suivant utilise un champ persistant pour affecter une valeur dlment de tableau une zone de saisie nomme TelEdit.
TelEdit.Text := CustomerTelNos_Array0.AsString;
FieldValues tant la proprit par dfaut de TArrayField, vous pouvez aussi crire le code suivant :
TelEdit.Text := TArrayField(Customer.FieldByName(TelNos_Array))[1];
19-30
Guide du dveloppeur
1 Crez un objet TDataSetField persistant en appelant lditeur de champ de lensemble de donnes parent. 2 Crez un ensemble de donnes reprsentant les valeurs de ce champ ensemble de donnes. Il doit avoir un type compatible avec lensemble de donnes parent. 3 Affectez la proprit DataSetField de lensemble de donnes cr ltape 2 le champ ensemble de donnes persistant cr ltape 1.
Si le champ ensemble de donnes imbriqu de lenregistrement en cours possde une valeur, le composant ensemble de donnes dtail contient des enregistrements avec les donnes imbriques ; sinon, lensemble de donnes dtail est vide. Avant dinsrer des enregistrements dans un ensemble de donnes imbriqu, vous devez avoir post lenregistrement correspondant dans la table matre, sil vient juste dtre insr. Si lenregistrement insr na pas t post, il sera automatiquement post avant que ne soit post lensemble de donnes imbriqu.
19-31
reprsente un champ de rfrence, le code suivant affiche lobjet associ ce champ pour lenregistrement en cours.
DBGrid1.ShowPopupEditor(DBGrid1.Columns[7]);
1 Crez un objet TDataSetField persistant en appelant lditeur de champ de lensemble de donnes parent. 2 Crez un ensemble de donnes reprsentant la valeur de ce champ ensemble de donnes. 3 Affectez la proprit DataSetField de lensemble de donnes cr ltape 2 le champ ensemble de donnes persistant cr ltape 1.
Si la rfrence est attribue, lensemble de donnes de rfrence contient un enregistrement unique, avec les donnes rfrences. Si la rfrence vaut null, lensemble de donnes de rfrence est vide. Vous pouvez galement utiliser la proprit Fields du champ de rfrence pour accder aux donnes dun champ de rfrence. Par exemple, les lignes suivantes sont quivalentes et affectent des donnes du champ de rfrence CustomerRefCity une zone de saisie appele CityEdit :
CityEdit.Text := CustomerRefCity.Fields[1].AsString; CityEdit.Text := CustomerRefCity.NestedDataSet.Fields[1].AsString;
Lorsque les donnes dun champ rfrence sont modifies, cest en fait les donnes rfrences qui sont modifies. Pour affecter une valeur un champ rfrence, vous devez dabord utiliser une instruction SELECT pour slectionner la rfrence dans la table et ensuite lui attribuer la valeur. Par exemple :
var AddressQuery: TQuery; CustomerAddressRef: TReferenceField; begin AddressQuery.SQL.Text := SELECT REF(A) FROM AddressTable A WHERE A.City = San Francisco; AddressQuery.Open; CustomerAddressRef.Assign(AddressQuery.Fields[0]); end;
19-32
Guide du dveloppeur
20
Chapitre 20
Chapitre
Le moteur de bases de donnes Borland (BDE) est un mcanisme daccs aux donnes pouvant tre partag entre plusieurs applications. Le BDE dfinit une puissante bibliothque dappels API qui peuvent crer, restructurer, mettre jour, interroger ou manipuler des serveurs de bases de donnes locaux ou distants. Le BDE fournit une interface uniforme permettant daccder une grande varit de serveurs, en utilisant des pilotes pour se connecter aux diffrentes bases de donnes. Selon votre version de Delphi, vous pouvez utiliser les pilotes pour base de donnes locale (Paradox, dBASE, FoxPro et Access), les pilotes SQL Links pour base de donnes distante telles que InterBase, Oracle, Sybase, Informix, Microsoft SQL server ou DB2, et un adaptateur ODBC qui vous permet de fournir vos propres pilotes ODBC. Durant son dploiement, vous devez inclure le BDE avec votre application. Bien que cela augmente la taille de lapplication et la complexit du dploiement, le BDE peut tre partag avec dautres applications BDE, et il fournit un large support pour la manipulation des bases de donnes. Mme sil est possible dutiliser lAPI du BDE directement dans votre application, les composants de la page BDE de la palette des composants regroupent toutes ces fonctionnalits.
Remarque
Pour plus dinformations sur lAPI du BDE, voir son fichier daide, BDE32.hlp, qui se trouve dans le rpertoire o vous vous avez install le moteur de bases de donnes Borland.
Architecture BDE
Avec le BDE, votre application utilise une variante de larchitecture gnrale de base de donnes dcrite dans Architecture des bases de donnes la page 14-6. En plus des lments de linterface utilisateur, de la source de donnes et des
20-1
Architecture BDE
ensembles de donnes communs toutes les applications de bases de donnes Delphi, une application BDE peut inclure : Un ou plusieurs composants pour contrler les transactions et grer les connexions aux bases de donnes. Un ou plusieurs composants de session pour isoler les oprations daccs aux donnes telles que les connexions aux bases de donnes, et pour grer des groupes de bases de donnes. Les relations entre les composants dune application BDE sont illustres dans la figure suivante :
Figure 20.1 Composants dune application BDE
20-2
Guide du dveloppeur
Architecture BDE
la page 18-49 pour la description des caractristiques communes aux ensembles de donnes de type requte. Voir Utilisation de TQuery la page 20-9 pour la description des caractristiques spcifiques TQuery. TStoredProc, un ensemble de donnes de type procdure stocke qui excute une procdure stocke dfinie sur un serveur de base de donnes. Voir Utilisation densembles de donnes de type procdure stocke la page 18-58 pour la description des caractristiques communes aux ensembles de donnes de type procdure stocke. Voir Utilisation de TStoredProc la page 20-13 pour la description des caractristiques spcifiques TStoredProc .
Remarque
En plus des trois types densemble de donnes BDE, il existe un ensemble de donnes BDE client (TBDEClientDataSet) qui peut tre utilis pour les mises jour en mmoire cache . Pour plus dinformations sur les mises jour en mmoire cache, voir Utilisation dun ensemble de donnes client pour mettre en cache les mises jour la page 23-18.
Association dun ensemble de donnes avec les connexions de bases de donnes et de session
Pour quun ensemble de donnes BDE puisse rcuprer des donnes sur un serveur, il doit utiliser la fois une base de donnes et une session. Les bases de donnes reprsentent les connexions aux serveurs spcifiques de bases de donnes. La base de donnes identifie un pilote BDE, un serveur particulier de base de donnes utilisant ce pilote et un jeu de paramtres de connexion pour accder ce serveur. Chaque base de donnes est reprsente par un composant TDatabase. Vous pouvez soit associer vos ensembles de donnes avec un composant TDatabase insr dans un formulaire ou un module de donnes, soit identifier simplement le serveur de base de donnes par son nom et laisser Delphi gnrer un composant base de donnes implicite votre place. Il est toutefois recommand dutiliser un composant TDatabase explicite dans la plupart des applications, parce quil vous donne un plus grand contrle sur la faon dtablir la connexion, y compris sur le processus de connexion, et vous permet de crer et dutiliser des transactions. Pour associer un ensemble de donnes BDE une base de donnes, utilisez la propritDatabaseName. DatabaseName est une chane qui contient des informations diffrentes selon que vous utilisez ou non un composant explicite de base de donnes et, si ce nest pas le cas, le type de base de donnes utilis : Si vous utilisez un composant TDatabase explicite, DatabaseName est la valeur de la proprit DatabaseName du composant base de donnes. Si vous dsirez utiliser un composant base de donnes implicite et si la base de donnes possde un alias BDE, vous pouvez spcifier celui-ci comme valeur pour DatabaseName. Un alias BDE reprsente une base de donnes et ses informations de configuration. Les informations de configuration associes avec les alias diffrent avec le type de la base de donnes (Oracle, Sybase, InterBase, Paradox, dBASE, etc.). Servez-vous de loutil dadministration BDE ou de lexplorateur SQL pour crer et grer les alias BDE.
20-3
Architecture BDE
Si vous dsirez utiliser un composant base de donnes implicite pour une base de donnes Paradox ou dBASE, vous pouvez simplement spcifier avec DatabaseName le rpertoire o se trouvent les tables de la base. Unesession fournit la gestion globale dun groupe de connexions aux bases de donnes dans une application. Quand vous ajoutez des ensembles de donnes BDE dans votre application, celle-ci contient automatiquement un composant session nomm Session. Quand vous ajoutez des bases de donnes et des composants ensemble de donnes votre application, ils sont automatiquement associs cette session par dfaut. Ce composant gre aussi laccs aux fichiers Paradox protgs par mot de passe, et spcifie les rpertoires pouvant partager des fichiers Paradox sur un rseau. Vous pouvez grer les connexions aux bases de donnes et accder aux fichiers Paradox en utilisant les proprits, les vnements et les mthodes de la session. Vous pouvez vous servir de la session par dfaut pour grer toutes les connexions aux bases de donnes dans votre application. Vous pouvez aussi ajouter des sessions supplmentaires au moment de la conception, ou les crer dynamiquement lors de lexcution pour grer un sous-ensemble de connexions. Pour associer votre ensemble de donnes avec un composant session explicitement cr, utilisez la proprit SessionName. Si vous nutilisez pas de composant explicite de session dans votre application, il nest pas ncessaire de fournir une valeur cette proprit. Que vous utilisiez la session par dfaut ou spcifiez une session explicite avec la proprit SessionName, vous pouvez accder la session associe un ensemble de donnes en lisant la proprit DBSession.
Remarque
Si vous utilisez un composant session, la proprit SessionName dun ensemble de donnes doit concorder avec la proprit SessionName du composant base de donnes auquel cet ensemble de donnes est associ. Pour plus dinformations sur TDatabase et TSession, voir Connexion aux bases de donnes avec TDatabase la page 20-14 et Gestion des sessions de bases de donnes la page 20-18.
20-4
Guide du dveloppeur
Architecture BDE
Utilisation de TTable
TTable encapsule toute la structure et les donnes dune table de base de donnes sous-jacente. Elle implmente toutes les fonctionnalits de base introduites par TDataSet, ainsi que toutes les caractristiques spciales typiques des ensembles de donnes de type table. Avant dtudier les possibilits uniques offertes par TTable, vous devriez vous familiariser avec les caractristiques communes des bases de donnes dcrites dans Prsentation des ensembles de donnes la page 18-1, y compris la section sur les ensembles de donnes de type table qui commence page 18-29. Comme TTable est un ensemble de donnes BDE, elle doit treassocie avec une base de donnes et une session. Association dun ensemble de donnes avec les connexions de bases de donnes et de session la page 20-3 dcrit la faon de former ces associations. Une fois lensemble de donnes associ avec une base de donnes et une session, vous pouvez le lier une table particulire en dfinissant la proprit TableName et, si vous utilisez une table Paradox, dBASE, FoxPro ou ASCII dlimit par des virgules, la proprit TableType.
Remarque
La table doit tre ferme quand vous modifiez son association une base de donnes, une session ou une autre table, ou quand vous dfinissez la proprit TableType. Cependant, avant de fermer la table pour modifier ces proprits, validez ou annulez toute modification en cours. Si les mises jour en mmoire cache sont actives, appelez la mthode ApplyUpdates pour crire les modifications valides dans la base de donnes.
20-5
Architecture BDE
Les composants TTable offrent un support unique aux tables des bases de donnes locales (Paradox, dBASE, FoxPro, ASCII dlimit par des virgules). De plus, les composants TTable peuvent bnficier du support du BDE pour les oprations groupes (oprations consistant ajouter, mettre jour, supprimer ou copier des groupes entiers denregistrements). Ce support est dcrit dans Importation des donnes dune autre table la page 20-8.
Types de tables reconnues par le BDE daprs les extensions Type de table
Paradox Paradox dBASE Texte ASCII
Si votre table locale Paradox, dBASE ou ASCII utilise les extensions dcrites dans le tableau prcdent, vous pouvez laisser TableType sur ttDefault. Sinon, votre application doit dfinir TableType pour indiquer le type rel de la table. Le tableau suivant indique les valeurs que vous pouvez assigner TableType :
Tableau 20.2 Valeur
ttDefault ttParadox ttDBase ttFoxPro ttASCII
20-6
Guide du dveloppeur
Architecture BDE
lecture/criture une base Paradox, dBASE ou FoxPro. Pour lobtenir, mettez la proprit Exclusive du composant table True avant douvrir la table. Si vous russissez ouvrir la table avec un accs exclusif, les autres applications ne peuvent plus ni lire ni crire de donnes dans la table. La requte daccs exclusif ne peut tre honore que si la table nest pas dj en utilisation au moment o vous louvrez. Les instructions suivantes ouvrent une table en accs exclusif :
CustomersTable.Exclusive := True; {Etablit la requte de verrouillage exclusif} CustomersTable.Active := True; {Ouvre la table} Remarque
Vous pouvez essayer dappliquer Exclusive aux tables SQL, mais certains serveurs ne supportent pas le verrouillage exclusif au niveau des tables. Dautres peuvent admettre le verrouillage exclusif, mais permettre tout de mme dautres applications de lire des donnes dans la table. Pour plus dinformations sur le verrouillage exclusif de tables de bases de donnes, voir la documentation de votre serveur.
20-7
Architecture BDE
Aprs avoir ajout des fichiers dindex .MDX ou .NDX, les noms des index individuels du fichier dindex sont accessibles et modifiables par la proprit IndexName. Les repres dindex sont aussi lists en utilisant la mthode GetIndexNames et en inspectant les dfinitions dindex travers les objets TIndexDef dans la proprit IndexDefs. Les fichiers .NDX correctement lists sont automatiquement mis jour lorsque des donnes sont ajoutes, modifies ou supprimes dans la table (quun index donn soit ou non utilis dans la proprit IndexName). Dans lexemple ci-dessous, le fichier dindex ANIMALS.MDX est affect la proprit IndexFiles du composant table AnimalsTable, et le repre dindex NAME est affect sa proprit IndexName :
AnimalsTable.IndexFiles.Add('ANIMALS.MDX'); AnimalsTable.IndexName := 'NAME';
Une fois le fichier dindex spcifi, les index MDX ou NDX fonctionnent comme nimporte quel autre index. Spcifier un nom dindex trie les donnes de la table et rend lindex disponible pour les recherches, les portes et (pour les index MDX) les liaisons matre-dtail. Voir Utilisation densembles de donnes de type table la page 18-29 pour plus de dtail sur lutilisation dindex. En utilisant des index .NDX dBASE III PLUS avec les composants TTable, deux considrations particulires sont prendre en compte. La premire est que les fichiers .NDX ne peuvent pas tre utiliss comme base pour les liaisons matredtail. La seconde est que lors de lactivation dun index .NDX avec la proprit IndexName, vous devez inclure lextension .NDX dans le nom de lindex dans la valeur de la proprit :
with Table1 do begin IndexName := 'ByState.NDX'; FindKey(['CA']); end;
20-8
Guide du dveloppeur
Architecture BDE
Ajouter des enregistrements dune autre table la fin de la table en cours. Supprimer dans la table en cours les enregistrements qui apparaissent dans une autre table. BatchMove prend deux paramtres : le nom de la table depuis laquelle importer les donnes, et une spcification de mode qui dtermine quelle opration dimportation effectuer.Le tableau suivant indique les valeurs possibles pour la spcification de mode :
Tableau 20.3 Valeur
batAppend batAppendUpdate
Par exemple, le code suivant met jour tous les enregistrements de la table en cours avec les enregistrements de la table Customer qui possdent les mmes valeurs pour les champs de lindex en cours :
Table1.BatchMove('CUSTOMER.DB', batUpdate);
Limportation denregistrements en utilisant le mode batCopy crase les enregistrements existants. Pour prserver ces derniers, utilisez plutt batAppend. BatchMove neffectue que certaines op rations groupes supportes par le BDE. Dautres fonctions sont disponibles par le composant TBatchMove. Si vous devez dplacer une grosse masse de donnes dans les tables, utilisez TBatchMove au lieu dappeler la mthode de table BatchMove. Pour plus dinformations sur lutilisation de TBatchMove, voir Utilisation de TBatchMove la page 20-55.
Utilisation de TQuery
TQuery reprsente une unique instruction en DDL (Data Definition Language) ou DML (Data Manipulation Language), par exemple une commande SELECT, INSERT, DELETE, UPDATE, CREATE INDEX ou ALTER TABLE. Le langage utilis dans les commandes est spcifique au serveur, mais se conforme gnralement au standard SQL-92. TQuery implmente toutes les fonctionnalits de base introduites par TDataSet, ainsi que toutes les spcificits des ensembles de donnes de type requte. Avant dtudier les caractristiques particulires de TQuery, familiarisez-vous avec les fonctions communes des bases de donnes
20-9
Architecture BDE
dcrites au chapitre 18, Prsentation des ensembles de donnes, y compris la section sur les ensembles de donnes de type requte qui commence page 18-49. Comme TQuery est un ensemble de donnes BDE, il doit habituellement tre associ avec une base de donnes et une session (lexception survient quand vous utilisez TQuery pour une requte htrogne). Consultez Association dun ensemble de donnes avec les connexions de bases de donnes et de session la page 20-3 pour savoir comment former de telles associations. Vous spcifiez linstruction SQL de la requte en dfinissant la proprit SQL. Un composantTQuery peut accder aux donnes dans : Les tables Paradox ou dBASE, en utilisant Local SQL, qui fait partie du BDE. Local SQL est un sous-ensemble de la spcification SQL-92. La plus grande partie de DML et suffisamment de syntaxe DDL sont supports pour travailler avec ces types de tables. Consultez laide locale SQL, LOCALSQL.HLP, pour plus de dtails sur la syntaxe SQL supporte. Les bases de donnes locales InterBase Server, laide du moteur InterBase. Pour plus dinformations sur le support de syntaxe SQL-92 dInterBase et sur le support de syntaxe tendue, voir la rfrence au langage InterBase. Les bases de donnes sur serveurs distants, comme Oracle, Sybase, MS-SQL Server, Informix, DB2, et InterBase. Vous devez installer le pilote SQL Link et un logiciel client sp cifique(fourni par le vendeur) pour accder au serveur de base de donnes. Toute syntaxe SQL supporte par ces serveurs est admise. Pour plus dinformations sur la syntaxe, les limitations et les extensions SQL, voir la documentation de votre serveur.
1 Dfinissez des alias BDE distincts pour chaque base de donnes concerne dans la requte, en utilisant loutil dadministration BDE ou lexplorateur SQL. 2 Laissez vide la proprit DatabaseName de TQuery ; les noms des bases de donnes seront spcifis dans linstruction SQL. 3 Dans la proprit SQL, spcifiez linstruction SQL excuter. Faites-y prcder le nom de chaque table par lalias BDE de la base de donnes de cette table, encadr par des caractres deux-points. La rfrence entire est elle-mme encadre de guillemets. 4 Dfinissez les paramtres de la requte dans la proprit Params. 5 Appelez Prepare pour prparer la requte avant sa premire excution. 6 Appelez Open ou ExecSQL selon le type de requte que vous excutez.
20-10
Guide du dveloppeur
Architecture BDE
Par exemple, vous dfinissez un alias nomm Oracle1 pour une base de donnes Oracle comprenant une table CUSTOMER, et un alias nomm Sybase1 pour une base de donnes Sybase comprenant une table ORDERS. Une requ te simple sur ces deux tables pourrait scrire :
SELECT Customer.CustNo, Orders.OrderNo FROM :Oracle1:CUSTOMER JOIN :Sybase1:ORDERS ON (Customer.CustNo = Orders.CustNo) WHERE (Customer.CustNo = 1503)
Dans une requte htrogne, au lieu de spcifier la base de donnes laide dun alias, vous pouvez utiliser un composant TDatabase. Configurez TDatabase afin quil pointe sur la base de donnes, affectez la proprit TDatabase.DatabaseName une valeur arbitraire mais unique, et utilisez ensuite cette valeur dans linstruction SQL au lieu dun nom dalias BDE.
Les requtes sur un serveur de base de donnes distant sont analyses par le serveur. Si la proprit RequestLive a pour valeur True, linstruction SQL doit rester dans les standards Local SQL et se conformer de plus toute restriction impose par le serveur, car le BDE en a besoin pour communiquer les modifications de donnes la table. Un ensemble de rsultats dynamique dune requte sur une vue ou une table unique est renvoy si la requte ne contient aucun des lments suivants : Clause DISTINCT dans linstruction SELECT
20-11
Architecture BDE
Fonctions dagrgat avec ou sans clauses GROUP BY ou HAVING Rfrences plusieurs tables de base ou vues modifiables (jointures) Sous-requ tes qui rfrencent la table dans la clause FROM ou dautres tables Si une application demande et reoit un ensemble de rsultats dynamique, la proprit CanModify du composant requte est dfinie True. Mme si la requ te renvoie un ensemble de rsultats dynamique, il nest pas s r que vous puissiez mettre jour lensemble de rsultats directement sil contient des champs lis ou si vous changez dindex avant de tenter une mise jour. Si ces conditions se prsentent, vous devez considrer lensemble de rsultats comme tant en lecture seule, et le mettre jour en consquence. Si une application demande un ensemble de rsultats dynamique, mais que la syntaxe de linstruction SELECT ne le permette pas, le BDE retourne : Soit un ensemble de rsultats en lecture seule pour les requtes effectues sur Paradox ou dBASE. Soit un code derreur pour les requtes SQL effectues sur un serveur distant.
1 Associez lobjet de mise jour la requte en dfinissant la proprit UpdateObject de la requ te lobjet TUpdateSQL que vous utilisez. 2 Affectez aux proprits ModifySQL, InsertSQL et DeleteSQL de lobjet de mise jour les instructions SQL qui effectuent les mises jour appropries aux donnes de votre requte.
Si vous utilisez le BDE pour mettre en mmoire cache les mises jour, vous devez utiliser un objet de mise jour.
Remarque
Pour plus dinformations sur les objets de mise jour, voir Utilisation dobjets mise jour pour mettre jour un ensemble de donnes la page 20-45.
20-12
Guide du dveloppeur
Architecture BDE
Utilisation de TStoredProc
TStoredProc reprsente une procdure stocke. Elle implmente toutes les fonctionnalits introduites par TDataSet, ainsi que la plupart des fonctionnalits spciales typiques des ensembles de donnes de type procdure stocke. Avant dtudier les caractristiques particulires de TStoredProc, familiarisez-vous avec les fonctions communes des bases de donnes dcrites au chapitre 18, Prsentation des ensembles de donnes, y compris la section sur les ensembles de donnes de type procdure stocke qui commence en page 18-58. Puisque TStoredProc est un ensemble de donnes BDE, il doit tre associ une base de donnes et une session. Voir Association dun ensemble de donnes avec les connexions de bases de donnes et de session la page 20-3 pour savoir comment former de telles associations. Une fois lensemble de donnes associ une base de donnes et une session, vous pouvez le lier une procdure stocke particulire en dfinissant la proprit StoredProcName. TStoredProc diffre des autres ensembles de donnes de type procdure stocke par les points suivants : Il vous donne un plus grand contrle sur la faon de lier les paramtres . Il fournit la gestion des procdures stockes surcharges Oracle.
Si vous voulez dfinir ParamBindMode pbByNumber, vous devez spcifier des paramtres de type correct dans lordre correct. Vous pouvez consulter le code source dune procdure stocke dun serveur dans lexplorateur SQL pour dterminer lordre correct et le type des paramtres indiquer.
20-13
Architecture BDE
Si Overload a pour valeur zro (valeur par dfaut), il ny a pas de redfinition. Si Overload a pour valeur 1, le composant procdure stocke excute la premire procdure stocke quil trouve sur le serveur Oracle ayant le nom redfini ; si Overload a pour valeur 2, il excute la seconde, et ainsi de suite.
Remarque
Les procdures stockes redfinies peuvent prendre des paramtres dentre et de sortie diffrents. Voir la documentation de votre serveur Oracle pour plus dinformations.
20-14
Guide du dveloppeur
Architecture BDE
Si vous utilisez un composant base de donnes implicite, la session de ce composant base de donnes est celle spcifie par la proprit SessionName de lensemble de donnes.
20-15
Architecture BDE
toute valeur dj affecte AliasName est efface pour viter tout conflit potentiel entre le nom du pilote que vous spcifiez et le nom du pilote faisant partie de lalias BDE identifi par AliasName. DatabaseName vous permet de fournir votre propre nom pour une connexion de base de donnes. Ce nom sajoute alors AliasName ou DriverName, et est local votre application. DatabaseName peut tre un alias BDE ou, pour les fichiers Paradox et dBASE, un chemin daccs qualifi. Comme AliasName, DatabaseName apparat ensuite dans les listes droulantes pour les composants ensemble de donnes afin de vous permettre de les lier aux composants base de donnes. Au moment de la conception, pour spcifier un alias BDE, affecter un pilote BDE ou crer un alias BDE local, double-cliquez sur un composant base de donnes pour appeler lditeur de proprits de bases de donnes. Vous pouvez entrer un DatabaseName dans la zone de saisie Nom de lditeur de proprits. Vous pouvez entrer un nom dalias BDE existant dans la bote options Nom dalias pour la proprit Alias, ou choisir un alias existant dans la liste droulante. La bote options Nom de pilote vous permet de saisir le nom dun pilote BDE existant pour la proprit DriverName, mais vous pouvez aussi en choisir un dans la liste droulante des pilotes existants.
Remarque
Lditeur de proprits de bases de donnes vous permet aussi de visualiser et de dfinir les paramtres de connexion BDE, et de dfinir ltat des proprits LoginPrompt et KeepConnection. Pour plus dinformations sur les paramtres de connexion, voir Dfinition des paramtres dalias BDE ci-dessous. Pour plus dinformations sur LoginPrompt, voir Contrle de la connexion au serveur la page 17-4. Pour plus dinformations sur KeepConnection, voir Ouverture dune connexion avec TDatabase la page 20-17.
20-16
Guide du dveloppeur
Architecture BDE
Quand vous appelez lditeur de proprits de bases de donnes pour la premire fois, les paramtres de lalias BDE ne sont pas visibles. Pour afficher les paramtres en cours, cliquez sur Dfaut. Les paramtres en cours saffichent dans la zone mmo Paramtres de connexion. Vous pouvez diter les entres existantes ou en ajouter de nouvelles. Pour effacer les paramtres existants, cliquez sur Effacer. Les modifications ne prennent effet que lorsque vous cliquez sur OK. A lexcution, lapplication ne peut dfinir les paramtres dalias quen modifiant directement la proprit Params. Pour plus dinformations sur les paramtres spcifiques lutilisation de pilotes SQL Links avec le BDE, voir le fichier daide en ligne SQL Links.
20-17
Architecture BDE
Si vous utilisez TCP/IP : Le logiciel de communication TCP/IP est-il install ? La bonne WINSOCK.DLL est-elle installe ? Ladresse IP du serveur est-elle recense dans le fichier HOSTS du client ? DNS (Domain Name Services) est-il correctement configur ? Pouvez-vous effectuer un ping du serveur ? Pour dautres conseils de dpannage, voir le guide de lutilisateur SQL Links en ligne et la documentation de votre serveur.
Utilisation dODBC
Une application peut utiliser les sources de donnes ODBC (par exemple, Btrieve). Une connexion par pilote ODBC requiert : Un pilote ODBC fourni par le vendeur. Microsoft ODBC Driver Manager. Lutilitaire dadministration BDE. Pour configurer un alias BDE pour une connexion par pilote ODBC, utilisez lutilitaire dadministration BDE. Pour plus dinformations, voir le fichier daide en ligne de lutilitaire dadministration BDE.
20-18
Guide du dveloppeur
Architecture BDE
pas visible dans votre module de donnes ou votre fiche au moment de la conception, mais vous pouvez accder par code ses proprits et ses mthodes lors de lexcution. Pour utiliser la session par dfaut, vous navez pas crire de code, moins que votre application doive : Explicitement activer ou dsactiver une session, en activant ou dsactivant la capacit douverture de base de donnes de la session. Modifier les proprits de la session, par exemple spcifier les proprits par dfaut pour les composants base de donnes gnrs implicitement. Excuter les mthodes dune session, comme g rer les connexions aux bases de donnes (par exemple ouvrir et fermer des connexions de bases de donnes en rponse aux actions de lutilisateur). Rpondre aux vnements de session, comme quand lapplication essaie daccder une table Paradox ou dBASE protge par mot de passe. Dfinir des rpertoires Paradox comme avec la proprit NetFileDir pour accder aux tables Paradox sur un rseau et avec la proprit PrivateDir sur un disque dur local pour acclrer les performances. Grer les alias BDE qui dcrivent les configurations de connexion possibles pour les bases de donnes et les ensembles de donnes qui utilisent la session. Que vous ajoutiez les composants base de donnes une application au moment de la conception ou que vous les criez dynamiquement lexcution, ils sont automatiquement associs la session par dfaut, moins que vous ne les affectiez spcifiquement une session diffrente. Si vous ouvrez un ensemble de donnes non associ un composant base de donnes, Delphi va automatiquement : Crer un composant base de donnes pour cet ensemble de donnes lexcution. Associer le composant base de donnes la session par dfaut. Initialiser certaines proprits-cls du composant base de donnes, bases sur celles de la session par dfaut. Parmi les plus importantes de ces proprits se trouve KeepConnections, qui dtermine quand les connexions de bases de donnes sont maintenues ou interrompues par lapplication. La session par dfaut procure un large ensemble de valeurs par dfaut pouvant tre utilises par la plupart des applications. Il nest ncessaire dassocier un composant base de donnes une session explicitement nomme que si le composant excute une requte simultane sur une base de donnes dj ouverte par la session par dfaut. Dans ce cas, chaque requte concurrente doit fonctionner dans sa propre session. Les applications de bases de donnes multithreads requirent aussi des sessions multiples, dans lesquelles chaque thread possde sa propre session. Les applications peuvent crer des composants session supplmentaires selon leurs besoins. Les applications de bases de donnes BDE comprennent automatiquement un composant liste de session, nomm Sessions, que vous
20-19
Architecture BDE
pouvez utiliser pour grer tous vos composants session. Pour plus dinformations sur la gestion de sessions multiples, voir Gestion de sessions multiples la page 20-32. Vous pouvez placer sans risque des composants session dans des modules de donnes. Cependant, si vous mettez un module de donnes contenant un ou plusieurs composants session dans le rfrentiel dobjets, assurez-vous que la proprit AutoSessionName a pour valeur True pour viter tout conflit despace dappellation quand les utilisateurs en hritent.
Il est impossible de mettre Active False pour la session par dfaut au moment de la conception. Bien quil soit possible de fermer la session par dfaut lexcution, ce nest pas recommand. Vous pouvez aussi utiliser les mthodes Open et Close dune session pour activer ou dsactiver les sessions autres que la session par dfaut lexcution. Par exemple, la simple ligne de code suivante ferme toutes les bases de donnes et ensembles de donnes ouverts pour une session :
Session1.Close;
20-20
Guide du dveloppeur
Architecture BDE
Ce code met la proprit Active de Session1 False. Quand la proprit Active dune session a pour valeur False, tout essai par lapplication douvrir une base de donnes ou un ensemble de donnes remet Active True et appelle le gestionnaire dvnement OnStartup de la session, sil existe. Vous pouvez aussi coder explicitement la ractivation de la session lexcution. Le code suivant ractive Session1 :
Session1.Open; Remarque
Si une session est active, vous pouvez aussi ouvrir et fermer des connexions individuelles de bases de donnes. Pour plus dinformations, voir Fermeture des connexions de bases de donnes la page 20-22.
La persistance de la connexion pour un composant base de donnes plac explicitement dans un module de donnes ou une fiche est contrle par la proprit KeepConnection de ce composant base de donnes. Si elle est dfinie diffremment, la proprit KeepConnection dun composant base de donnes prend toujours le pas sur la proprit KeepConnections de la session. Pour plus dinformations sur le contrle des connexions individuelles de bases de donnes au sein dune session, voir Gestion des connexions de bases de donnes la page 20-22. KeepConnections doit tre True pour les applications qui ouvrent et ferment souvent tous les ensembles de donnes associs une base de donnes sur un serveur distant. Ce rglage rduit le trafic du rseau et acclre laccs aux donnes, parce quil signifie quune connexion ne doit tre ouverte et ferme quune seule fois durant la vie de la session. Sinon, chaque fois que lapplication ferme ou rtablit une connexion, cela implique la surcharge dattacher et de dtacher la base de donnes.
Remarque
Mme avec KeepConnections True pour une session, vous pouvez fermer et librer les connexions de bases de donnes inactives pour tous les composants base de donnes implicites en appelant la mthode DropConnections. Pour plus dinformations sur DropConnections, voir Interruption des connexions de bases de donnes inactives la page 20-23.
20-21
Architecture BDE
OpenDatabase active la session si elle ne lest pas dj, puis vrifie si le nom de base de donnes spcifi concorde avec la proprit DatabaseName de lun des composants base de donnes de la session. Si le nom ne correspond aucun composant base de donnes existant, OpenDatabase cre un composant base de donnes temporaire en utilisant le nom spcifi. Finalement, OpenDatabase appelle la mthode Open du composant base de donnes pour se connecter au serveur. Chaque appel OpenDatabase incrmente dune unit un compteur de rfrence pour la base de donnes. Tant que ce compteur reste suprieur 0, la base de donnes est ouverte.
Si le nom de base de donnes spcifi est associ un composant base de donnes temporaire (implicite), et si la proprit KeepConnections de la session a
20-22
Guide du dveloppeur
Architecture BDE
pour valeur False, le composant base de donnes est libr, fermant effectivement la connexion.
Remarque
Si KeepConnections a pour valeur False, les composants base de donnes temporaires sont ferms et librs automatiquement quand le dernier ensemble de donnes associ au composant base de donnes est ferm. Une application peut toujours appeler CloseDatabase avant ce moment pour forcer la fermeture. Pour librer les composants base de donnes temporaires quand KeepConnections a pour valeur True, appelez la mthode Close du composant base de donnes, puis la mthode DropConnections de la session. Lappel de CloseDatabase pour un composant base de donnes persistant ne ferme pas rellement la connexion. Pour cela, appelez directement la mthode Close du composant base de donnes. Il existe deux faons de fermer toutes les connexions de bases de donnes au sein de la session : Mettre la proprit Active de la session False. Appeler la mthode Close pour la session. Quand vous mettez Active False, Delphi appelle automatiquement la mthode Close. Close dconnecte toutes les bases de donnes actives en librant les composants base de donnes temporaires et en appelant la mthode Close de chaque composant base de donnes persistant. Finalement, Close met le handle BDE de la session nil.
Remarque
Les composants base de donnes temporaires pour lesquels un ou plusieurs ensembles de donnes sont actifs ne sont ni supprims ni librs par cet appel. Pour librer ces composants, appelez Close.
20-23
Architecture BDE
Le code suivant recherche dans la session par dfaut un composant base de donnes en utilisant lalias DBDEMOS, et, sil nen trouve pas, le cre et louvre :
var DB: TDatabase; begin DB := Session.FindDatabase('DBDEMOS'); if (DB = nil) then { La base de donnes nexiste pas} DB := Session.OpenDatabase('DBDEMOS'); { la crer et louvrir} if Assigned(DB) and DB.Connected then begin DB.StartTransaction; ... end; end;
20-24
Guide du dveloppeur
Architecture BDE
Lemploi de la fonction InputBox, ci-dessus, est pour dmonstration seulement. Dans une application relle, utilisez les fonctions de saisie de mot de passe, qui masquent ce dernier mesure de sa frappe, comme la fonction PasswordDialog ou une fiche personnalise. Le bouton Ajouter de la bote de dialogue de la fonction PasswordDialog a le mme effet que la mthode AddPassword.
if PasswordDialog(Session) then Table1.Open else ShowMessage('Aucun mot de passe fourni, impossible douvrir la table !'); end;
20-25
Architecture BDE
Dans la mthode Password, la fonction InputBox demande un mot de passe lutilisateur. La mthode AddPassword fournit alors par programme le mot de passe saisi dans la bote de dialogue la session.
procedure TForm1.Password(Sender: TObject; var Continue: Boolean); var Passwrd: String; begin Passwrd := InputBox('Entrez le mot de passe', 'Mot de passe:', '');
20-26
Guide du dveloppeur
Architecture BDE
Lvnement OnPassword (et donc le gestionnaire dvnement Password) est dclench par un essai douverture dune table protge par mot de passe, comme prsent ci-dessus. Mme si lutilisateur est invit fournir un mot de passe dans le gestionnaire dvnement OnPassword, lessai douverture peut chouer en cas de saisie dun mot de passe incorrect ou si une autre erreur survient.
procedure TForm1.OpenTableBtnClick(Sender: const CRLF = #13 + #10; begin try Table1.Open; except on E:Exception do begin ShowMessage('Error!' + CRLF + E.Message + CRLF + 'Terminating application...'); Application.Terminate; end; end; end; TObject);
{ cette ligne dclenche lvnement OnPassword} { exception si impossible douvrir la table } { afficher lerreur expliquant le problme }
{ fin de lapplication }
NetFileDir ne peut tre modifie que lorsquune application na ouvert aucun fichier Paradox. Si vous modifiez NetFileDir lexcution, vrifiez quelle pointe vers un rpertoire rseau valide partag par vos utilisateurs rseau.
20-27
Architecture BDE
PrivateDir spcifie le rpertoire de stockage des fichiers temporaires de traitement des tables, comme ceux gnrs par le BDE pour manipuler les instructions SQL locales. Si aucune valeur nest spcifie pour la proprit PrivateDir, le BDE utilise automatiquement le rpertoire en cours au moment de son initialisation. Si votre application sexcute directement sur un serveur de fichiers rseau, vous pouvez amliorer ses performances lexcution en dfinissant PrivateDir au disque dur local de lutilisateur avant douvrir la base de donnes.
Remarque
Il ne faut pas dfinir PrivateDir au moment de la conception puis ouvrir la session dans lEDI. Cela aurait pour consquence de gnrer une erreur spcifiant que le rpertoire est occup lors de lexcution de votre application depuis lEDI. Le code suivant dfinit le paramtrage de la proprit PrivateDir de la session par dfaut sur le rpertoire C:\TEMP dun utilisateur :
Session.PrivateDir := 'C:\TEMP';
Important
Ne dfinissez pas PrivateDir sur le rpertoire racine dun disque. Utilisez toujours un sous-rpertoire.
AddStandardAlias cre un nouvel alias BDE pour les tables Paradox, dBASE ou ASCII. AddStandardAlias prend trois paramtres de type chane : le nom de lalias, le chemin daccs qualifi vers la table Paradox ou dBASE, et le nom du pilote
20-28
Guide du dveloppeur
Architecture BDE
par dfaut utiliser lors de lessai douverture dune table dont le nom ne possde pas dextension. Par exemple, linstruction suivante utilise AddStandardAlias pour crer un nouvel alias pour laccs une table Paradox :
AddStandardAlias('MYDBDEMOS', 'C:\TESTING\DEMOS\', 'Paradox');
Quand vous ajoutez un alias une session, le BDE stocke une copie de lalias en mmoire, o il est seulement disponible cette session et toute autre session pour laquelle cfmPersistent est inclus dans la proprit ConfigMode. ConfigMode est un ensemble qui dcrit quels types dalias peuvent tre utiliss par les bases de donnes dans la session. Le paramtrage par dfaut est cmAll, qui se traduit par lensemble [cfmVirtual, cfmPersistent, cfmSession]. Si ConfigMode a pour valeur cmAll, une session peut voir tous les alias crs dans cette session (cfmSession), tous les alias du fichier de configuration BDE du systme de lutilisateur (cfmPersistent), et tous les alias que le BDE maintient en mmoire (cfmVirtual). Vous pouvez modifier ConfigMode pour restreindre les alias que les bases de donnes dune session peuvent utiliser. Par exemple, dfinir ConfigMode cfmSession restreint la vue dune session aux seuls alias crs au sein de cette session. Tous les autres alias du fichier de configuration BDE ou en mmoire ne sont pas disponibles. Pour rendre un alias nouvellement cr disponible toutes les sessions et aux autres applications, utilisez la mthode SaveConfigFile de la session. SaveConfigFile crit les alias en mmoire dans le fichier de configuration BDE, o ils peuvent tre lus et utiliss par les autres applications BDE. Aprs avoir cr un alias, vous pouvez modifier ses paramtres en appelant ModifyAlias. ModifyAlias prend deux paramtres : le nom de lalias modifier et une liste de chanes contenant les paramtres modifier et leurs valeurs. Par exemple, les instructions suivantes utilisent ModifyAlias pour changer le paramtre OPEN MODE pour lalias CATS en READ/WRITE dans la session par dfaut :
var List: TStringList; begin List := TStringList.Create; with List do begin Clear; Add('OPEN MODE=READ/WRITE'); end; Session.ModifyAlias('CATS', List); List.Free; ...
Pour supprimer un alias prcdemment cr dans une session, appelez la mthode DeleteAlias. DeleteAlias prend un seul paramtre, le nom de lalias supprimer. DeleteAlias rend un alias indisponible la session.
Remarque
DeleteAlias ne supprime pas un alias du fichier de configuration BDE si lalias y avait t crit par un appel pralable SaveConfigFile. Pour supprimer lalias du fichier de configuration aprs lappel DeleteAlias, appelez SaveConfigFile de nouveau.
20-29
Architecture BDE
Les composants session fournissent cinq mthodes pour la rcupration dinformations sur les alias BDE, y compris les informations de paramtre et de pilote. Ce sont : GetAliasNames, pour lister les alias auxquels une session a accs. GetAliasParams, pour lister les paramtres dun alias spcifi. GetAliasDriverName, pour retourner le nom du pilote BDE utilis par lalias. GetDriverNames, pour retourner une liste de tous les pilotes BDE disponibles pour la session. GetDriverParams, pour retourner les paramtres de pilote pour un pilote spcifi. Pour plus dinformations sur lutilisation des mthodes dinformation dune session, voir Rcupration des informations dune session ci-dessous. Pour plus dinformations sur les alias BDE et les pilotes SQL Links avec lesquels ils fonctionnent, voir le fichier daide BDE en ligne, BDE32.HLP.
Sauf pour GetAliasDriverName, ces mthodes renvoient un ensemble de valeurs dans une liste de chanes dclare et maintenue par votre application. GetAliasDriverName renvoie une chane unique, le nom du pilote BDE en cours pour un composant de base de donnes particulier utilis par la session.
20-30
Guide du dveloppeur
Architecture BDE
Par exemple, le code suivant rcupre les noms de tous les composants base de donnes et tous les alias connus de la session par dfaut :
var List: TStringList; begin List := TStringList.Create; try Session.GetDatabaseNames(List); ... finally List.Free; end; end;
Crer des sessions supplmentaires est facultatif, moins quune application nexcute des requtes simultanes sur une base de donnes, ou quelle soit multithread. Pour permettre la cration dynamique dun composant session lexcution, suivez les tapes ci-dessous :
1 Dclarez une variable TSession. 2 Instanciez une nouvelle session en appelant la mthode Create. Le constructeur dfinit une liste vide de composants base de donnes pour la session, dfinit la proprit KeepConnections True, et ajoute la session la liste des sessions maintenue par le composant liste de sessions de lapplication. 3 Dfinissez la proprit SessionName de la nouvelle session un nom unique. Cette proprit est utilise pour associer les composants base de donnes la session. Pour plus dinformations sur la proprit SessionName, voir Affectation dun nom une session la page 20-32. 4 Activez la session et ajustez ses proprits si ncessaire.
Vous pouvez aussi crer et ouvrir des sessions avec la mthode OpenSession de TSessionList. Lemploi de OpenSession est plus sr que lappel de Create, parce que OpenSession ne cre la session que si elle nexiste pas dj. Pour plus dinformations sur OpenSession, voir Gestion de sessions multiples la page 20-32. Le code suivant cre un nouveau composant session, lui affecte un nom et ouvre la session pour les oprations de bases de donnes qui suivent (non prsentes ici). Aprs usage, la session est dtruite par un appel la mthode Free.
Remarque
20-31
Architecture BDE
var SecondSession: TSession; begin SecondSession := TSession.Create(Form1); with SecondSession do try SessionName := 'SecondSession'; KeepConnections := False; Open; ... finally SecondSession.Free; end; end;
Quand vous placez un composant session, vous devez aussi dfinir sa proprit SessionName une valeur unique afin dviter les conflits avec la proprit SessionName de la session par dfaut.
20-32
Guide du dveloppeur
Architecture BDE
Placer un composant session au moment de la conception prsuppose que le nombre de threads (et donc de sessions) requis par lapplication lexcution est statique. Cependant, il est plus probable quune application doive crer des sessions dynamiquement. Pour cela, appelez la mthode OpenSession de lobjet global Sessions lexcution. OpenSession ne demande quun seul paramtre, un nom de session qui doit tre unique parmi tous les noms de sessions de lapplication. Le code suivant cre dynamiquement et active une nouvelle session avec un nom gnr unique :
Sessions.OpenSession('RunTimeSession' + IntToStr(Sessions.Count + 1));
Cette instruction gnre un nom unique pour une nouvelle session en rcuprant le nombre de sessions en cours et en laugmentant de 1. Notez que si vous crez et dtruisez dynamiquement des sessions lexcution, ce code exemple ne fonctionnera comme prvu. Nanmoins, il montre comment utiliser les proprits et les mthodes de Sessions pour grer les sessions multiples. Sessions est une variable de type TSessionList qui est automatiquement instancie pour les applications de bases de donnes BDE. Vous pouvez utiliser les proprits et les mthodes de Sessions pour tracer les sessions multiples dune application de base de donnes multithread. Le tableau suivant rsume les proprits et les mthodes du composant TSessionList :
Tableau 20.5
Count FindSession
Proprit ou M thode
GetSessionNames
En exemple lutilisation des proprits et des mthodes de Sessions dans une application multithread, considrez ce qui se passe quand vous voulez ouvrir une connexion de base de donnes. Pour dterminer si une connexion existe dj, utilisez la proprit Sessions pour parcourir chaque session de la liste de sessions, en commenant par la session par dfaut. Examinez la proprit Databases de chaque composant session pour voir si la base de donnes en question est ouverte. Si vous dcouvrez quun autre thread utilise dj la base de donnes dsire, examinez la session suivante de la liste.
20-33
Si aucun thread existant nutilise la base de donnes, vous pouvez ouvrir la connexion avec cette session. En revanche, si tous les threads existants utilisent la base de donnes, vous devez ouvrir une nouvelle session dans laquelle vous ouvrirez une autre connexion de base de donnes. Si vous rpliquez un module de donnes contenant une session dans une application multithread, o chaque thread contient sa propre copie du module de donnes, vous pouvez utiliser la proprit AutoSessionName pour vous assurer que tous les ensembles de donnes de ce module de donnes utilisent la session adquate. Dfinir AutoSessionName True permet la session de gnrer dynamiquement son propre nom unique quand elle est cre lexcution. Elle affecte ensuite ce nom chaque ensemble de donnes du module de donnes, redfinissant tout nom de session explicitement dfini. Cela assure que chaque thread possde sa propre session, et que chaque ensemble de donnes utilise la session dans son propre module de donnes.
20-34
Guide du dveloppeur
capacits de gestion avance des transactions dun serveur de base de donnes particulier, comme la mise en cache de schma. Pour comprendre les avantages du modle de gestion de transaction de votre serveur, voir la documentation de votre serveur de base de donnes. Pour plus dinformations sur lutilisation du SQL transparent, voir Utilisation du SQL transparent cidessous. Quand vous travaillez sur des bases de donnes locales, vous pouvez utiliser seulement le composant base de donnes pour crer des transactions explicites (les bases de donnes locales ne supportent pas le SQL transparent). Cependant, il existe des limitations lemploi des transactions locales. Pour plus dinformations sur lutilisation des transactions locales, voir Utilisation de transactions locales la page 20-36.
Remarque
Vous pouvez minimiser le nombre des transactions ncessaires en mettant les mises jour en mmoire cache. Pour plus dinformations sur les mises jour en mmoire cache, voir Utilisation dun ensemble de donnes client pour mettre en cache les mises jour la page 23-18 et Utilisation du BDE pour placer en mmoire cache les mises jour la page 20-37.
Quand SQLPASSTHRU MODE a pour valeur NOT SHARED, vous devez utiliser des composants base de donnes distincts pour les ensembles de donnes qui
20-35
passent des instructions de transaction SQL au serveur et pour les ensembles de donnes qui ne le font pas.
Quand vous utilisez des transactions avec des tables locales Paradox, dBASE, Access et FoxPro, dfinissez TransIsolation tiDirtyRead au lieu dutiliser la valeur par dfaut tiReadCommitted. Une erreur BDE est renvoye si TransIsolation est dfinie une valeur autre que tiDirtyRead pour les tables locales. Quand une transaction est dmarre sur une table locale, les mises jour effectues sur la table sont consignes. Chaque enregistrement du journal contient lancien tampon dun enregistrement. Quand une transaction est active, les enregistrements mis jour sont verrouills jusqu ce que la transaction soit valide ou annule. En cas dannulation, les anciens tampons denregistrements sont appliqus au lieu des nouveaux, afin de les restaurer dans leur tat antrieur. Les transactions locales sont plus limites que les transactions sur les serveurs SQL ou les pilotes ODBC. En particulier, les restrictions suivantes sappliquent aux transactions locales : La rcupration automatique en cas de problme nest pas fournie. Les instructions de dfinition de donnes ne sont pas supportes. Les transactions ne peuvent pas tre effectues sur des tables temporaires. Le niveau TransIsolation doit tre dfini tiDirtyRead. Pour Paradox, les transactions locales ne peuvent tre effectues que sur les tables comportant des index valides. Il est impossible dannuler les modifications sur des tables Paradox qui nont pas dindex. Un nombre limit denregistrements peut tre verrouill et modifi. Avec les tables Paradox, vous tes limit 255 enregistrements. Avec dBASE la limite est de 100. Les transactions ne peuvent tre effectu es sur le pilote ASCII BDE. Fermer un curseur sur une table durant une transaction annule celle-ci sauf si : Plusieurs tables sont ouvertes. Le curseur est ferm sur une table dans laquelle aucune modification na t effectue.
20-36
Guide du dveloppeur
Sur TBDEClientDataSet
Inutile pour les ensembles de donnes clients, qui pratiquent toujours la mise en mmoire cache des mises jour. Utilise un gestionnaire dvnement BeforeUpdateRecord, ou, si lon emploie TClientDataSet, utilise la proprit UpdateObject sur lensemble de donnes BDE source. ChangeCount
Fonction
Dtermine si les mise jour en mmoire cache sont actives pour lensemble de donnes.
UpdateObject
Spcifie lobjet mise jour pour mettre jour les ensembles de donnes en lecture seule.
UpdatesPending
Indique si le cache local contient des enregistrements modifis quil faut appliquer la base de donnes. Indique le type denregistrements mis jour rendre visibles en appliquant les mises jour en mmoire cache. Indique si un enregistrement est inchang, modifi, insr ou supprim . Un vnement pour la gestion des erreurs de mise jour, enregistrement par enregistrement.
UpdateRecordTypes
StatusFilter
UpdateStatus OnUpdateError
UpdateStatus OnReconcileError
20-37
Tableau 20.6
Proprits, mthodes et vnements pour les mises jour en mmoire cache (suite)
Sur TBDEClientDataSet
BeforeUpdateRecord
Fonction
Un vnement pour le traitement des mises jour, enregistrement par enregistrement. Applique la base de donnes les enregistrements du cache local. Supprime toutes les mises jour en attente du cache local, sans les appliquer. Efface le cache des mises jour aprs le succs de lapplication des mises jour. Copie les enregistrements de bases de donnes dans le cache local pour modification et mise jour. Annule les mises jour de lenregistrement en cours si elles ne sont pas encore appliques.
ApplyUpdates
CancelUpdates
CommitUpdates
Reconcile
FetchAll
RevertRecord
Pour une vue densemble du processus de mises jour en mmoire cache, voir Prsentation de lutilisation dun cache pour les mises jour la page 23-20.
Remarque
Mme si vous utilisez un ensemble de donnes client pour placer les mises jour en mmoire cache, lisez la section sur les objets mise jour, page 20-45. Vous pouvez utiliser les objets mise jour dans le gestionnaire dvnement BeforeUpdateRecord de TBDEClientDataSet ou TDataSetProvider pour appliquer les mises jour depuis des procdures stockes ou des requtes multitables.
20-38
Guide du dveloppeur
CancelUpdates supprime toutes les modifications en cours dans la mmoire cache, mais nempche pas lensemble de donnes de continuer placer en mmoire cache les modifications ultrieures.
Remarque
Si vous dsactivez les mises jour en mmoire cache en dfinissant CachedUpdates False, toutes les modifications en attente que vous navez pas encore appliqu es sont perdues sans notification. Pour viter la perte des modifications, testez la proprit UpdatesPending avant de dsactiver les mises jour en mmoire cache.
1 Une transaction de base de donnes dmarre. 2 Les mises jour en mmoire cache sont crites dans la base de donnes (phase 1). Si vous le fournissez, un vnement OnUpdateRecord est dclench pour chaque enregistrement crit dans la base de donnes. Si une erreur survient quand un enregistrement est appliqu la base de donnes, lvnement OnUpdateError est dclench si vous en fournissez un. 3 La transaction est valide si les oprations dcriture sont russies ; elle est annule dans le cas contraire :
Si lcriture dans la base de donnes est russie : Les modifications de la base de donnes sont valides, ce qui termine la transaction de base de donnes. Les mises jour en mmoire cache sont valides, librant le tampon interne du cache (phase 2). Si lcriture dans la base de donnes choue : Les modifications de la base de donnes sont annules, ce qui termine la transaction de base de donnes. Les mises jour en mmoire cache ne sont pas valides, et restent intactes dans le cache interne. Pour plus dinformations sur la cration et lutilisation dun gestionnaire dvnement OnUpdateRecord, voir Cration dun gestionnaire dvnement OnUpdateRecord la page 20-42. Pour plus dinformations sur la gestion des erreurs de mise jour lors de lapplication des mises jour prsentes en mmoire cache, Gestion des erreurs de mise jour en mmoire cache la page 20-43.
20-39
Remarque
Lapplication des mises jour en mmoire cache est particulirement difficile quand vous travaillez avec plusieurs ensembles de donnes en liaison matre/ dtail, car lordre dans lequel vous appliquez les mises jour chaque ensemble de donnes est significatif. Normalement, vous devez mettre jour les tables matre avant les tables dtail, sauf lors de la gestion des enregistrements supprims, o cet ordre doit tre invers. En raison de cette difficult, il est vivement recommand dutiliser des ensembles de donnes client lors de la mise en mmoire cache des mises jour dune fiche matre/dtail. Les ensembles de donnes client grent automatiquement lordre des oprations dans les relations matre/dtail. Il y a deux faons dappliquer les mises jour BDE : Vous pouvez appliquer les mises jour au moyen dun composant base de donnes en appelant sa mthode ApplyUpdates. Cest lapproche la plus simple, car la base de donnes gre tous les dtails de la gestion dune transaction ncessaire au processus de mise jour, et de leffacement du cache de lensemble de donnes quand la mise jour est termine. Vous pouvez appliquer les mises jour pour un ensemble de donnes unique en appelant les mthodes ApplyUpdates et CommitUpdates de lensemble de donnes. Quand vous appliquez les mises jour au niveau de lensemble de donnes, vous devez coder explicitement la transaction pour le processus de mise jour, et appeler explicitement CommitUpdates pour valider les mises jour depuis le cache.
Important
Pour appliquer les mises jour depuis une procdure stocke ou une requte SQL qui ne renvoie pas un ensemble de rsultats dynamique, vous devez utiliser TUpdateSQL pour spcifier comment effectuer les mises jour. Pour les mises jour de jointures (requtes impliquant plusieurs tables), vous devez fournir un objet TUpdateSQL pour chaque table implique, et vous devez utiliser le gestionnaire dvnement OnUpdateRecord pour invoquer ces objets afin deffectuer les mises jour. Consultez Utilisation dobjets mise jour pour mettre jour un ensemble de donnes la page 20-45 pour plus de dtails.
Application des mises jour en mmoire cache avec une base de donnes
Pour appliquer les mises jour prsentes en mmoire cache un ou plusieurs ensembles de donnes dans le contexte dune connexion de base de donnes, appelez la mthode ApplyUpdates du composant base de donnes. Le code suivant applique les mises jour lensemble de donnes CustomersQuery en rponse un vnement clic de bouton :
procedure TForm1.ApplyButtonClick(Sender: TObject); begin // pour les bases de donnes locales Paradox, dBASE et FoxPro // dfinir TransIsolation DirtyRead if not (Database1.IsSQLBased) and not (Database1.TransIsolation = tiDirtyRead) then Database1.TransIsolation := tiDirtyRead; Database1.ApplyUpdates([CustomersQuery]); end;
La squence ci-dessus crit les mises jour en mmoire cache dans la base de donnes dans le contexte dune transaction gnre automatiquement. En cas de
20-40
Guide du dveloppeur
succs, elle valide la transaction, puis les mises jour prsentes en mmoire cache. En cas dchec, elle annule la transaction et laisse le cache de mise jour inchang. Dans ce dernier cas, vous devez grer les erreurs de mises jour en mmoire cache par le biais de lvnement OnUpdateError de lensemble de donnes. Pour plus dinformations sur la gestion des erreurs de mise jour, voir Gestion des erreurs de mise jour en mmoire cache la page 20-43. Le principal avantage appeler la mthode ApplyUpdates dun composant base de donnes est que vous pouvez mettre jour tous les composants ensemble de donnes associs la base de donnes. Le paramtre de la mthode ApplyUpdates pour une base de donnes est un tableau de TDBDataSet. Par exemple, le code suivant applique les mises jour pour deux requtes :
if not (Database1.IsSQLBased) and not (Database1.TransIsolation = tiDirtyRead) then Database1.TransIsolation := tiDirtyRead; Database1.ApplyUpdates([CustomerQuery, OrdersQuery]);
Application des mises jour en mmoire cache avec les mthodes de composant base de donnes
Vous pouvez appliquer directement les mises jour densembles de donnes BDE individuels en utilisant les mthodes ApplyUpdates et CommitUpdates de lensemble de donnes. Chacune de ces mthodes encapsule une phase du processus de mise jour :
1 ApplyUpdates crit les mises jour en mmoire cache dans une base de donnes (phase 1). 2 CommitUpdates efface le cache interne quand lcriture dans la base de donnes est russie (phase 2).
Le code suivant illustre la manire dappliquer les mises jour dans une transaction pour lensemble de donnes CustomerQuery :
procedure TForm1.ApplyButtonClick(Sender: TObject) begin Database1.StartTransaction; try if not (Database1.IsSQLBased) and not (Database1.TransIsolation = tiDirtyRead) then Database1.TransIsolation := tiDirtyRead; CustomerQuery.ApplyUpdates; {essai dcriture des modifications dans la base de donnes} Database1.Commit; { si succs, valider les modifications } except Database1.Rollback; { si chec, annuler les modifications } raise; { dclencher lexception de nouveau pour viter un appel CommitUpdates } end; CustomerQuery.CommitUpdates; { si succs, effacer le cache interne } end;
Si une exception est dclenche durant lappel de ApplyUpdates, la transaction de base de donnes est annule. Cette annulation garantit que la table de base de donnes sous-jacente nest pas modifie. Linstruction raise dans le bloc try...except dclenche lexception, ce qui empche lappel de CommitUpdates.
20-41
Comme CommitUpdates nest pas appele, le cache interne des mises jour nest pas vid, ce qui vous laisse la possibilit de grer les conditions derreur et de relancer la mise jour.
Le paramtre DataSet spcifie lensemble de donnes ayant des mises jour en mmoire cache. Le paramtre UpdateKind indique le type de mise jour qui doit tre effectu sur lenregistrement en cours. UpdateKind peut prendre les valeurs ukModify, ukInsert et ukDelete. Si vous utilisez un objet mise jour, vous devez lui passer ce paramtre lors de lapplication de la mise jour. Vous pouvez aussi avoir besoin dinspecter ce paramtre si votre gestionnaire effectue un traitement spcial selon le type de mise jour. Le paramtre UpdateAction indique si vous avez appliqu la mise jour. UpdateAction peut prendre les valeurs uaFail (valeur par dfaut), uaAbort, uaSkip, uaRetry, uaApplied. Si votre gestionnaire dvnement applique la mise jour avec succs, donnez ce paramtre la valeur uaApplied avant de sortir. Si vous dcidez de ne pas mettre jour lenregistrement en cours, donnez-lui la valeur uaSkip pour prserver les modifications en mmoire cache non appliques. Si vous ne changez pas la valeur de UpdateAction , toute lopration de mise jour de lensemble de donnes est annule et une exception est dclenche. Vous pouvez supprimer le message derreur (et dclencher une exception silencieuse) en donnant UpdateAction la valeur uaAbort. En plus de ces paramtres, vous utiliserez les proprits OldValue et NewValue pour le composant champ associ lenregistrement en cours. OldValue donne la valeur originale du champ telle que rcupre de la base de donnes. Elle peut servir localiser lenregistrement de base de donnes mettre jour. NewValue est la valeur modifie dans la mise jour que vous essayez dappliquer.
20-42
Guide du dveloppeur
Important
Un gestionnaire dvnement OnUpdateRecord, comme un gestionnaire dvnement OnUpdateError ou OnCalcFields, ne doit jamais appeler les mthodes qui modifient lenregistrement en cours dun ensemble de donnes. Lexemple suivant illustre comment utiliser ces paramtres et proprits. Il emploie un composant TTable nomm UpdateTable pour appliquer les mises jour. En pratique, il est plus facile dutiliser un objet mise jour, mais lemploi dune table illustre plus clairement les possibilits.
procedure TForm1.EmpAuditUpdateRecord(DataSet: TDataSet; UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction); begin if UpdateKind = ukInsert then UpdateTable.AppendRecord([DataSet.Fields[0].NewValue, DataSet.Fields[1].NewValue]) else if UpdateTable.Locate('KeyField', VarToStr(DataSet.Fields[1].OldValue), []) then case UpdateKind of ukModify: begin UpdateTable.Edit; UpdateTable.Fields[1].AsString := VarToStr(DataSet.Fields[1].NewValue); UpdateTable.Post; end; ukInsert: begin UpdateTable.Insert; UpdateTable.Fields[1].AsString := VarToStr(DataSet.Fields[1].NewValue); UpdateTable.Post; end; ukDelete: UpdateTable.Delete; end; UpdateAction := uaApplied; end;
DataSet rfrence lensemble de donnes auquel les mises jour sont appliques. Vous pouvez utiliser cet ensemble de donnes pour accder aux nouvelles et anciennes valeurs durant la gestion derreur. Les valeurs originales des champs
20-43
de chaque enregistrement sont stockes dans une proprit TField en lecture seule appele OldValue. Les valeurs modifies sont stockes dans la proprit TField analogue NewValue. Ces valeurs constituent la seule possibilit dinspecter et de modifier les valeurs de mise jour dans le gestionnaire dvnement.
Attention
Nappelez aucune mthode densemble de donnes susceptible de changer lenregistrement en cours (comme Next et Prior). Cela ferait entrer le gestionnaire dvnement dans une boucle sans fin. Le paramtre E est habituellement du type EDBEngineError. Dans ce type dexception, vous pouvez extraire un message derreur que vous pouvez afficher aux utilisateurs dans votre gestionnaire derreur. Par exemple, le code suivant affiche le message derreur dans lintitul dune bote de dialogue :
ErrorLabel.Caption := E.Message;
Ce paramtre est aussi utile pour dterminer la cause exacte de lerreur de mise jour. Vous pouvez rcuprer les codes derreur spcifiques depuis EDBEngineError, et prendre les mesures appropries. Le paramtre UpdateKind dcrit le type de mise jour qui a gnr lerreur. Sauf si votre gestionnaire derreur doit entreprendre des actions spciales selon le type derreur rapport, vous ne lutiliserez sans doute pas. Le tableau suivant prsente les valeurs possibles de UpdateKind :
Tableau 20.7 Valeur
ukModify ukInsert ukDelete
UpdateAction indique au BDE comment continuer le processus de mise jour la sortie de votre gestionnaire dvnement. Au premier appel de votre gestionnaire derreur de mise jour, la valeur de ce paramtre est toujours dfinie uaFail. Selon la condition derreur de lenregistrement qui a gnr lerreur et ce que vous faites pour la corriger, vous dfinissez g nralement UpdateAction une valeur diffrente avant de quitter le gestionnaire : Si votre gestionnaire derreur peut corriger la condition derreur qui a provoqu son intervention, dfinissez UpdateAction laction approprie entreprendre en sortie. Pour les conditions derreur que vous corrigez, dfinissez UpdateAction uaRetry pour appliquer de nouveau la mise jour de lenregistrement. Si vous utilisez la valeur uaSkip, la mise jour de la ligne qui a provoqu lerreur est ignore et la mise jour de lenregistrement reste dans le cache quand toutes les autres mises jour sont termines. uaFail et uaAbort mettent toutes deux un terme toute lopration de mise jour. uaFail dclenche une exception et affiche un message derreur. uaAbort dclenche une exception silencieuse (sans afficher de message derreur).
20-44
Guide du dveloppeur
Le code suivant montre comment un gestionnaire dvnement OnUpdateError vrifie si lerreur de mise jour est lie une violation de cl, et dans ce cas dfinit le paramtre UpdateAction uaSkip :
{ Ajouter 'Bde' votre clause uses pour cet exemple } if (E is EDBEngineError) then with EDBEngineError(E) do begin if Errors[ErrorCount - 1].ErrorCode = DBIERR_KEYVIOL then UpdateAction := uaSkip { violation de cl, ignorer cet enregistrement } else UpdateAction := uaAbort; { ne sait pas ce qui est faux, annuler la mise jour } end; Remarque
Si une erreur survient durant lapplication des mises jour en mmoire cache, une exception est dclenche et un message derreur est affich. A moins que ApplyUpdates ne soit appel dans une construction try...except, un message derreur affich depuis votre gestionnaire dvnement OnUpdateError peut provoquer un double affichage par votre application du mme message derreur. Pour viter la duplication du message derreur, dfinissez UpdateAction uaAbort pour dsactiver laffichage des messages derreur gnrs par le systme.
1 Si vous utilisez un ensemble de donnes client, utilisez un composant fournisseur externe avec TClientDataSet plutt que TBDEClientDataSet. Vous pouvez ainsi dfinir la proprit UpdateObject de lensemble de donnes BDE source (tape 3). 2 Ajoutez un composant TUpdateSQL au mme module de donnes que celui de lensemble de donnes BDE. 3 Affectez la proprit UpdateObject du composant ensemble de donnes BDE le composant TUpdateSQL dans le module de donnes. 4 Spcifiez les instructions SQL ncessaires pour effectuer les mises jour en utilisant les proprits ModifySQL, InsertSQL et DeleteSQL de lobjet mise jour. Vous pouvez utiliser lditeur de mise jour SQL pour composer ces instructions. 5 Fermez lensemble de donnes.
20-45
6 Affectez la proprit CachedUpdates du composant ensemble de donnes la valeur True ou liez lensemble de donnes lensemble de donnes client laide dun fournisseur densemble de donnes. 7 Rouvrez lensemble de donnes.
Remarque
Parfois, vous devez utiliser plusieurs objets mise jour . Par exemple, lors de la mise jour dune jointure multitable ou dune procdure stocke qui reprsente des donnes venant de plusieurs ensembles de donnes, vous devez fournir un objet TUpdateSQL pour chaque table mettre jour. Quand vous utilisez plusieurs objets mise jour, vous ne pouvez pas associer simplement lobjet mise jour lensemble de donnes en dfinissant la proprit UpdateObject. Vous devez plutt appeler manuellement lobjet mise jour depuis un gestionnaire dvnement OnUpdateRecord (si vous utilisez le BDE pour placer les mises jour en mmoire cache) ou BeforeUpdateRecord (si vous utilisez un ensemble de donnes client). Lobjet mise jour encapsule en ralit trois composants TQuery. Chacun de ces composants requ te effectue une tche de mise jour unique. Le premier fournit une instruction SQL UPDATE pour modifier les enregistrements existants ; le second composant fournit une instruction INSERT pour ajouter de nouveaux enregistrements une table ; le troisime fournit une instruction DELETE pour supprimer des enregistrements dune table. Quand vous placez un composant mise jour dans un module de donnes, vous ne voyez pas les composants requte qu il encapsule. Ils sont crs lexcution par le composant mise jour partir de trois proprits de mise jour pour lesquelles vous fournissez des instructions SQL : ModifySQL spcifie linstruction UPDATE. InsertSQL spcifie linstruction INSERT. DeleteSQL spcifie linstruction DELETE. A lexcution, quand le composant de mise jour est utilis pour appliquer les mises jour, il :
1 Slectionne une instruction SQL excuter selon que lenregistrement en cours est modifi, insr ou supprim. 2 Fournit les valeurs de paramtre aux instructions SQL. 3 Prpare et excute linstruction SQL pour effectuer la mise jour spcifie.
20-46
Guide du dveloppeur
lexcution. Par exemple, le code suivant spcifie lexcution une valeur pour la proprit DeleteSQL :
with UpdateSQL1.DeleteSQL do begin Clear; Add(DELETE FROM Inventory I); Add(WHERE (I.ItemNo = :OLD_ItemNo)); end;
A la conception, vous pouvez utiliser lditeur SQL de mise jour pour vous aider composer les instructions SQL qui appliquent les mises jour. Les objets mise jour fournissent une liaison automatique des paramtres pour les paramtres qui rfrencent les valeurs originales et modifies des champs de lensemble de donnes. Vous insrez donc normalement des paramtres avec des noms spcialement formats quand vous composez les instructions SQL . Pour plus dinformations sur lutilisation de ces paramtres, voir Substitution de paramtres dans les instructions SQL de mise jour la page 20-48.
1 Avec linspecteur dobjets, slectionnez le nom de lobjet mise jour dans la liste droulante de la proprit UpdateObject de lensemble de donnes. Cette tape garantit que lditeur SQL de mise jour invoqu dans ltape suivante dtermine les valeurs par dfaut adquates pour les options de gnration SQL. 2 Faites un clic droit sur lobjet mise jour et slectionnez lditeur UpdateSQL dans le menu contextuel. Lditeur SQL de mise jour saffiche. Il cre les instructions SQL pour les proprits ModifySQL, InsertSQL et DeleteSQL de lobjet mise jour, selon lensemble de donnes sous-jacent et les valeurs que vous lui fournissez.
Lditeur SQL de mise jour possde deux pages. La page Options est visible la premire fois que vous invoquez lditeur. Utilisez la bote options Nom de table pour slectionner la table mettre jour. Quand vous spcifiez un nom de table, les botes liste Champs cl et Mettre jour les champs se remplissent avec les colonnes disponibles. La bote liste Mettre jour les champs indique les colonnes mettre jour. Quand vous spcifiez une table pour la premire fois, toutes les colonnes de cette bote liste sont slectionnes pour tre incluses. Vous pouvez faire une slection multiple des champs selon vos besoins. La bote liste Champs cl sert spcifier les colonnes utiliser comme cls durant la mise jour. Pour Paradox, dBASE et FoxPro les colonnes que vous spcifiez doivent correspondre un index existant, mais ce nest pas obligatoire pour les bases de donnes SQL distantes. Au lieu de dfinir Champs cl, vous pouvez cliquer sur le bouton Cls primaires pour choisir les champs cl de la mise jour en fonction de lindex primaire de la table. Cliquez sur Valeurs du Dataset pour ramener les listes de slection leur tat original : tous les champs slectionns en tant que cls et tous ceux slectionns pour mise jour.
20-47
Cochez la case Noms de champs entre guillemets si votre serveur requiert des guillemets autour des noms de champs. Aprs avoir spcifi une table, slectionnez les colonnes cls et les colonnes mettre jour, cliquez sur Gnrer le SQL pour gnrer les instructions SQL prliminaires associer aux proprits ModifySQL, InsertSQL et DeleteSQL du composant mise jour. Dans la plupart des cas, vous devrez affiner les instructions SQL gnres automatiquement. Pour afficher et modifier les instructions SQL gnres, slectionnez la page SQL. Si vous avez gnr des instructions SQL, linstruction de la proprit ModifySQL y est dj affiche dans la zone mmo Texte SQL. Vous pouvez diter linstruction selon vos dsirs.
Important
Gardez lesprit que les instructions SQL gnres sont des points de dpart pour la cration dinstructions de mise jour. Il peut tre ncessaire de les modifier pour quelles sexcutent correctement. Par exemple, si vous travaillez sur des donnes contenant des valeurs NULL, il faut modifier la clause WHERE comme ceci :
WHERE field IS NULL
plutt que dutiliser la variable champ gnre. Testez chaque instruction directement avant de laccepter. Utilisez les boutons radio Type dinstruction pour basculer dune instruction gnre une autre et les diter. Pour accepter les instructions et les associer avec les proprits SQL du composant mise jour, cliquez sur OK.
Les nouvelles valeurs de champs sont habituellement utilises dans les instructions InsertSQL et ModifySQL. Dans la mise jour dun enregistrement
20-48
Guide du dveloppeur
modifi, la nouvelle valeur de champ du cache de mise jour est utilise par linstruction UPDATE pour remplacer lancienne valeur de champ dans la table de base mise jour. Dans le cas dun enregistrement supprim, il ny a pas de nouvelles valeurs, et la proprit DeleteSQL utilise donc la syntaxe :OLD_FieldName. Les anciennes valeurs de champs sont aussi utilises normalement dans la clause WHERE de linstruction SQL pour une mise jour par modification ou suppression pour dterminer quel enregistrement mettre jour ou supprimer. Dans la clause WHERE dune instruction SQL de mise jour UPDATE ou DELETE, fournissez au moins le nombre minimal de paramtres ncessaires pour identifier sans ambigut lenregistrement de la table de base qui est mis jour partir des donnes en mmoire cache. Par exemple, dans une liste de clients, lutilisation du nom de famille peut ne pas tre suffisant pour identifier de manire unique lenregistrement adquat dans la table de base. Il peut y avoir plusieurs enregistrements sous le nom de Martin. Lutilisation de paramtres pour le nom, le prnom et le numro de tlphone peut constituer une combinaison assez prcise, dfaut dun code client unique.
Remarque
Si vous crez des instructions SQL contenant des paramtres qui ne se rfrent pas aux valeurs de champs originales ou modifies, lobjet mise jour ne sait pas comment relier leurs valeurs. Vous pouvez cependant le faire manuellement, en utilisant la proprit Query de lobjet mise jour . Consultez Utilisation de la proprit Query dun composant mise jour la page 20-54 pour plus de dtails.
20-49
Certains types de tables peuvent tre incapables de trouver lenregistrement dans la table de base quand les champs utiliss pour identifier lenregistrement contiennent des valeurs NULL. Dans ces cas, la mise jour par suppression choue pour ces enregistrements. Pour prendre cela en compte, ajoutez une condition pour les champs pouvant contenir une valeur NULL, laide du prdicat IS NULL (en plus dune condition pour une valeur non NULL). Par exemple, si le champ FirstName peut contenir une valeur NULL :
DELETE FROM Names WHERE (LastName = :OLD_LastName) AND ((FirstName = :OLD_FirstName) OR (FirstName IS NULL))
Linstruction InsertSQL ne doit contenir quune instruction SQL avec la commande INSERT. La table de base mettre jour doit tre nomme dans la clause INTO. Dans la clause VALUES, fournissez une liste de paramtres spars par des vigules. Si les paramtres sont nomms comme les champs, ils reoivent automatiquement les valeurs des champs correspondants de lenregistrement figurant dans la mmoire cache de mise jour. Si les paramtres sont nomms dune autre faon, vous devez fournir les valeurs de paramtres. La liste de paramtres fournit les valeurs des champs du nouvel enregistrement insr. Il doit y avoir autant de paramtres de valeur que de champs lists dans linstruction.
INSERT INTO Inventory (ItemNo, Amount) VALUES (:ItemNo, 0)
Linstruction ModifySQL ne doit contenir quune instruction SQL avec la commande UPDATE. La table de base mettre jour doit tre nomme dans la clause FROM. Incluez une ou plusieurs affectations de valeur dans la clause SET. Si les valeurs des affectations de la clause SET sont des paramtres nomms comme les champs, les paramtres reoivent automatiquement les valeurs des champs correspondants de lenregistrement mis jour figurant dans la mmoire cache. Vous pouvez affecter dautres valeurs de champ en utilisant dautres paramtres, tant que les paramtres ne portent pas le nom de champs existants et que vous fournissiez les valeurs. Comme avec linstruction DeleteSQL, fournissez une clause WHERE pour identifier de manire unique lenregistrement de la table de base mettre jour, en utilisant des paramtres nomms comme les champs et prcds du prfixe OLD_. Dans linstruction de mise jour cidessous, le paramtre :ItemNo reoit automatiquement une valeur, contrairement :Price.
UPDATE Inventory I SET I.ItemNo = :ItemNo, Amount = :Price WHERE (I.ItemNo = :OLD_ItemNo)
Considrant le code SQL de mise jour ci-dessus, prenons un exemple o lutilisateur final de lapplication modifie un enregistrement existant. La valeur dorigine du champ ItemNo est 999. Dans une grille connecte lensemble de donnes en mmoire cache, lutilisateur final modifie la valeur du champ ItemNo en 123, et celle du champ Amount en 20. Quand la mthode ApplyUpdates est invoqu e, cette instruction SQL affecte tous les enregistrements de la table de base dont le champ ItemNo a pour valeur 999, en utilisant lancienne valeur
20-50
Guide du dveloppeur
contenue dans le paramtre :OLD_ItemNo. Dans ces enregistrements, linstruction modifie la valeur du champ ItemNo field en 123 (en utilisant le paramtre :ItemNo, la valeur provenant de la grille) et celle du champ Amount en 20.
Quand vous utilisez plusieurs objets mise jour, vous pouvez utiliser TBDEClientDataSet au lieu de TClientDataSet avec un fournisseur externe. La raison est quil nest pas ncessaire de dfinir la proprit UpdateObject de lensemble de donnes source. La proprit DataSet des objets mise jour nest pas disponible dans linspecteur dobjets la conception. Vous ne pouvez dfinir cette proprit qu lexcution.
UpdateSQL1.DataSet := Query1;
Lobjet mise jour utilise cet ensemble de donnes pour obtenir les valeurs de champs originales et modifies pour la substitution de paramtres et, sil sagit dun ensemble de donnes BDE, pour identifier la session et la base de donnes utiliser lors de lapplication des mises jour. Pour que la substitution de paramtres fonctionne correctement, la proprit DataSet de lobjet mise jour doit tre lensemble de donnes qui contient les valeurs de champs mises jour. Lors de lutilisation dun ensemble de donnes BDE pour mettre en mmoire cache les mises jour, il sagit de lensemble de donnes BDE lui-mme. Lors de lutilisation dun ensemble de donnes client, cest un ensemble de donnes client qui est fourni en paramtre au gestionnaire dvnement BeforeUpdateRecord . Quand lobjet mise jour na pas t affect la proprit UpdateObject de lensemble de donnes, ses instructions SQL ne sont pas automatiquement excutes quand vous appelez ApplyUpdates. Pour mettre jour les enregistrements, vous devez appeler manuellement lobjet mise jour depuis un gestionnaire dvnement OnUpdateRecord (si vous utilisez le BDE pour placer les mises jour en mmoire cache) ou BeforeUpdateRecord (si vous utilisez un ensemble de donnes client). Dans ce gestionnaire dvnement, vous devez au moins entreprendre les actions suivantes : Si vous utilisez un ensemble de donnes client pour placer les mises jour en mmoire cache, vous devez vous assurer que les proprits DatabaseName et SessionName des objets mise jour sont dfinies comme les proprits DatabaseName et SessionName de lensemble de donnes source. Le gestionnaire dvnement doit appeler la mthode ExecSQL ou Apply de lobjet mise jour. Cela invoque lobjet mise jour pour chaque enregistrement ncessitant une mise jour. Pour plus dinformations sur
20-51
lexcution des instructions de mise jour, voir Excution des instructions SQL ci-dessous. Affectez au paramtre UpdateAction du gestionnaire dvnement la valeur uaApplied (OnUpdateRecord) ou au paramtre Applied la valeur True (BeforeUpdateRecord). Si vous le dsirez, vous pouvez effectuer une validation ou une modification des donnes, ou dautres oprations qui dpendent de la mise jour de chaque enregistrement.
Attention
Si vous appelez la mthode ExecSQL ou Apply dun objet mise jour dans un gestionnaire dvnement OnUpdateRecord, assurez-vous de ne pas dfinir la proprit UpdateObject de lensemble de donnes cet objet mise jour. Sinon, le rsultat sera une seconde tentative dapplication de la mise jour de chaque enregistrement.
Si linstruction SQL utilise des paramtres autres que des types intgrs (pour les valeurs de champs originales et mises jour), vous devez fournir manuellement les valeurs de paramtres au lieu de vous appuyer sur la substitution de paramtre fournie par la mthode Apply. Consultez Utilisation de la proprit Query dun composant mise jour la page 20-54 pour plus dinformations sur la fourniture manuelle des valeurs de paramtres. Pour plus dinformations sur la substitution de paramtre par dfaut dans les instructions SQL de mise jour, voir Substitution de paramtres dans les instructions SQL de mise jour la page 20-48.
1 Les valeurs de champs initiale et modifie de lenregistrement sont lies aux paramtres de linstruction SQL appropri. 2 Linstruction SQL est excute.
20-52
Guide du dveloppeur
Appelez la mthode Apply pour appliquer la mise jour de lenregistrement en cours dans la mmoire cache de mise jour. Apply est souvent appele depuis un gestionnaire dvnement OnUpdateRecord de lensemble de donnes ou depuis un gestionnaire dvnement BeforeUpdateRecord dun fournisseur.
Attention
Si vous utilisez la proprit UpdateObject de lensemble de donnes pour associer ensemble de donnes et objet mise jour, Apply est appele automatiquement. Dans ce cas, nappelez pas Apply dans un gestionnaire dvnement OnUpdateRecord pour viter une seconde tentative dapplication de la mise jour de lenregistrement en cours. Les gestionnaires dvnements OnUpdateRecord indiquent le type de mise jour qui doit tre appliqu avec un paramtre UpdateKind de type TUpdateKind. Vous devez passer ce paramtre la mthode Apply pour indiquer linstruction SQL utiliser. Le code suivant illustre lutilisation dun gestionnaire dvnement BeforeUpdateRecord :
procedure TForm1.BDEClientDataSet1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean); begin with UpdateSQL1 do begin DataSet := DeltaDS; DatabaseName := (SourceDS as TDBDataSet).DatabaseName; SessionName := (SourceDS as TDBDataSet).SessionName; Apply(UpdateKind); Applied := True; end; end;
20-53
Attention
Si vous utilisez la proprit UpdateObject de lensemble de donnes pour associer ensemble de donnes et objet mise jour, ExecSQL est appele automatiquement. Dans ce cas, nappelez pas ExecSQL dans un gestionnaire dvnement OnUpdateRecord ou BeforeUpdateRecord pour viter une seconde tentative dapplication de la mise jour de lenregistrement en cours. Les gestionnaires dvnements OnUpdateRecord et BeforeUpdateRecord indiquent le type de mise jour qui doit tre appliqu avec un paramtre UpdateKind de type TUpdateKind. Vous devez passer ce paramtre la mthode ExecSQL pour indiquer linstruction SQL utiliser. Le code suivant illustre ceci avec un gestionnaire dvnement BeforeUpdateRecord :
procedure TForm1.BDEClientDataSet1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean); begin with UpdateSQL1 do begin DatabaseName := (SourceDS as TDBDataSet).DatabaseName; SessionName := (SourceDS as TDBDataSet).SessionName; ExecSQL(UpdateKind); Applied := True; end; end;
Si une exception est dclenche durant lexcution du programme de mise jour, lexcution continue dans lvnement OnUpdateError, sil est dfini.
La proprit Query nest accessible qu lexcution. La proprit Query est indexe sur une valeur TUpdateKind : Avec lindex ukModify, elle accde la requte qui met jour des enregistrements existants. Avec lindex ukInsert, elle accde la requte qui insre de nouveaux enregistrements. Avec lindex ukDelete, elle accde la requte qui supprime des enregistrements.
20-54
Guide du dveloppeur
Utilisation de TBatchMove
Lexemple suivant montre comment utiliser la proprit Query pour fournir des valeurs de paramtres qui ne peuvent tre lies automatiquement :
procedure TForm1.BDEClientDataSet1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied: Boolean); begin UpdateSQL1.DataSet := DeltaDS; { requis pour la substitution de paramtres automatique } with UpdateSQL1.Query[UpdateKind] do begin { veillez que DatabaseName et SessionName sont corrects pour la requte } DatabaseName := (SourceDS as TDBDataSet).DatabaseName; SessionName := (SourceDS as TDBDataSet).SessionName; ParamByName('TimeOfUpdate').Value = Now; end; UpdateSQL1.Apply(UpdateKind); { effectue maintenant les substitutions automatiques } Applied := True; end;
Utilisation de TBatchMove
TBatchMove encapsule les fonctionnalits du moteur de bases de donnes (BDE) qui permettent de dupliquer un ensemble de donnes, dajouter un ensemble de donnes des enregistrements dun autre, de mettre jour des enregistrements dun ensemble de donnes avec ceux dun autre, et de supprimer dans un ensemble de donnes les enregistrements qui correspondent ceux dun autre ensemble de donnes. TBatchMove sert le plus souvent : Charger les donnes dun serveur dans une source de donnes locale afin de les analyser ou deffectuer dautres oprations. Transfrer, dans le cadre dune opration dupsizing, une base de donnes de bureau dans des tables stockes sur un serveur distant. Un composant action groupe peut crer sur la destination des tables correspondant aux tables source, en tablissant une correspondance automatique entre les noms de colonnes et les types de donnes.
1 Placez sur une fiche ou dans un module de donnes un composant table ou requte dun ensemble de donnes depuis lequel vous voulez importer des enregistrements (appel ensemble de donnes Source). 2 Placez sur une fiche ou dans un module de donnes lensemble de donnes dans lequel vous voulez dplacer les enregistrements (appel ensemble de donnes Destination). 3 Placez un composant TBatchMove depuis la page BDE de la palette des composants dans le module de donnes ou sur la fiche, et dfinissez sa proprit Name une valeur unique approprie votre application.
20-55
Utilisation de TBatchMove
4 Affectez la proprit Source du composant action groupe le nom de la table depuis laquelle copier, ajouter ou mettre jour des enregistrements. Vous pouvez slectionner les tables dans les listes droulantes des composants ensemble de donnes disponibles. 5 Affectez la proprit Destination le nom de lensemble de donnes crer, complter ou mettre jour. Vous pouvez slectionner une table de destination dans les listes droulantes des composants ensemble de donnes disponibles.
Si vous ajoutez, mettez jour ou supprimez des enregistrements, Destination doit reprsenter une table de base de donnes existante. Si vous copiez une table et si Destination reprsente une table existante, lexcution de laction groupe crase toutes les donnes en cours de la table de destination. Si vous crez une table entirement nouvelle en copiant une table existante, la table rsultante possde le nom spcifi dans la proprit Name du composant table vers lequel vous copiez les informations. Le type de la table obtenu prsente une structure approprie au serveur spcifi par la proprit DatabaseName.
6 Dfinissez la proprit Mode pour indiquer le type dopration effectuer. Les oprations possibles sont batAppend (valeur par dfaut), batUpdate, batAppendUpdate, batCopy et batDelete. Pour plus dinformations sur ces modes, voir Spcification dun mode daction groupe la page 20-57. 7 Facultativement, dfinissez la proprit Transliterate. Si la valeur de Transliterate est True (valeur par dfaut), les donnes caractre sont transcrites du jeu de caractres de lensemble de donnes Source vers celui de lensemble de donnes Destination, si ncessaire. 8 Facultativement, dfinissez une association entre les colonnes laide de la proprit Mappings. Il nest pas ncessaire de le faire si vous voulez que laction groupe associe chaque colonne en fonction de sa position dans les tables source et destination. Pour plus dinformations sur les correspondances de colonnes, voir Mappage des types de donnes la page 20-58. 9 Facultativement, dfinissez les proprits ChangedTableName, KeyViolTableName et ProblemTableName. Laction groupe stocke les enregistrements posant problme dans la table spcifie par ProblemTableName. Si vous mettez jour une table Paradox par une opration action groupe, les violations de cls seront signales dans la table spcifie par KeyViolTableName. ChangedTableName liste tous les enregistrements modifis dans la table destination lors de laction groupe. Si vous ne spcifiez pas ces proprits, les tables derreurs ne sont ni cres, ni utilises. Pour plus dinformations sur la gestion des erreurs relatives aux actions groupes, voir Gestion des erreurs relatives aux actions groupes la page 20-60.
20-56
Guide du dveloppeur
Utilisation de TBatchMove
batAppendUpdate
batCopy batDelete
Ajout denregistrements
Pour ajouter des donnes, lensemble de donnes destination doit reprsenter une table existante. Durant lopration dajout, le BDE convertit si ncessaire les donnes des tailles et des types de donnes appropris lensemble de donnes destination. Si la conversion nest pas possible, une exception est dclenche et les donnes ne sont pas ajoutes.
20-57
Utilisation de TBatchMove
jour, le BDE convertit si ncessaire les donnes des tailles et des types de donnes appropris lensemble de donnes destination.
TBatchMove ne copie pas les structures de mtadonnes, comme les index, les contraintes et les procdures stockes. Vous devez recrer ces objets mtadonnes sur votre serveur de bases de donnes ou utiliser lexplorateur SQL.
Suppression denregistrements
Pour supprimer des donnes dans lensemble de donnes destination, celui-ci doit reprsenter une table existante et doit avoir un index qui permet dtablir la correspondance entre les enregistrements. Si les champs de lindex primaire sont utiliss pour tablir les correspondances, les enregistrements pour lesquels des champs indexs dans lensemble de donnes destination correspondent des champs indexs dans lensemble de donnes source sont supprims dans la table destination.
Pour mapper une colonne nomme SourceColName de la table source sur une colonne nomme DestColName dans la table destination, la syntaxe est la suivante :
DestColName = SourceColName
20-58
Guide du dveloppeur
Utilisation de TBatchMove
Si les types de donnes des colonnes source et destination ne sont pas les mmes, lopration action groupe tente de les traduire au mieux. Elle tronque les types de donnes caractre, si ncessaire, et essaie deffectuer une conversion limite, si possible. Par exemple, mapper une colonne CHAR(10) sur une colonne CHAR(5) perd les cinq derniers caractres de la colonne source. A titre dexemple de conversion, si une colonne source de type caractre est mappe sur une colonne de type entier, lopration action groupe convertit une valeur caractre 5 la valeur entire 5 correspondante. Les valeurs qui ne peuvent pas tre converties gnrent des erreurs. Pour plus dinformations sur les erreurs, voir Gestion des erreurs relatives aux actions groupes la page 20-60. Lorsque vous dplacez des donnes entre des tables de types diffrents, un composant action groupe traduit les types de donnes conformment aux types de serveurs de lensemble de donnes. Consultez laide en ligne du BDE pour obtenir les dernires tables de mappage entre types de serveurs.
Remarque
Pour excuter une action groupe sur des donnes en direction dune base de donnes sur un serveur SQL, vous devez avoir install ce serveur de bases de donnes et une version de Delphi proposant le pilote SQL Link appropri, ou utiliser ODBC si les pilotes ODBC adquats des tiers sont installs.
Vous pouvez aussi excuter une action group e la conception en effectuant un clic droit sur un composant action groupe et en choisissant Excuter dans le menu contextuel. La proprit MovedCount garde en mmoire le nombre denregistrements dplacs lors de lexcution dune action groupe. La proprit RecordCount spcifie le nombre maximal denregistrements dplacer. Si RecordCount est zro, tous les enregistrements sont dplacs, en commenant par le premier enregistrement de lensemble de donnes source. Si RecordCount est un nombre positif, un maximum de RecordCount enregistrements est dplac, en commenant par lenregistrement en cours de lensemble de donnes source. Si RecordCount est suprieur au nombre denregistrements situ s entre lenregistrement en cours et le dernier enregistrement, lopration se termine lorsque la fin de lensemble de donnes source est atteinte. Vous pouvez examiner MoveCount pour dterminer combien denregistrements ont t effectivement transfrs.
20-59
Dictionnaire de donnes
Si ProblemTableName nest pas spcifie, les donnes de lenregistrement sont tronques et places dans la table destination.
Dictionnaire de donnes
Quand vous utilisez le BDE pour accder aux donnes, votre application doit accder au dictionnaire de donnes. Celui-ci fournit une zone de stockage personnalisable, indpendante de vos applications, o vous pouvez crer des
20-60
Guide du dveloppeur
Dictionnaire de donnes
ensembles dattributs de champs tendus qui dcrivent le contenu et lapparence des donnes. Par exemple, si vous dveloppez frquemment des applications financires, vous pouvez crer des ensembles dattributs de champs spcialiss dcrivant diffrents formats daffichage montaire. Quand vous crez des ensembles de donnes pour votre application la conception, plutt que dutiliser linspecteur dobjets pour dfinir manuellement les champs montaires de chaque ensemble de donnes, vous pouvez associer ces champs un ensemble dattributs de champs tendus dans le dictionnaire de donnes. Lusage de ce dernier assure une apparence homogne des donnes dans et entre les applications que vous crez. En environnement client/serveur, le dictionnaire de donnes peut rsider sur un serveur distant pour un partage supplmentaire des informations. Pour apprendre comment crer des ensembles dattributs de champs tendus dans lditeur de champs la conception et comment les associer aux champs des ensembles de donnes de votre application, voir Cration des ensembles dattributs pour les composants champ la page 19-15. Pour plus dinformations sur la cration dun dictionnaire de donnes et sur les attributs de champs tendus avec les explorateurs SQL et de base de donnes, consultez leurs aides en ligne respectives. Une interface de programmation pour le dictionnaire de donnes est disponible dans lunitdrintf (situ dans le rpertoire lib). Cette interface fournit les mthodes suivantes :
Tableau 20.9 Routine
DictionaryActive DictionaryDeactivate IsNullID FindDatabaseID FindTableID FindFieldID FindAttrID GetAttrName GetAttrNames GetAttrID NewAttr UpdateAttr CreateField
20-61
20-62
Guide du dveloppeur
vous intressent. Le moniteur SQL est trs utile pour dboguer votre application. Lutilitaire dadministration BDE : Il vous permet dajouter de nouveaux pilotes de bases de donnes, de configurer les valeurs par dfaut des pilotes existants et de crer de nouveaux alias BDE. Le module base de donnes : Si vous utilisez des tables Paradox ou dBASE, ce module vous permet dafficher et dditer leurs donnes, de crer de nouvelles tables et de restructurer les tables existantes. Son emploi vous donne plus de contrle que les mthodes dun composant TTable (par exemple, il vous permet de spcifier des contrles de validit et les pilotes de langage). Il fournit le seul mcanisme de restructuration des tables Paradox et dBASE en dehors des appels directs lAPI du BDE.
20-63
20-64
Guide du dveloppeur
21
Chapitre 21
Chapitre
Les composants ADOExpress permettent daccder aux donnes par le biais du modle ADO. ADO (Microsoft ActiveX Data Objects) est un ensemble dobjets COM qui accdent aux donnes par le biais dun fournisseur OLE DB. Les composants ADOExpress Delphi encapsulent ces objets ADO dans larchitecture de base de donnes Delphi. La couche ADO dune application ADO comprend Microsoft ADO 2.1, un fournisseur OLE DB ou un pilote ODBC pour laccs au stockage de donnes, le logiciel client propre au systme de base de donnes utilis (dans le cas des bases de donnes SQL), un systme de base de donnes dorsal accessible lapplication (dans le cas des systmes de bases de donnes SQL) et une base de donnes. Tous ces lments doivent tre accessibles lapplication ADO pour que celle-ci soit totalement oprationnelle. Les objets ADO essentiels sont les objets Connection, Command et Recordset. Ces objets ADO sont encapsuls par les composants TADOConnection, TADOCommand et ensemble de donnes ADO. Le modle ADO comprend dautres objets utilitaires, comme les objets Field ou Properties, mais ils ne sont gnralement pas utiliss directement dans les applications Delphi et ne sont pas encapsuls par des composants ddis. Ce chapitre prsente les composants ADOExpress et les fonctionnalits uniques quils apportent larchitecture de base de donnes Delphi commune. Avant de dcouvrir les fonctionnalits propres aux composants ADOExpress, vous devez connatre les fonctionnalits communes des composants connexion de base de donnes et des ensembles de donnes dcrites dans les chapitres 17, Connexion aux bases de donnes et 18, Prsentation des ensembles de donnes.
21-1
TADODataSet
TADOTable
TADOQuery
TADOStoredProc
TADOCommand
21-2
Guide du dveloppeur
Outre ces fonctionnalits communes tous les composants connexion de base de donnes, TADOConnection offre : Un large ventail doptions permettant doptimiser la connexion. La possibilit dafficher la liste des objets commande utilisant la connexion. Des vnements supplmentaires lors de la ralisation des tches courantes.
21-3
composant connexion via leur proprit Connection. A la conception, slectionnez le composant connexion souhait dans la liste droulante affiche par la proprit Connection dans linspecteur dobjet. A lexcution, affectez la rfrence la proprit Connection. Par exemple, la ligne suivante associe un composant TADODataSet un composant TADOConnection.
ADODataSet1.Connection := ADOConnection1;
Le composant connexion reprsente un objet connexion ADO. Avant dutiliser lobjet connexion pour tablir une connexion, vous devez identifier le stockage de donnes auquel vous souhaitez vous connecter. Gnralement, vous fournissez ces informations par le biais de la proprit ConnectionString. ConnectionString est une chane contenant un ou plusieurs paramtres de connexion nomms spars par des points-virgules. Ces paramtres identifient le stockage de donnes en spcifiant le nom dun fichier qui contient les informations de connection ou le nom dun fournisseur ADO et une rfrence qui dsigne le stockage de donnes. Utilisez les noms de paramtres prdfinis suivants pour fournir ces informations :
Tableau 21.2 Param tre
Provider Data Source File name Remote Provider Remote Server
Il nest pas ncessaire que les paramtres de connexion de ConnectionString incluent le paramtre Provider ou Remote Provider si vous spcifiez un fournisseur ADO laide de la proprit Provider. De mme, vous navez pas besoin de spcifier le paramtre Data Source si vous utilisez la proprit DefaultDatabase. Outre les paramtres ci-dessus, ConnectionString peut comprendre tous les paramtres de connexion propres au fournisseur ADO spcifique que vous utilisez. Ces paramtres de connexion supplmentaires peuvent comprendre lID et le mot de passe utilisateur si vous souhaitez coder en dur les informations de connexion. A la conception, vous pouvez utiliser lditeur de chane de connexion pour construire la chane de connexion en slectionnant dans des listes les lments de connexion (comme le fournisseur ou le serveur). Cliquez sur le bouton points de suspension de la proprit ConnectionString dans linspecteur dobjets pour lancer lditeur de chane de connexion, qui est un diteur de proprit ActiveX fourni par ADO. Aprs avoir spcifi la proprit ConnectionString (et, ventuellement, la proprit Provider), vous pouvez utiliser le composant connexion ADO pour tablir la connexion ou rompre la connexion au stockage de donnes ADO, moins que
21-4
Guide du dveloppeur
vous ne souhaitiez au pralable utiliser les autres proprits pour optimiser la connexion. Lorsque vous tablissez ou rompez la connexion au stockage de donnes, TADOConnection vous permet de rpondre quelques vnements supplmentaires, outre ceux communs tous les composants connexion de base de donnes. Ces vnements supplmentaires sont dcrits dans Evnements se produisant pendant ltablissement dune connexion la page 21-8 et Evnements se produisant pendant la dconnexion la page 21-9.
Remarque
Si vous nactivez pas explicitement la connexion en affectant la valeur True la proprit Connected du composant connexion, la connexion est automatiquement tablie quand le premier composant ensemble de donnes est ouvert ou la premire fois que vous utilisez un composant commande ADO pour excuter une commande.
Connexions asynchrones
Utilisez la proprit ConnectOptions pour que la connexion soit asynchrone. Lutilisation de connexions asynchrones permet votre application de poursuivre son traitement sans attendre leur ouverture dfinitive. Par dfaut, ConnectionOptions a la valeur coConnectUnspecified qui laisse le serveur dcider du meilleur type de connexion. Pour imposer explicitement une connexion asynchrone, initialisez ConnectOptions coAsyncConnect. Les deux exemples de code suivants active et dsactive des connexions asynchrones dans le composant connexion spcifi :
procedure TForm1.AsyncConnectButtonClick(Sender: TObject); begin with ADOConnection1 do begin Close; ConnectOptions := coAsyncConnect; Open;
21-5
end; end; procedure TForm1.ServerChoiceConnectButtonClick(Sender: TObject); begin with ADOConnection1 do begin Close; ConnectOptions := coConnectUnspecified; Open; end; end;
CommandTimeout spcifie la dure, en seconde, scoulant avant le dpassement de dlai pour une commande. Si la commande dmarre par un appel de la mthode Execute nest pas acheve avant lexpiration du dlai spcifi par CommandTimeout, la commande est annule et ADO gnre une exception.
with ADOConnection1 do begin CommandTimeout = 10 {secondes}; Execute(DROP TABLE Employee1997, cmdText, []); end;
Mode de connexion
21-6
Guide du dveloppeur
Tableau 21.3
cmWrite cmReadWrite
Mode de connexion
Les valeurs possibles pour Mode correspondent aux valeurs ConnectModeEnum de la proprit Mode sur lobjet connexion ADO sous-jacent. Consultez laide SDK daccs aux donnes de Microsoft pour plus dinformations sur ces valeurs.
21-7
21-8
Guide du dveloppeur
la chane de connexion, de fournir un nom et un mot de passe utilisateur si vous grez votre propre support de connexion (login), dimposer une connexion asynchrone ou mme dannuler la connexion avant son ouverture. OnConnectComplete se produit aprs louverture de la connexion. Etant donn que TADOConnection peut reprsenter des connexions asynchrones, vous devez utiliser OnConnectComplete, qui se produit aprs louverture de la connexion ou son chec en raison dune condition derreur, au lieu de lvnement AfterConnect, qui se produit lorsque le composant connexion indique au fournisseur ADO douvrir une connexion mais pas ncessairement aprs louverture de la connexion.
Autres vnements
Les composants connexion ADO introduisent deux vnements supplmentaires qui permettent de rpondre aux notifications provenant de lobjet connexion ADO sous-jacent : Lvnement OnExecuteComplete se produit aprs que le composant connexion excute une commande sur le stockage de donnes (par exemple, aprs lappel de la mthode Execute). OnExecuteComplete indique si lexcution a russi. Lvnement OnInfoMessage se produit lorsque lobjet connexion sous-jacent fournit des informations dtailles aprs lexcution dune opration. Le gestionnaire dvnement OnInfoMessage reoit linterface dun objet Error ADO qui contient les informations dtailles et un code dtat indiquant si lopration a russi.
21-9
Lorsque vous utilisez ADO pour accder aux informations de bases de donnes, vous navez pas besoin de recourir un ensemble de donnes tel que TADOQuery pour reprsenter les commandes SQL qui ne renvoient pas de curseur. Par contre, vous pouvez utiliser TADOCommand, simple composant qui nest pas un ensemble de donnes. Pour plus dinformations sur TADOCommand, voir Utilisation dobjets commande la page 21-19.
21-10
Guide du dveloppeur
Cette manire de procder prsente, entre autres, les avantages suivants : Les ensembles de donnes partagent les attributs de lobjet connexion. Il ny a quune seule connexion configurer : celle de lobjet TADOConnection. Les ensembles de donnes peuvent participer des transactions. Pour plus dinformations sur lutilisation de TADOConnection, voir Connexion des stockages de donnes ADO la page 21-3. Lorsque vous connectez des ensembles de donnes individuellement, dfinissez la proprit ConnectionString de chaque ensemble de donnes. Chaque ensemble de donnes qui utilise ConnectionString tablit sa propre connexion avec le stockage de donnes, de manire indpendante des autres connexions densembles de donnes de lapplication. La proprit ConnectionString des ensembles de donnes ADO fonctionne de la mme faon que la proprit ConnectionString de TADOConnection ; il sagit dun ensemble de paramtres de connexion spars par des points-virgules, tels que celui-ci :
ADODataSet1.ConnectionString := Provider=VotreFournisseur;Password=MotDePasse; + User ID=JaneDoe;SERVER=PURGATORY;UID=JaneDoe;PWD=MotDePasse; + Initial Catalog=Employee;
A la conception, vous pouvez utiliser lditeur de chane de connexion pour concevoir la chane de connexion. Pour plus dinformations sur les chanes de connexion, voir Connexion un stockage de donnes avec TADOConnection la page 21-3.
21-11
La proprit RecordsetState indique ltat en cours de lobjet ensemble denregistrements sous-jacent. RecordsetState correspond la proprit State de lobjet ensemble denregistrements ADO. RecordsetState a pour valeur stOpen, stExecuting ou stFetching. (TObjectState, qui est le type de la proprit RecordsetState, dfinit dautres valeurs, mais seuls stOpen, stExecuting et stFetching appartiennent aux ensembles denregistrements). La valeur stOpen indique que lensemble denregistrements est actuellement inactif. La valeur stExecuting indique quil est en train dexcuter une commande. La valeur stFetching indique quil est en train de lire des lignes dans les tables associes. Utilisez les valeurs RecordsetState quand vous effectuez des actions qui dpendent de ltat en cours de lensemble de donnes. Ainsi, une routine qui actualise les donnes peut tester la valeur de la proprit RecordsetState pour vrifier si lensemble de donnes est actif et nest pas en train de traiter dautres oprations ou de lire des donnes.
1 Utilisez la mthode Bookmark pour marquer les enregistrements inclure dans lensemble de donnes filtr. 2 Appelez la mthode FilterOnBookmarks pour filtrer lensemble de donnes afin que seuls les enregistrements marqus dun signet apparaissent.
Ce processus est illustr ci-dessous :
procedure TForm1.Button1Click(Sender: TObject); var BM1, BM2: TBookmarkStr; begin with ADODataSet1 do begin BM1 := Bookmark; BMList.Add(Pointer(BM1)); MoveBy(3); BM2 := Bookmark; BMList.Add(Pointer(BM2)); FilterOnBookmarks([BM1, BM2]); end; end;
Notez que lexemple ci-dessus ajoute les signets un objet liste nomm BMList. Cela permettra lapplication de librer les signets lorsquils ne seront plus ncessaires.
21-12
Guide du dveloppeur
Pour plus dinformations sur lutilisation des signets, voir Marquage denregistrements la page 18-11. Pour des dtails sur les autres types de filtres, voir Affichage et dition densembles de donnes en utilisant des filtres la page 18-14.
eoAsyncFetchNonBlocking eoExecuteNoRecords
21-13
en mmoire cache laide dun ensemble de donnes client et leur placement laide des fonctionnalits de mises jour groupes :
Tableau 21.5 Ensemble de donnes ADO
LockType
Comparaison des mises jour en mmoire cache dun ensemble de donnes client et ADO
TClientDataSet
Inutilis : les ensembles de donnes client placent toujours les mises jour en mmoire cache. Inutilis : les ensembles de donnes client manipulent toujours une photographie mmorise des donnes. UpdateStatus
Description
Spcifie si lensemble de donnes est ouvert en mode mise jour groupe.
CursorType
Spcifie le degr disolement de lensemble de donnes ADO par rapport aux modifications prsentes sur le serveur. Indique la mise jour qui a ventuellement affect la ligne en cours. RecordStatus fournit davantage dinformations que UpdateStatus. Spcifie les types denregistrements disponibles. FilterGroup fournit davantage dinformations. Applique les mises jour en mmoire cache au serveur de base de donnes. A la diffrence de ApplyUpdates, UpdateBatch permet de limiter les types de mises jour appliquer. Ne prend pas en compte les mises jour en attente et rtablit les valeurs initiales. A la diffrence de CancelUpdates, CancelBatch permet de limiter les types de mises jour annuler.
RecordStatus
FilterGroup UpdateBatch
StatusFilter ApplyUpdates
CancelBatch
CancelUpdates
Lutilisation des caractristiques de mises jour groupes des composants ensemble de donnes ADO fait intervenir : Ouverture de lensemble de donnes en mode mises jour groupes Examen du statut de mise jour ligne par ligne Filtrage de lignes en fonction du statut de mise jour Application des mises jour groupes dans les tables des bases Annulation des mises jour groupes
1 La proprit CursorType du composant doit avoir la valeur ctKeySet (valeur par dfaut de la proprit) ou ctStatic. 2 La proprit LockType doit avoir la valeur ltBatchOptimistic. 3 La commande doit tre une requte SELECT.
Avant dactiver le composant ensemble de donnes, initialisez les proprits CursorType et LockType comme indiqu ci-dessus. Affectez une instruction SELECT la proprit CommandText du composant (pour TADODataSet) ou la proprit SQL (pour TADOQuery). Pour les composants TADOStoredProc, affectez
21-14
Guide du dveloppeur
la proprit ProcedureName le nom dune procdure stocke qui renvoie un ensemble de rsultats. Ces proprits peuvent tre dfinies la conception en utilisant linspecteur dobjet ou par code lexcution. Lexemple suivant illustre la prparation dun composant TADODataSet en mode mises jour groupes.
with ADODataSet1 do begin CursorLocation := clUseClient; CursorType := ctStatic; LockType := ltBatchOptimistic; CommandType := cmdText; CommandText := SELECT * FROM Employee; Open; end;
Une fois lensemble de donnes ouvert en mode mises jour groupes, toutes les modifications des donnes sont places dans le cache au lieu dtre appliques directement aux tables de la base.
Pour que la proprit FilterGroup prenne effet, la proprit Filtered du composant ensemble de donnes ADO doit avoir la valeur True.
Application des mises jour groupes dans les tables des bases
Pour appliquer les mises jour en attente qui nont pas dj t appliqu es ou annules, appelez la mthode UpdateBatch. Pour les lignes dont le contenu a chang et qui sont appliques, les modifications sont places dans les tables de base sur lesquelles lensemble denregistrement est bas. Une ligne du cache
21-15
marqu pour la suppression entrane la suppression de la ligne correspondante de la table de la base. Une insertion denregistrement (lenregistrement existe dans le cache mais pas dans la table de la base) est ajoute la table de la base. Pour les lignes modifies, les colonnes des lignes correspondantes des tables de la base sont modifies pour adopter les nouvelles valeurs de colonnes prsentes dans le cache. Utilise sans paramtre, la mthode UpdateBatch applique toutes les mises jour en attente. Il est possible de transmettre une valeur de type TAffectRecords comme paramtre de UpdateBatch. Si une valeur autre que arAll est transmise, seul un sous-ensemble des modifications en attente est appliqu. Le paramtre arAll a le mme effet que labsence de paramtre et provoque lapplication de toutes les mises jour en attente. Lexemple suivant napplique que la ligne en cours :
ADODataSet1.UpdateBatch(arCurrent);
21-16
Guide du dveloppeur
Rcuprez les donnes enregistres en utilisant la mthode LoadFromFile. LoadFromFile accepte un paramtre : le nom du fichier charger. Si le fichier spcifi nexiste pas, LoadFromFile dclenche une exception EOleException. Lors de lappel de la mthode LoadFromFile, le composant ensemble de donnes est automatiquement activ. Dans lexemple suivant, la premire procdure enregistre dans un fichier lensemble de donnes obtenu par le composant TADODataSet ADODataSet1. Le fichier destination est un fichier ADTG nomm SaveFile qui est cr sur un disque local. La seconde procdure charge ce fichier dans le composant TADODataSet ADODataSet2.
procedure TForm1.SaveBtnClick(Sender: TObject); begin if (FileExists(c:\SaveFile)) then begin DeleteFile(c:\SaveFile); StatusBar1.Panels[0].Text := Fichier sauvegarde supprim!; end; ADODataSet1.SaveToFile(c:\SaveFile, pfADTG); end; procedure TForm1.LoadBtnClick(Sender: TObject); begin if (FileExists(c:\SaveFile)) then ADODataSet2.LoadFromFile(c:\SaveFile) else StatusBar1.Panels[0].Text := Fichier sauvegarde inexistant!; end;
Il nest pas ncessaire que les ensembles de donnes qui effectuent la sauvegarde et la lecture des donnes figurent sur la mme fiche comme dans lexemple prcdent, ni dans la mme application ou sur la mme machine. Cela permet des transferts de donnes de style porte-documents dun ordinateur un autre.
Utilisation de TADODataSet
TADODataSet est un ensemble de donnes polyvalent qui permet de manipuler les donnes dun stockage de donnes ADO. A la diffrence des autres composants ensemble de donnes ADO, TADODataSet nest pas un ensemble de donnes de type table, de type requ te ou de type procdure stocke. Par contre, il peut fonctionner comme lun des types suivants : Comme un ensemble de donnes de type table, TADODataSet permet de reprsenter toutes les lignes et colonnes dune seule table de base de donnes. Pour lutiliser cet effet, attribuez la proprit CommandType la valeur cmdTable et la proprit CommandText le nom de la table. TADODataSet gre les tches de type table suivantes : Affectation dindex pour trier des enregistrements ou constituer la base de recherches partir denregistrements. Outre les proprits et mthodes dindex standard dcrites dans Tri des enregistrements avec des index la page 18-30, vous pouvez utiliser la proprit Sort de TADODataSet pour
21-17
effectuer des tris partir dindex temporaires. Les recherches bases sur les index effectues laide de la mthode Seek utilisent lindex en cours. vidage de lensemble de donnes. La mthode DeleteRecords offre davantage de contrle que les mthodes connexes des autres ensembles de donnes de type table car elle permet de spcifier les enregistrements supprimer. Les tches de type table gres par TADODataSet sont disponibles mme si CommandType na pas pour valeur cmdTable. Comme un ensemble de donnes de type requte, TADODataSet permet de spcifier une commande SQL unique excuter louverture de lensemble de donnes. Pour lutiliser cet effet, attribuez la proprit CommandType la valeur cmdText et la proprit CommandText la commande SQL excuter. A la conception, vous pouvez double-cliquer sur la proprit CommandText dans linspecteur dobjets pour utiliser lditeur de texte de commande afin dlaborer la commande SQL. TADODataSet gre les tches de type requte suivantes : Utilisation de paramtres dans le texte des requtes. Voir Utilisation de paramtres dans les requ tes la page 18-52, pour plus dinformations sur les paramtres de requte. Dfinition de relations matre/dtail laide de paramtres. Voir Etablissement de relations matre/dtail en utilisant des paramtres la page 18-55, pour plus dinformations sur ce sujet. Prparation de la requte afin damliorer les performances en attribuant la proprit Prepared la valeur True. Comme un ensemble de donnes de type procdure stocke, TADODataSet permet de spcifier une procdure stocke excuter louverture de lensemble de donnes. Pour lutiliser cet effet, attribuez la proprit CommandType la valeur cmdStoredProc et la proprit CommandText le nom de la procdure stocke. TADODataSet gre les tches de type procdure stocke suivantes : Utilisation de paramtres de procdure stocke. Voir Utilisation de paramtres avec les procdures stockes la page 18-59, pour plus dinformations sur les paramtres de procdure stocke. Lecture de plusieurs ensembles de rsultats. Voir Lecture de plusieurs ensembles de rsultats la page 18-64, pour plus dinformations sur ce sujet. Prparation de la procdure stocke afin damliorer les performances en attribuant la proprit Prepared la valeur True. En outre, TADODataSet vous permet dutiliser les donnes stockes dans un fichier en attribuant la proprit CommandType la valeur cmdFile et la proprit CommandText le nom du fichier. Avant de dfinir les proprits CommandText et CommandType, vous devez lier TADODataSet un stockage de donnes en dfinissant la proprit Connection ou ConnectionString. Ce processus est dcrit dans Connexion dun ensemble de
21-18
Guide du dveloppeur
donnes ADO un stockage de donnes la page 21-11. Vous pouvez aussi utiliser un objet DataSpace RDS pour connecter TADODataSet un serveur dapplications ADO. Pour ce faire, attribuez la proprit RDSConnection un objet TRDSConnection.
Spcification de la commande
Spcifiez les commands dun composant TADOCommand laide de la proprit CommandText. Comme TADODataSet, TADOCommand vous permet de spcifier la commande de diffrentes manires, en fonction de la proprit CommandType. CommandType peut prendre les valeurs suivantes : cmdText (si la commande est une instruction SQL), cmdTable (si cest un nom de table) et cmdStoredProc (si la commande spcifie le nom dune procdure stocke). A la conception, slectionnez la valeur approprie dans la liste propose par linspecteur dobjet. A lexcution, affectez une valeur de type TCommandType la proprit CommandType.
with ADOCommand1 do begin
21-19
Si le type spcifique nest pas indiqu, cest le serveur qui le dtermine en se basant sur la commande spcifie par CommandText. CommandText peut contenir le texte dune requte SQL qui comprend des paramtres ou le nom dune procdure stocke qui utilise des paramtres. Vous devez alors fournir les valeurs des paramtres, qui sont lies ceux-ci avant lexcution de la commande. Voir Gestion des paramtres de commande la page 21-21, pour plus de dtails.
Les autres versions de Execute vous permettent de fournir des valeurs de paramtres laide dun tableau Variant et dobtenir le nombre denregistrements affects par la commande. Pour plus dinformations sur lexcution de commandes renvoyant un ensemble de rsultats, voir Rcupration densembles de rsultats laide de commandes la page 21-21.
21-20
Guide du dveloppeur
La mthode Cancel na deffet que si une commande en attente a t excute de manire asynchrone (eoAsynchExecute dans le paramtre ExecuteOptions de la mthode Execute). Une commande est dite en attente si la mthode Execute a t appele mais nest pas encore acheve ou na pas dpass le dlai limite. Une commande dpasse le dlai limite si elle nest pas termine ou annule dans lintervalle, en secondes, imparti par la proprit CommandTimeout. Par dfaut, les commandes disposent dun dlai de 30 secondes.
Ds que lensemble de rsultats est affect la proprit Recordset dun ensemble de donnes ADO, lensemble de donnes est automatiquement activ et les donnes sont accessibles.
21-21
La proprit CommandText peut spcifier une procdure stocke qui utilise des paramtres. Les paramtres de procdure stocke sutilisent avec TADOCommand de la mme faon quavec un ensemble de donnes ADO. Voir Utilisation de paramtres avec les procdures stockes la page 18-59, pour plus dinformations sur les paramtres de procdures stockes. Lorsque vous utilisez TADOCommand, vous pouvez indiquer les valeurs de paramtres de deux faons : en les fournissant au moment dappeler la mthode Execute ou, lavance, en les dfinissant par le biais de la proprit Parameters. La mthode Execute est redfinie dans des versions qui acceptent un ensemble de valeurs de paramtres sous la forme dun tableau Variant. Cela permet de fournir des valeurs de paramtres rapidement sans dfinir la proprit Parameters :
ADOCommand1.Execute(VarArrayOf([Edit1.Text, Date]));
Lorsque vous utilisez des procdures stockes qui renvoient des paramtres de sortie, vous devez recourir la proprit Parameters. Mme si vous navez pas besoin de lire les paramtres de sortie, la proprit Parameters peut savrer utile car elle vous permet de fournir les paramtres la conception et dutiliser les proprits de TADOCommand de la mme faon que les paramtres des ensembles de donnes. Lorsque vous dfinissez la proprit CommandText, la proprit Parameters est automatiquement mise jour pour reflter les paramtres de la requte ou ceux utiliss par la procdure stocke. A la conception, vous pouvez utilise lditeur de paramtres pour accder aux paramtres en cliquant sur le bouton points de suspension de la proprit Parameters dans linspecteur dobjets. A lexcution, utilisez les proprits et mthodes de TParameter pour spcifier ou connatre la valeur de chaque paramtre.
with ADOCommand1 do begin CommandText := INSERT INTO Talley + (Counter) + VALUES (:NewValueParam); CommandType := cmdText; Parameters.ParamByName(NewValueParam).Value := 57; Execute end;
21-22
Guide du dveloppeur
22
Chapitre 22
Chapitre
dbExpress est un ensemble de pilotes de bases de donnes lgers qui permettent daccder rapidement aux serveurs de bases de donnes SQL. Pour chaque base de donnes prise en charge, dbExpress fournit un pilote qui adapte les logiciels serveur un ensemble uniforme dinterfaces dbExpress. Lorsque vous dployez une application de base de donnes qui utilise dbExpress, il suffit dinclure une bibliothque de liaison dynamique (le pilote propre au serveur) avec les fichiers dapplication que vous crez. dbExpress vous permet daccder aux bases de donnes laide densembles de donnes unidirectionnels. Ceux-ci ont t conus pour un accs lger et rapide aux informations de la base, avec des temps systme rduits. Comme les autres ensembles de donnes, ils peuvent envoyer une commande SQL au serveur de la base de donnes et, si la commande retourne un ensemble denregistrements, obtenir un curseur pour accder ces enregistrements. Toutefois, les ensembles de donnes unidirectionnels peuvent uniquement rcuprer un curseur unidirectionnel. Ils ne placent pas les donnes dans un tampon de mmoire, ce qui les rend plus rapides et moins consommateurs de mmoire que les autres types densembles de donnes. Mais, parce quils ne mettent pas les enregistrements dans un tampon, les ensembles de donnes unidirectionnels sont moins flexibles que les autres ensembles de donnes. De nombreuses capacits de TDataSet ne sont pas implmentes ou provoquent des exceptions dans les ensembles de donnes unidirectionnels. Par exemple : Les seules mthodes de navigation supportes sont First and Next. La plupart des autres dclenchent des exceptions. Certaines, comme celles qui participent au support des signets, ne font rien du tout. Il ny a pas de support ddition intgr, car cela ncessiterait un tampon pour les modifications. La proprit CanModify est toujours False, et donc les tentatives ddition de lensemble de donnes chouent toujours. Vous pouvez cependant utiliser les ensembles de donnes unidirectionnels pour mettre
22-1
jour les donnes en faisant appel une commande SQL UPDATE, ou leur confrer la prise en charge conventionnelle de ldition en recourant un ensemble de donnes client dbExpress ou en connectant lensemble de donnes un ensemble de donnes client (voir Connexion un autre ensemble de donnes la page 14-12). Il ny a pas de support des filtres, car ceux-ci doivent fonctionner avec plusieurs enregistrements, ce qui ncessite la mise en tampon. Si vous essayez de filtrer un ensemble de donnes unidirectionnel, une exception est dclenche. Pour imposer des limites aux donnes afficher, il vous faut utiliser la commande SQL qui dfinit les donnes pour lensemble de donnes. Il ny a pas de support des champs de rfrence, qui ncessitent un tampon pour les enregistrements multiples contenant des valeurs de rfrence. Si vous dfinissez un champ de rfrence sur un ensemble de donnes unidirectionnel, il ne fonctionnera pas correctement. Malgr ces limites, les ensembles de donnes unidirectionnels offrent un moyen puissant daccder aux donnes. Ils reprsentent le mcanisme daccs aux donnes le plus rapide et sont trs simples utiliser et dployer.
La page dbExpress comprend galement TSQLClientDataSet, qui nest pas un ensemble de donnes unidirectionnel. Il sagit dun ensemble de donnes client
22-2
Guide du dveloppeur
qui utilise un ensemble de donnes unidirectionnel de manire interne pour accder ses donnes.
Gnralement, tous les ensembles de donnes unidirectionnels dune application partagent le mme composant connexion, sauf si vous travaillez avec des donnes issues de plusieurs serveurs de bases de donnes. Toutefois, vous pouvez utiliser une connexion diffrente pour chaque ensemble de donnes si le serveur ne prend pas en charge plusieurs instructions par connexion. Vrifiez si le serveur de base de donnes ncessite une connexion diffrente pour chaque ensemble de donnes en lisant la proprit MaxStmtsPerConn. Par dfaut, TSQLConnection gnre les connexions selon les besoins lorsque le serveur limite le nombre dinstructions pouvant tre excutes via une connexion. Si vous souhaitez assurer un suivi plus approfondi des connexions utilises, attribuez la proprit AutoClone la valeur False. Avant de dfinir la proprit SQLConnection, vous devez configurer le composant TSQLConnection afin quil identifie le serveur de bases de donnes et tous les paramtres de connexion requis (notamment la base de donnes utiliser sur le serveur, le nom de la machine hte excutant le serveur, le nom dutilisateur, le mot de passe, etc.).
Configuration de TSQLConnection
Afin de dcrire une connexion de base de donnes de faon suffisamment dtaille pour que TSQLConnection puisse louvrir, vous devez identifier le pilote utiliser et un ensemble de paramtres de connexion transmis au pilote.
22-3
Identification du pilote
Le pilote est identifi par la proprit DriverName, qui correspond au nom dun pilote dbExpress install, tel que INTERBASE, ORACLE, MYSQL ou DB2. Le nom de pilote est associ deux fichiers : Le pilote dbExpress. Celui-ci peut tre une bibliothque de liaison dynamique portant un nom tel que dbexpint.dll, dbexpora.dll, dbexpmys.dll ou dbexpdb2.dll, ou une unit compile que vous pouvez lier de faon statique votre application (dbexptint.dcu, dbexpora.dcu, dbexpmys.dcu ou dbexpdb2.dcu). La bibliothque de liaison dynamique fournie par lditeur de bases de donnes pour la gestion de la partie client. La relation entre ces deux fichiers et le nom de la base de donnes est stocke dans un fichier appel dbxdrivers.ini, qui est mis jour lorsque vous installez un pilote dbExpress. Gnralement, vous navez pas vous soucier de ces fichiers car le composant connexion SQL les recherche dans dbxdrivers.ini lorsquil reoit la valeur de DriverName. Lorsque vous dfinissez la proprit DriverName, TSQLConnection attribue automatiquement aux proprits LibraryName et VendorLib les noms des bibliothques de liaison dynamique associes. Une fois LibraryName et VendorLib dfinies, votre application nest plus dpendante de dbxdrivers.ini (en dautres termes, vous navez pas besoin de dployer le fichier dbxdrivers.ini avec votre application sauf si vous dfinissez la proprit DriverName lexcution.)
22-4
Guide du dveloppeur
22-5
pilote slectionn et un tableau prsentant les paramtres de connexion associs au nom de connexion slectionn. Cette bote de dialogue vous permet dindiquer la connexion utiliser en slectionnant un pilote et un nom de connexion. Aprs avoir dtermin la configuration souhaite, cliquez sur le bouton Tester la connexion afin de vrifier que vous avez choisi une configuration valide. En outre, cette bote de dialogue vous permet de modifier les connexions nommes dans dbxconnections.ini : Modifiez les valeurs de paramtres dans le tableau des paramtres afin de modifier la connexion nomme slectionne. Lorsque vous quittez la bote de dialogue en cliquant sur OK, les nouvelles valeurs de paramtres sont enregistres dans le fichier dbxconnections.ini. Cliquez sur le bouton Ajouter une connexion afin de dfinir une nouvelle connexion nomme. Une bote de dialogue apparat dans laquelle vous pouvez spcifier le pilote utiliser et le nom de la nouvelle connexion. Une fois la connexion nomme, modifiez les paramtres afin de spcifier la connexion souhaite puis cliquez sur OK pour enregistrer la nouvelle connexion dans dbxconnections.ini. Cliquez sur le bouton Supprimer la connexion pour supprimer la connexion nomme slectionne de dbxconnections.ini. Cliquez sur le bouton Renommer la connexion pour modifier le nom de la connexion nomme slectionne. Toutes les modifications que vous avez apportes aux paramtres sont enregistres sous le nouveau nom lorsque vous cliquez sur OK.
22-6
Guide du dveloppeur
Remarque
Vous pouvez aussi remplir lensemble de donnes unidirectionnel par des mtadonnes qui vous renseignent sur ce qui est disponible sur le serveur. Pour connatre la faon de le faire, voir Rcupration de mtadonnes dans un ensemble de donnes unidirectionnel la page 22-14.
Si les performances du serveur entrent en compte, vous prfrerez composer explicitement la requte et non vous reposer sur la gnration automatique. Les requtes gnres automatiquement utilisent des caractres gnriques au lieu dnumrer explicitement tous les champs de la table. Cela peut entraner une lgre baisse de performance sur le serveur. Le caractre gnrique (*) des requtes gnres automatiquement est plus robuste lors des modifications de champs sur le serveur.
22-7
Quand CommandType vaut ctTable, TSQLDataSet gnre une requte en se basant sur les valeurs de deux proprits : CommandText spcifie le nom de la table de base de donnes que doit reprsenter lobjet TSQLDataSet. SortFieldNames numre les noms des champs utiliser pour trier les donnes, dans lordre de leur prpondrance. Par exemple, si vous spcifiez ceci :
SQLDataSet1.CommandType := ctTable; SQLDataSet1.CommandText := Employee; SQLDataSet1.SortFieldNames := HireDate,Salary
TSQLDataSet gnre la requte suivante, qui prsente tous les enregistrements de la table Employee, tris par date dembauche (HireDate) et, pour une mme date dembauche, par salaire (Salary) :
select * from Employee order by HireDate, Salary
Lorsque vous utilisez TSQLStoredProc, il vous suffit de spcifier le nom de la procdure stocke comme valeur de la proprit StoredProcName.
SQLStoredProc1.StoredProcName := MyStoredProcName;
22-8
Guide du dveloppeur
Une fois que vous avez identifi une procdure stocke, il se peut que votre application ait besoin de fournir les valeurs des paramtres dentre de la procdure stocke ou dextraire les valeurs des paramtres de sortie la fin de lexcution de la procdure stocke. Voir Utilisation de paramtres avec les procdures stockes la page 18-59, pour plus dinformations sur lutilisation des paramtres de procdure stocke.
Vous pouvez utiliser la proprit Active ou la mthode Open avec nimporte quel ensemble de donnes unidirectionnel obtenant ses enregistrements du serveur. Que ces enregistrements proviennent dune requte SELECT (y compris dune requte gnre automatiquement lorsque CommandType vaut ctTable) ou dune procdure stocke na pas dimportance.
22-9
fois. Pour prparer un ensemble de donnes de manire explicite, dfinissez sa proprit Prepared par True.
CustQuery.Prepared := True;
Lorsque vous prparez lensemble de donnes de manire explicite, les ressources alloues lexcution de linstruction ne sont pas libres tant que vous ne dfinissiez pas Prepared par False. Dfinissez la proprit Prepared par False si vous voulez que lensemble de donnes soit re-prpar avant son excution (par exemple, si vous modifiez la valeur dun paramtre ou la proprit SortFieldNames).
NextRecordSet renvoie un composant TSQLDataSet nouvellement cr qui donne accs au prochain ensemble denregistrements. La premire fois que vous appelez NextRecordSet, elle renvoie un ensemble de donnes pour le second ensemble denregistrements. Appeler NextRecordSet renvoie un troisime ensemble de donnes, et ainsi de suite jusqu ce quil ny ait plus densemble denregistrements. Lorsque quil ny a pas densemble de donnes supplmentaire, NextRecordSet renvoie nil.
22-10
Guide du dveloppeur
Remarque
Si la commande ne renvoie pas denregistrement, vous navez pas besoin dutiliser un ensemble de donnes unidirectionnel, car vous navez pas besoin des mthodes de lensemble de donnes donnant accs lensemble denregistrements. Le composant de connexion SQL, qui se connecte au serveur de base de donnes, peut tre utilis directement pour excuter les commandes sur le serveur. Voir Envoi de commandes au serveur la page 17-11, pour plus de dtails.
Excution de la commande
Pour excuter une requte ou une procdure stocke ne renvoyant pas denregistrement, nutilisez pas la proprit Active ni la mthode Open. En revanche, utilisez : La mthode ExecSQL si lensemble de donnes est une instance de TSQLDataSet or TSQLQuery.
FixTicket.CommandText := DELETE FROM TrafficViolations WHERE (TicketID = 1099); FixTicket.ExecSQL;
22-11
Conseil
Si vous excutez la requte ou la procdure stocke plusieurs fois, il convient de dfinir la proprit Prepared par True.
22-12
Guide du dveloppeur
Le code suivant utilise un TSQLDataSet pour crer cette procdure stocke. Remarquez lutilisation de la proprit ParamCheck pour empcher lensemble de donnes de confondre les paramtres de la dfinition de la procdure stocke (:EMP_NO et :PROJ_ID) avec un paramtre de la requte crant la procdure stocke.
with SQLDataSet1 do begin ParamCheck := False; CommandType := ctQuery; CommandText := CREATE PROCEDURE GET_EMP_PROJ (EMP_NO SMALLINT) + RETURNS (PROJ_ID CHAR(5)) AS + BEGIN + FOR SELECT PROJ_ID FROM EMPLOYEE_PROJECT + WHERE EMP_NO = :EMP_NO + INTO :PROJ_ID + DO SUSPEND; + END; ExecSQL; end;
22-13
22-14
Guide du dveloppeur
(%% ou __). Si vous ne voulez pas utiliser de modle, ce paramtre peut tre nil.
Remarque
Si vous lisez des informations de schma concernant les tables (stTables), les informations de schma rsultantes peuvent dcrire les tables ordinaires, les tables systme, les vues et/ou les synonymes, selon la valeur de la proprit TableScope de la connexion SQL. Lappel suivant demande une table listant toutes les tables systme (les tables du serveur qui contiennent des mtadonnes) :
SQLDataSet1.SetSchemaInfo(stSysTable, , );
Lorsque vous ouvrez lensemble de donnes aprs cet appel de SetSchemaInfo, il possde un enregistrement pour chaque table, dont les colonnes fournissent le nom de table, le type, le nom de schma, etc. Si le serveur nutilise pas de tables systme pour stocker les mtadonnes (par exemple MySQL), lensemble de donnes ne contient aucun enregistrement lorsque vous louvrez. Lexemple prcdent nutilisait que le premier paramtre. Supposons que vous vouliez obtenir la liste des paramtres utiliss en entre de la procdure stocke nomme MyProc. Supposons galement que la personne ayant crit cette procdure se soit servie dun prfixe dans le nom de tous les paramtres pour indiquer sil sagit dun paramtre en entre ou en sortie (inName, outValue, etc.). Vous pourriez appeler SetSchemaInfo comme suit :
SQLDataSet1.SetSchemaInfo(stProcedureParams, MyProc, in%);
Lensemble de donnes rsultant est une table de paramtres dentre dont les colonnes dcrivent les proprits de chaque paramtre.
Lecture des donnes aprs lutilisation de lensemble de donnes pour des mtadonnes
Aprs un appel SetSchemaInfo, il y a deux faons de revenir lexcution des requtes ou des procdures stockes avec lensemble de donnes : Changez la proprit CommandText, en spcifiant la requte, la table ou la procdure stocke partir de laquelle vous voulez lire des donnes. Appelez SetSchemaInfo, en dfinissant le premier paramtre par stNoSchema. Dans ce cas, lensemble de donnes se remet lire les donnes spcifies par la valeur en cours de CommandText.
22-15
Nom de colonne
RECNO CATALOG_NAME
Contenu
Un num ro denregistrement identifiant chaque enregistrement de manire unique. Le nom du catalogue (la base de donnes) contenant la table. Cest le m me que le param tre Database pour un composant de connexion SQL. Le nom du schma identifiant le propritaire de la table. Le nom de la table. Ce champ dtermine lordre de tri de lensemble de donnes. Identifie le type de table. Cest la somme dun nombre quelconque des valeurs suivantes : 1 : table 2 : vue 4 : table systme 8 : synonyme 16 : table temporaire 32 : table locale.
Nom de colonne
RECNO CATALOG_NAME
Contenu
Un num ro denregistrement identifiant chaque enregistrement de manire unique. Le nom du catalogue (la base de donnes) contenant la procdure stocke. C est le mme que le param tre Database pour un composant de connexion SQL. Le nom du schma identifiant le propritaire de la procdure stocke. Le nom de la procdure stocke. Ce champ dtermine lordre de tri de lensemble de donnes. Identifie le type de procdure stocke. Cest la somme dun nombre quelconque des valeurs suivantes : 1 : procdure 2 : fonction 4 : paquetage 8 : procdure systme
22-16
Guide du dveloppeur
Tableau 22.2
Colonnes des tables de mtadonnes concernant les procdures stockes Type de champ
ftSmallint ftSmallint
Nom de colonne
IN_PARAMS OUT_PARAMS
Contenu
Le nombre de paramtres dentre. Le nombre de paramtres de sortie.
Nom de colonne
RECNO CATALOG_NAME
Contenu
Un num ro denregistrement identifiant chaque enregistrement de manire unique. Le nom du catalogue (la base de donnes) contenant la table dont vous voulez connatre les champs. Cest le mme que le paramtre Database pour un composant de connexion SQL. Le nom du schma identifiant le propritaire du champ. Le nom de la table contenant les champs. Le nom du champ. Cette valeur dtermine lordre de tri de lensemble de donnes. La position de la colonne dans sa table. Identifie le type de valeur contenue dans le champ. Cest la somme dun nombre quelconque des valeurs suivantes : 1 : identificateur de ligne 2 : version de ligne 4 : champ incrmentation automatique 8 : Champ possdant une valeur par dfaut Le type de donnes de la colonne. Cest une des constantes de types de champs logiques dfinies dans sqllinks.pas. Une chane dcrivant le type de donnes. Cest la mme que celle contenue dans COLUMN_DATATYPE et COLUMN_SUBTYPE, mais sous une forme utilise par certaines instructions DDL. Un sous-type du type de donnes de la colonne. Cest une des constantes de sous-types logiques dfinies dans sqllinks.pas. La taille du type de champ (nombre de caractres dans une chane, octets dans un champ doctets, chiffres significatifs dans une valeur BCD, membres dun champ ADT, etc.).
COLUMN_DATATYPE
ftSmallint
COLUMN_TYPENAME
ftString
COLUMN_SUBTYPE
ftSmallint
COLUMN_PRECISION
ftInteger
22-17
Tableau 22.3
Colonnes des tables de mtadonnes concernant les champs (suite) Type de champ
ftSmallint
Nom de colonne
COLUMN_SCALE
Contenu
Le nombre de chiffres droite de la dcimale dans les valeurs BCD, ou de descendants dans les champs ADT et tableau. Le nombre doctets ncessaires pour stocker les valeurs des champs. Un boolen indiquant si le champ peut tre laiss vierge (0 signifie que le champ exige une valeur).
COLUMN_LENGTH COLUMN_NULLABLE
ftInteger ftSmallint
Nom de colonne
RECNO CATALOG_NAME
Contenu
Un num ro denregistrement identifiant chaque enregistrement de manire unique. Le nom du catalogue (la base de donnes) contenant lindex. Cest le mme que le paramtre Database pour un composant de connexion SQL. Le nom du schma identifiant le propritaire de lindex. Le nom de la table pour laquelle est dfini lindex. Le nom de lindex. Ce champ dtermine lordre de tri de lensemble de donnes. Indique le nom de la cl primaire. Le nom du champ (colonne) dans lindex. La position de ce champ dans lindex. Identifie le type dindex. Cest la somme dun nombre quelconque des valeurs suivantes : 1 : non unique 2 : unique 4 : cl primaire Indique que lindex est ascendant (a) ou descendant (d). Dcrit une condition de filtre limitant les enregistrements indexs.
SORT_ORDER FILTER
ftString ftString
22-18
Guide du dveloppeur
Nom de colonne
RECNO CATALOG_NAME
Contenu
Un num ro denregistrement identifiant chaque enregistrement de manire unique. Le nom du catalogue (la base de donnes) contenant la procdure stocke. Cest le mme que le paramtre Database pour un composant de connexion SQL. Le nom du schma identifiant le propritaire de la procdure stocke. Le nom de la procdure stocke contenant le paramtre. Le nom du paramtre. Ce champ dtermine lordre de tri de lensemble de donnes. Identifie le type de paramtre. Cest le mme que la proprit ParamType dun objet TParam. Le type de donnes du param tre. Cest une des constantes de types de champs logiques dfinies dans sqllinks.pas. Un sous-type du type de donnes du param tre. Cest une des constantes de sous-types logiques dfinies dans sqllinks.pas. Une chane dcrivant le type de donnes. Cest la mme que celle contenue dans PARAM_DATATYPE et PARAM_SUBTYPE, mais sous une forme utilise par certaines instructions DDL. Le nombre maximal de chiffres dans les valeurs en virgule flottante ou dans les octets (pour les chanes et les champs doctets). Le nombre de chiffres droite de la dcimale dans les valeurs en virgule flottante. Le nombre doctets ncessaires pour stocker les valeurs des paramtres. Un boolen indiquant si le param tre peut tre laiss vierge (0 signifie que le paramtre exige une valeur).
PARAM_SUBTYPE
ftSmallint
PARAM_TYPENAME
ftString
PARAM_PRECISION
ftInteger
22-19
1 Ajoutez un composant TSQLMonitor la fiche ou au module de donnes contenant le composant TSQLConnection dont vous souhaitez contrler les commandes SQL. 2 Attribuez sa proprit SQLConnection le composant TSQLConnection. 3 Attribuez la valeur True la proprit Active du moniteur SQL.
A mesure que les commandes SQL sont envoyes au serveur, la proprit TraceList du moniteur SQL est automatiquement mise jour afin de prsenter toutes les commandes SQL interceptes. Vous pouvez enregistrer cette liste dans un fichier en sp cifiant une valeur pour la proprit FileName puis en attribuant la proprit AutoSave la valeur True. AutoSave oblige le moniteur SQL enregistrer le contenu de la proprit TraceList dans un fichier chaque consignation dun nouveau message. Si vous voulez pargner votre systme la charge lie lenregistrement dun fichier chaque consignation, vous pouvez utiliser le gestionnaire dvnement OnLogTrace afin de nenregistrer des fichiers qu la suite dun certain nombre de consignations de messages. Par exemple, le gestionnaire dvnement suivant enregistre le contenu de TraceList tous les 10 messages et efface le journal aprs lavoir enregistr afin de limiter la longueur de la liste :
procedure TForm1.SQLMonitor1LogTrace(Sender: TObject; CBInfo: Pointer); var LogFileName: string; begin with Sender as TSQLMonitor do begin if TraceCount = 10 then begin LogFileName := c:\log + IntToStr(Tag) + .txt; Tag := Tag + 1; {permet de nommer diffremment le fichier journal suivant } SaveToFile(LogFileName); TraceList.Clear; { efface la liste } end; end; end; Remarque
Le gestionnaire dvnement prcdent vous permet galement denregistrer une liste qui savre partielle (contenant moins de 10 entres) larrt de lapplication.
22-20
Guide du dveloppeur
Nappelez pas SetTraceCallbackEvent si lobjet TSQLConnection est associ un composant TSQLMonitor. TSQLMonitor utilise le mcanisme de callback pour fonctionner et TSQLConnection ne peut prendre en charge quun callback la fois.
22-21
22-22
Guide du dveloppeur
23
Chapitre 23
Chapitre
Les ensembles de donnes client sont des ensembles de donnes spcialiss qui stockent toutes leurs donnes en mmoire. La manipulation des donnes stockes en mmoire est possible grce midaslib.dcu ou midas.dll. Le format utilis par les ensembles de donnes client pour le stockage des donnes est auto-contenu et facilement transportable ; cest ce qui permet aux ensembles de donnes client de : Lire et crire dans des fichiers ddis sur le disque, en agissant comme un ensemble de donnes bas sur des fichiers. Les proprits et mthodes prenant en charge ce mcanisme sont dcrites dans Utilisation dun ensemble de donnes client avec des donnes bases sur des fichiers la page 23-39. Mettre en cache les mises jour des donnes dun serveur de base de donnes. Les fonctionnalits des ensembles de donnes client prenant en charge les mises jour en cache sont dcrites dans Utilisation dun ensemble de donnes client pour mettre en cache les mises jour la page 23-18. Reprsenter les donnes dans la partie client dune application multiniveau. Pour fonctionner ainsi, lensemble de donnes client doit fonctionner avec un fournisseur externe, comme dcrit dans Utilisation dun ensemble de donnes client avec un fournisseur la page 23-29. Pour plus dinformations sur ces mthodes, voir chapitre 25, Cration dapplications multiniveaux. Reprsenter les donnes issue dune source autre quun ensemble de donnes. Comme un ensemble de donnes client peut utiliser les donnes provenant dun fournisseur externe, des fournisseurs spcialiss peuvent adapter une grande varit de sources dinformations pour les faire fonctionner avec des ensembles de donnes client. Par exemple, vous pouvez utiliser un fournisseur XML pour permettre un ensemble de donnes client de reprsenter les informations contenues dans un document XML.
23-1
Que vous utilisiez les ensembles de donnes client avec des donnes bases sur des fichiers, pour mettre en cache les mises jour, avec des donnes issues dun fournisseur externe (comme avec un document XML ou dans une application multiniveau), ou en combinant toutes ces approches (comme dans une application de modle briefcase), vous bnficierez de la vaste gamme des fonctionnalits pour ensemble de donnes client lors de la manipulation des donnes.
Pour plus de dtails sur ces fonctionnalits, voir Utilisation densembles de donnes de type table la page 18-29. Les ensembles de donnes client diffrent des autres ensembles de donnes en ce sens quils stockent toutes leurs donnes en mmoire. Cest pourquoi la prise en charge de certaines fonctions de bases de donnes peut largir leur champ daction et impliquer de nouvelles contraintes. Ce chapitre dcrit certaines de ces fonctions communes et les diffrences introduites par les ensembles de donnes client.
23-2
Guide du dveloppeur
les mthodes standard comme First, Last, Next et Prior. Pour plus dinformations sur ces mthodes, voir Navigation dans les ensembles de donnes la page 18-6. Au contraire de la majorit des ensembles de donnes, les ensembles de donnes client peuvent positionner le curseur sur un enregistrement spcifique dans lensemble de donnes en utilisant la proprit RecNo. Habituellement, une application utilise RecNo pour dterminer le numro de lenregistrement en cours. Mais, les ensembles de donnes client peuvent dfinir RecNo par un numro denregistrement afin que cet enregistrement devienne lenregistrement en cours.
Op rateur ou fonction
Comparaisons = <> >= <=
Exemple
State = CA State <> CA DateArrive >= 1/1/1998 Total <= 100000
23-3
Tableau 23.1
Support des filtres dans les ensembles de donnes client (suite) Pris en charge par dautres ensembles de donnes Commentaire
Oui Oui Oui Les enregistrements vierges ne saffichent que sils sont explicitement inclus dans le filtre.
Op rateur ou fonction
> < BLANK
Exemple
Pourcentage > 50 Champ1 < Champ2 State <> CA or State = BLANK
Non Non
Oui
Sapplique aux nombres, aux chanes ou aux dates (heures) plus un nombre. Sapplique aux nombres, aux dates ou aux dates (heures) moins un nombre. Sapplique aux nombres uniquement. Sapplique aux nombres uniquement.
Champ1 - 7 <> 10
* /
Lower(Champ1 + Champ2) = Non josp Substring(ChampDate,8) = 1998 Substring(ChampDate,1,3) = JAN Non La valeur va de la position du second argument la fin ou au nombre de caractres dans le troisime argument. Le premier caractre a la position 1.
23-4
Guide du dveloppeur
Tableau 23.1
Support des filtres dans les ensembles de donnes client (suite) Pris en charge par dautres ensembles de donnes Commentaire
Non Supprime le troisime argument au dbut et la fin. Sil ny a pas de troisime argument, supprime les espaces. Voir Trim. Voir Trim.
Op rateur ou fonction
Trim
Exemple
Trim(Champ1 + Champ2) Trim(Champ1, -)
TrimLeft TrimRight
Non Non
Fonctions DateTime Year Month Day Hour Minute Second GetDate Date Time Year(ChampDate) = 2001 Month(ChampDate) <> 12 Day(ChampDate) = 1 Hour(ChampDate) < 16 Minute(ChampDate) = 0 Second(ChampDate) = 30 GetDate - DateField > 7 Non Non Non Non Non Non Non Reprsente la date et lheure en cours. Renvoie la partie date dune valeur date/heure. Renvoie la partie heure dune valeur date/heure.
Divers Like Memo LIKE %filters% Non Fonctionne comme SQL-92 sans la clause ESC. Lorsquelle est applique des champs BLOB, FilterOptions dtermine la prise en compte de la casse. Fonctionne comme SQL-92. Le second argument est une liste de valeurs toutes du mme type. Caractre gnrique pour les comparaisons partielles.
In
Day(ChampDate) in (1,7)
Non
State = M*
Oui
Lorsque vous appliquez des portes ou des filtres, lensemble de donnes client stockera tous les enregistrements en mmoire. La porte ou le filtre dtermine simplement quels sont les enregistrements accessibles aux contrles pour la navigation ou laffichage des donnes issues de lensemble client.
23-5
Remarque
Lors de lextraction de donnes en provenance dun fournisseur, vous pouvez aussi limiter les donnes stockes par lensemble de donnes client en transmettant des paramtres au fournisseur. Pour plus dinformations sur les portes, voir Limitation des enregistrements avec des paramtres la page 23-34.
Lenregistrement de lensemble de donnes client dans un fichier ne supprime pas les modifications du journal. Lorsque vous rechargez lensemble de donnes, les proprits Data et Delta sont inchanges par rapport ce quelles taient lors de lenregistrement des donnes.
23-6
Guide du dveloppeur
La possibilit de stocker chaque modification apporte un enregistrement permet de supporter les oprations dannulation plusieurs niveaux : Pour supprimer la dernire modification apporte un enregistrement, appelez UndoLastChange. Cette mthode accepte un paramtre boolen, FollowChange, qui indique si le curseur doit tre repositionn sur lenregistrement restaur (True) ou sil doit tre laiss sur lenregistrement en cours (False). Si un enregistrement a subi plusieurs modifications, chaque appel UndoLastChange annule un niveau de modification. UndoLastChange renvoie une valeur boolenne indiquant si lannulation a russi ou chou. En cas de russite, UndoLastChange renvoie True. Utilisez la proprit ChangeCount pour dterminer si dautres modifications doivent tre annules. ChangeCount indique le nombre de modifications stockes dans le journal de modifications. Plutt que de supprimer chaque niveau de modification lun aprs lautre, vous pouvez les supprimer tous en une seule fois. Pour supprimer toutes les modifications apportes un enregistrement, slectionnez-le et appelez RevertRecord. Cette mthode supprime toutes les modifications apportes lenregistrement en cours. Pour restaurer un enregistrement supprim, dfinissez dabord la proprit StatusFilter par [ usDeleted], ce qui rend visibles les enregistrements supprims. Ensuite, naviguez jusqu lenregistrement que vous voulez restaurer et appelez RevertRecord. Enfin, restaurez la proprit StatusFilter en [usModified, usInserted, usUnmodified] de sorte que la version modifie de lensemble de donnes (contenant maintenant lenregistrement restaur) soit nouveau visible. A tout moment pendant les modifications, vous pouvez enregistrer ltat courant du journal de modifications laide de la proprit SavePoint. La lecture de SavePoint renvoie un marqueur la position courante dans le journal de modifications. Ultrieurement, si vous souhaitez annuler toutes les modifications opres depuis la lecture du point de sauvegarde, attribuez SavePoint la valeur lue. Votre application peut obtenir des valeurs pour plusieurs points de sauvegarde. Toutefois, lorsque vous sauvegardez le journal de modifications au niveau dun point de sauvegarde, les valeurs de tous les points de sauvegarde postrieurement lues par votre application ne sont plus valides. Toutes les modifications enregistres dans le journal de modifications peuvent tre abandonnes en appelant CancelUpdates. Cette mthode efface le journal de modifications et annule tous les changements apports lensemble des enregistrements. CancelUpdates doit tre employe avec prcaution. Aprs avoir appel la mthode CancelUpdates, il est impossible de rcuprer les modifications.
23-7
Quel que soit le mcanisme utilis, le journal de modifications est automatiquement vid lorsque les mises jour ont t intgres. Les applications bases sur des fichiers peuvent simplement fusionner les modifications dans la mmoire cache locale reprsente par la proprit Data. Elles ne sont pas concernes par la rsolution de modifications locales partir de changements raliss par dautres utilisateurs. Pour fusionner le journal de modifications dans la proprit Data, appelez la mthode MergeChangeLog. Fusion des modifications dans les donnes la page 23-41 dcrit ce processus. Vous ne pouvez pas utiliser MergeChangeLog si vous utilisez lensemble de donnes client pour mettre en cache des mises jour ou pour reprsenter les donnes issues dun composant fournisseur externe. Les informations contenues dans le journal de modifications sont requises pour rpercuter les enregistrements mis jour sur les donnes stockes dans la base de donnes (ou lensemble de donnes source). A la place, appelez ApplyUpdates, qui essaie dcrire les modifications sur le serveur de base de donnes ou lensemble de donnes source, et met jour la proprit Data uniquement lorsque les modifications ont t valides avec succs. Voir Application des mises jour la page 23-24, pour plus dinformations sur ce processus.
23-8
Guide du dveloppeur
lutilisateur peut saisir. Chaque composant champ possde deux proprits qui peuvent tre utilises pour spcifier des contraintes : La proprit DefaultExpression dfinit une valeur par dfaut qui est attribue au champ si lutilisateur nen saisit pas une. Remarquez que si le serveur de base de donnes ou lensemble de donnes source attribue aussi une expression par dfaut au champ, celle de lensemble de donnes client est prioritaire car elle est attribue avant que la mise jour ne soit applique en retour sur le serveur de base de donnes ou dans lensemble de donnes source. La proprit CustomConstraint vous permet dimposer une condition remplir pour quune valeur de champ puisse tre valide. Les contraintes personnalises dfinies de cette faon sont appliques en plus des contraintes importes du serveur. Pour plus dinformations sur la manipulation des contraintes personnalises sur les composants champ, voir Cration de contrainte personnalise la page 19-25. Au niveau de lenregistrement, vous pouvez spcifier des contraintes laide de la proprit Constraints de lensemble de donnes client. Constraints est une collection dobjets TCheckConstraint , dans laquelle chacun deux reprsente une condition. Utilisez la proprit CustomConstraint dun objet TCheckConstraint pour ajouter vos propres contraintes, qui sont vrifies lorsque vous validez les enregistrements.
Tri et indexation
Lutilisation dindex prsente plusieurs avantages pour vos applications : Ils permettent aux ensembles de donnes client de localiser les donnes rapidement. Ils permettent dappliquer des portes pour limiter les enregistrements disponibles. Ils permettent votre application de dfinir des relations entre les autres ensembles de donnes, telles que des tables de rfrence ou des liens matre/ dtail. Ils spcifient lordre dans lequel les enregistrements apparaissent. Si un ensemble de donnes client reprsente les donnes dun serveur ou utilise un fournisseur externe, il hrite dun index et dun ordre de tri par dfaut, bass sur les donnes quil reoit. Lindex par dfaut sappelle DEFAULT_ORDER. Il est possible dutiliser ce classement, mais il est impossible de modifier ou de supprimer lindex. En plus de lindex par dfaut, lensemble de donnes client gre un deuxime index, appel CHANGEINDEX, partir des enregistrements stocks dans le journal de modifications (proprit Delta). CHANGEINDEX classe tous les enregistrements de lensemble de donnes tels quils apparatraient si les modifications de Delta taient appliques. CHANGEINDEX est bas sur lordre quil a hrit de DEFAULT_ORDER. Comme pour DEFAULT_ORDER, il est impossible de modifier ou de supprimer lindex CHANGEINDEX.
23-9
Vous pouvez utiliser dautres index existants ou crer vos propres index. Les sections suivantes dcrivent comment crer et utiliser des index avec des ensembles de donnes client.
Remarque
Vous pouvez galement vouloir revoir les documents sur les index dans les ensembles de donnes de type table, ce qui sapplique aussi aux ensembles de donnes client. Vous trouverez ces informations dans Tri des enregistrements avec des index la page 18-30 et Limitation des enregistrements avec des portes la page 18-35.
23-10
Guide du dveloppeur
La troisime mthode pour crer un index intervient lors de la cration de lensemble de donnes client. Avant de crer lensemble de donnes client, spcifiez les index souhaits en utilisant la proprit IndexDefs. Les index sont alors crs en mme temps que lensemble de donnes sous-jacent lors de lappel de CreateDataSet. Pour plus dinformations sur la cration des ensembles de donnes client, voir Cration et suppression des tables la page 18-44. Comme pour AddIndex, les index crs en mme temps que lensemble de donnes prennent en charge le regroupement et peuvent tre tris en ordre dcroissant sur certains champs et ne pas prendre en compte les diffrences majuscules-minuscules pour dautres. Les index crs de cette manire sont toujours conservs et enregistrs quand vous enregistrez lensemble de donnes client dans un fichier.
Conseil
Lindexation et le tri peuvent seffectuer sur des champs calculs en interne avec des ensembles de donnes client.
Customer
1 1 2 2 1 3
OrderNo
5 2 3 6 1 4
Amount
100 50 200 75 10 200
En raison de lordre de tri, les valeurs identiques dans la colonne SalesRep apparaissent regroupes. A lintrieur des champs relatifs au reprsentant (SalesRep) 1, les valeurs identiques de la colonne des clients (Customer) apparaissent regroupes. En dautres termes, les donnes sont regroupes par reprsentant (SalesRep) puis, dans le groupe SalesRep, par client (Customer). A chaque regroupement est associ un niveau. Dans notre exemple, le groupe
23-11
SalesRep est le niveau 1 (car il nest imbriqu dans aucun autre groupe) et le groupe Customer est le niveau 2 (car il est imbriqu dans le groupe de niveau 1). Le niveau de regroupement correspond lordre des champs dans lindex. Les ensembles de donnes client vous permettent de dterminer la position de lenregistrement en cours dans un niveau de regroupement donn. Cela permet votre application dafficher les enregistrements diffremment, suivant qu ils se trouvent en tte, au milieu ou la fin dun groupe. Par exemple, vous pouvez afficher une valeur de champ que si elle figure dans le premier enregistrement dun groupe et liminer ainsi les doublons. Le rsultat est le suivant partir de la table prcdente :
SalesRep
1
Customer
1 2
OrderNo
5 2 3 6 1 4
Amount
100 50 200 75 10 200
1 3
Pour dterminer la position de lenregistrement en cours dans un groupe, utilisez la mthode GetGroupState. GetGroupState accepte une valeur entire reprsentant le niveau du groupe et renvoie une valeur indiquant la position de lenregistrement en cours dans le groupe (premire position, dernire position ou aucune des deux positions). Lorsque vous crez un index, vous pouvez spcifier le niveau de regroupement quil prend en charge (jusquau nombre de champs prsents dans lindex). GetGroupState ne peut fournir dinformation sur les groupes au del de ce niveau, mme si lindex classe les enregistrements sur dautres champs.
23-12
Guide du dveloppeur
Utilisation de champs calculs de faon interne dans les ensembles de donnes client
Dans les autres ensembles de donnes, votre application doit dterminer la valeur des champs calculs chaque fois que lenregistrement change ou que lutilisateur modifie lun des champs de lenregistrement en cours. Elle ralise cela dans un gestionnaire dvnement OnCalcFields. Bien que vous puissiez utiliser ce procd dans les ensembles de donnes client, ces derniers, en enregistrant les valeurs calcules dans leurs donnes, vous permettent de rduire au minimum le nombre de fois o les champs calculs doivent tre recalculs. Lorsque les valeurs calcules sont enregistres avec lensemble de donnes client, elles doivent toujours tre recalcules lorsque lutilisateur modifie lenregistrement en cours mais votre application na pas besoin de recalculer les valeurs chaque fois que lenregistrement en cours change. Pour enregistrer les valeurs calcules dans les donnes de lensemble de donnes client, utilisez des champs calculs de faon interne la place de champs calculs. Les champs calculs de faon interne, comme les champs calculs, sont calculs dans un gestionnaire dvnement OnCalcFields. Toutefois, vous pouvez optimiser votre gestionnaire dvnement en vrifiant la proprit State de votre ensemble de donnes client. Lorsque State vaut dsInternalCalc, vous devez recalculer les champs calculs de faon interne. Lorsque State vaut dsCalcFields, il suffit de recalculer les champs calculs ordinaires. Pour utiliser des champs calculs de faon interne, vous devez dfinir les champs devant tre calculs de faon interne avant de crer lensemble de donnes client. Selon que vous utilisez des champs persistants ou des dfinitions de champs, vous ferez cela dune des faons suivantes : Si vous utilisez des champs persistants, dfinissez les champs devant tre calculs de faon interne en slectionnant InternalCalc dans lditeur de champs. Si vous utilisez des dfinitions de champs, attribuez la valeur True la proprit InternalCalcField de la dfinition de champ adquate.
Remarque
Dautres types densembles de donnes utilisent des champs calculs de faon interne. Mais, vous ne calculez pas les valeurs de ces champs dans un gestionnaire dvnement OnCalcFields. Elles sont automatiquement calcules par le BDE ou par le serveur de base de donnes distant.
23-13
pour supporter un large ventail de calculs rsum et dterminer des sous-totaux englobant diffrents groupes denregistrements dfinis par un champ de lindex supportant le regroupement.
Spcification dagrgats
Pour spcifier que vous voulez oprer des calculs synthtiques partir des enregistrements dun ensemble de donnes client, utilisez la proprit Aggregates. Aggregates est un ensemble de spcifications dagrgat (TAggregate). Vous pouvez ajouter des spcifications dagrgat votre ensemble de donnes client laide de lditeur de collection lors de la conception ou en utilisant la mthode Add de Aggregates lors de lexcution. Si vous souhaitez crer des composants champ pour les agrgats, crez des champs persistants pour les valeurs synthtises dans lditeur de champs.
Remarque
Lorsque vous crez des champs synthtiss, les objets agrgat appropris sont automatiquement ajouts la proprit Aggregates de lensemble de donnes client. Ne les ajoutez pas de faon explicite lors de la cration des champs persistants synthtiss. Pour plus de dtails sur la cration des champs persistants synthtiss, voir Dfinition dun champ agrgat la page 19-12. Pour chaque agrgat, la proprit Expression indique le calcul synthtique quelle reprsente. Expression peut contenir une simple expression synthtique telle que
Sum(Champ1)
ou une expression complexe qui combine les informations de plusieurs champs, telle que
Sum(Qt * Prix) - Sum(MontantPay)
Les oprateurs de synthse portent sur des valeurs de champ ou sur des expressions conues partir de valeurs de champ laide des mmes oprateurs que ceux utiliss pour la cration de filtres. Vous ne pouvez pas, toutefois, imbriquer des oprateurs de synthse. Vous pouvez crer des expressions avec des oprateurs partir de valeurs synthtises, ou de valeurs synthtises et de constantes. Toutefois, vous ne pouvez pas combiner des valeurs synthtises et des valeurs de champ, car de telles expressions sont ambigus (rien nindique
23-14
Guide du dveloppeur
quel enregistrement doit fournir la valeur de champ). Ces rgles sont illustres dans les expressions suivantes :
Sum(Qty * Price) {autoris -- synthse dune expression portant sur des champs }
Max(Champ1) - Max(Champ2) {autoris -- expression partir de synthses } Avg(TauxRemise) * 100 Min(Sum(Champ1)) Count(Champ1) - Champ2 {autoris -- expression partir dune synthse et dune constante } {non autoris -- synthses imbriques } {non autoris -- expression partir dune synthse et dun champ }
Customer
1 1 2 2 1 3
OrderNo
5 2 3 6 1 4
Amount
100 50 200 75 10 200
Le code suivant dfinit un agrgat maintenu qui indique le montant total des ventes ralis par chaque reprsentant :
Agg.Expression := Sum(Amount); Agg.IndexName := SalesCust; Agg.GroupingLevel := 1; Agg.AggregateName := Total for Rep;
Pour ajouter un agrgat qui synthtise chaque client pour un reprsentant donn, crez un agrgat maintenu de niveau 2.
23-15
Les agrgats maintenus qui synthtisent un groupe denregistrements sont associs un index spcifique. La proprit Aggregates peut inclure des agrgats qui utilisent diffrents index. Toutefois, seuls les agrgats qui synthtisent la totalit de lensemble de donnes client et ceux qui utilisent lindex en cours sont valides. La modification de lindex en cours dtermine les agrgats valides. Pour dterminer les agrgats valides un moment donn, utilisez la proprit ActiveAggs.
23-16
Guide du dveloppeur
fois quun paquet de donnes est affect Data, son contenu est automatiquement affich dans les contrles orients donnes connects lensemble de donnes client par un composant source de donnes. Lorsque vous ouvrez un ensemble de donnes client reprsentant des donnes du serveur ou utilisant un composant fournisseur externe, les paquets de donnes sont automatiquement affects Data. Lorsque votre ensemble de donnes client nutilise pas de fournisseur, vous pouvez copier les donnes partir dun autre ensemble de donnes client comme suit :
ClientDataSet1.Data := ClientDataSet2.Data; Remarque
Lorsque vous copiez la proprit Data dun autre ensemble de donnes client, vous copiez galement le journal de modifications, mais la copie ne reflte pas les filtres ni les portes ayant t appliqus. Pour inclure les filtres ou les portes, vous devez cloner le curseur de lensemble de donnes source. Si vous copiez partir dun ensemble de donnes autre qu un ensemble de donnes client, vous pouvez crer un composant fournisseur densembles de donnes, le relier lensemble de donnes source et copier ses donnes :
TempProvider := TDataSetProvider.Create(Form1); TempProvider.DataSet := SourceDataSet; ClientDataSet1.Data := TempProvider.Data; TempProvider.Free;
Remarque
Lorsque vous affectez directement les donnes la proprit Data, le nouveau paquet de donnes nest pas fusionn dans les donnes existantes. Au lieu de cela, toutes les anciennes donnes sont remplaces. Si vous souhaitez fusionner les modifications dun autre ensemble de donnes, et non copier ses donnes, vous devez utiliser un composant fournisseur. Crez un fournisseur densembles de donnes comme dans lexemple prcdent, mais attachez-le lensemble de donnes de destination et au lieu de copier la proprit Data, utilisez la mthode ApplyUpdates :
TempProvider := TDataSetProvider.Create(Form1); TempProvider.DataSet := ClientDataSet1; TempProvider.ApplyUpdates(SourceDataSet.Delta, -1, ErrCount); TempProvider.Free;
23-17
Utilisation dun ensemble de donnes client pour mettre en cache les mises jour
lindex en cours, de liens vers une table matre (lorsque lensemble de donnes source est un ensemble dtail), de la proprit ReadOnly et de tout lien vers un composant connexion ou un fournisseur. Lorsque Reset et KeepSettings valent False, un ensemble de donnes client clon est ouvert et les paramtres de lensemble de donnes client source sont utiliss pour dfinir les proprits de lensemble de donnes destination. Lorsque Reset vaut True, les proprits de lensemble de donnes client destination reoivent les valeurs par dfaut (aucun index ni filtre, aucune table matre, ReadOnly vaut False et aucun composant connexion ou fournisseur nest spcifi). Lorsque KeepSettings vaut True, les proprits de lensemble de donnes destination ne sont pas modifies.
Utilisation dun ensemble de donnes client pour mettre en cache les mises jour
Lorsque vous modifiez des donnes dans la majorit des ensembles de donnes, chaque fois que vous supprimez ou mettez un enregistrement, par dfaut, lensemble de donnes gnre une transaction, supprime ou crit lenregistrement sur le serveur de base de donnes, puis valide la transaction. Sil y a un problme lors de lcriture des modifications dans la base de donnes, votre application reoit immdiatement une notification : lensemble de donnes dclenche une exception lorsque vous mettez (post) lenregistrement. Si votre ensemble de donnes utilise un serveur de base de donnes distant, cette approche peut rduire les performances, cause du trafic sur le rseau entre votre application et le serveur chaque fois que vous passez un nouvel enregistrement aprs ldition de lenregistrement en cours. Pour rduire le trafic sur le rseau, vous pouvez effectuer les mises jour dans un cache local. Lorsque vous mettez en cache les mises jour, votre application rcupre les donnes dans la base de donnes, les met en cache et les modifie en local, puis
23-18
Guide du dveloppeur
Utilisation dun ensemble de donnes client pour mettre en cache les mises jour
applique les mises jour du cache la base de donnes en une seule transaction. Lorsque vous mettez en cache les mises jour, les changements effectus sur un ensemble de donnes (comme mettre des modifications ou supprimer des enregistrements) sont stocks en local au lieu dtre crits directement dans la table sous-jacente lensemble de donnes. Lorsque les modifications sont termines, votre application appelle une mthode qui crit les modifications du cache dans la base de donnes et vide le cache. Mettre en cache les mises jour peut minimiser le temps de transaction et rduire le trafic sur le rseau. Cependant, les donnes mises en cache sont locales pour votre application et ne se trouvent plus sous le contrle des transactions. Cela signifie que, pendant que vous travaillez sur votre copie des donnes dans votre mmoire locale, dautres applications peuvent tre en train de changer les donnes dans la table de la base de donnes sous-jacente. Dautre part, elles ne peuvent pas voir les modifications que vous effectuez tant que ne validez pas les mises jour du cache. De ce fait, les mises jour en cache ne conviennent pas aux applications impliquant des donnes trop versatiles, car vous risqueriez de crer ou de rencontrer trop de conflits au moment dintgrer vos modifications dans la base de donnes. Bien que le BDE et ADO fournissent dautres mcanismes pour cacher les mises jour, lutilisation dun ensemble de donnes client offre plusieurs avantages : Lorsque des ensembles de donnes sont lis par des relations matre/dtail, lapplication des mises jour est gre votre place. Cela garantit que les mises jour dans des ensembles de donnes multiples lis entre eux sont effectues dans le bon ordre. Les ensembles de donnes client vous procurent le meilleur contrle sur le processus de mise jour. Vous pouvez dfinir des proprits pour influencer le SQL gnr pour mettre jour les enregistrements, spcifier la table utiliser dans le cas de mise jour denregistrements partir dune jointure multitable, ou mme appliquer les mises jour manuellement partir dun gestionnaire dvnement BeforeUpdateRecord. Si des erreurs se produisent pendant lapplication au serveur de la base de donnes des mises jour du cache, seuls les ensembles de donnes client (et les fournisseurs densembles de donnes) vous donnent des informations sur lenregistrement en cours dans le serveur en plus de la valeur originale (non modifie) de votre ensemble de donnes et de la nouvelle valeur (modifie) de la mise jour qui a chou. Les ensembles de donnes client vous permettent de spcifier le nombre derreurs de mise jour que vous pouvez accepter avant labandon de la totalit de la mise jour.
23-19
Utilisation dun ensemble de donnes client pour mettre en cache les mises jour
1 Indiquer les donnes que vous voulez modifier. La faon dont vous le ferez dpend du type densemble de donnes client que vous utilisez :
Si vous utilisez TClientDataSet, spcifiez le composant fournisseur qui reprsente les donnes que vous voulez modifier. Cela est dcrit dans Spcification dun fournisseur la page 23-30. Si vous utilisez un ensemble de donnes client associ un mcanisme daccs aux donnes particulier, vous devez - Identifier le serveur de base de donnes en dfinissant la proprit DBConnection par un composant de connexion appropri. - Indiquer les donnes que vous voulez voir en spcifiant les proprits CommandText et CommandType. CommandType indique si CommandText est une instruction SQL excuter, le nom dune procdure stocke ou le nom dune table. Si CommandText est une requte ou une procdure stocke, utilisez la proprit Params pour extraire les paramtres dentre. - Optionnellement, utilisez la proprit Options pour dterminer si les ensembles dtails imbriqus et les donnes BLOB doivent figurer dans les paquets de donnes ou tre extraits sparment, si les types spcifiques ddition (insertions, modifications ou suppressions) sont dsactivs, si une mme mise jour peut concerner plusieurs enregistrements du serveur et si les enregistrements de lensemble de donnes client sont rafrachis lorsquil applique les mises jour. Options est identique la proprit Options du fournisseur. Par consquent, vous pouvez dfinir des options non pertinentes ou inappropries. Par exemple, il ny a pas lieu dinclure poIncFieldProps, car lensemble de donnes client nextrait pas ses donnes dun ensemble de donnes comportant des champs persistants. De mme, il nest pas souhaitable dexclure poAllowCommandText, qui est inclus par dfaut, car cela dsactiverait la proprit CommandText, que lensemble de donnes client utilise pour spcifier quelles donnes il veut. Pour plus dinformations sur la proprit Options du fournisseur, voir Initialisation des options contrlant les paquets de donnes la page 24-6.
2 Afficher et modifier les donnes, permettre linsertion de nouveaux enregistrements et la suppression denregistrements existants. A la fois la copie originale de chaque enregistrement et toutes ses modifications sont stockes en mmoire. Ce processus est dcrit dans Edition des donnes la page 23-6. 3 Extraire des enregistrements supplmentaires si ncessaire. Par dfaut, les ensembles de donnes client extraient tous les enregistrements et les stockent en mmoire. Si un ensemble de donnes contient beaucoup denregistrements, ou des enregistrements avec des champs BLOB volumineux, vous souhaiterez probablement modifier ce comportement pour que lensemble de donnes clients nextrait que les enregistrements requis pour laffichage et recommence lopration lorsque cela savre nouveau ncessaire. Pour des dtails sur la
23-20
Guide du dveloppeur
Utilisation dun ensemble de donnes client pour mettre en cache les mises jour
faon de contrler le processus dextraction des enregistrements, voir Extraction des donnes dans lensemble de donnes ou le document source la page 23-31.
4 Optionnellement, rafrachir les enregistrements. Plus le temps passe, plus dautres utilisateurs risquent de modifier les donnes sur le serveur de la base de donnes. Cela peut provoquer un cart de plus en plus important entre les donnes de lensemble client et celles du serveur, et une augmentation des risques derreurs au moment o vous appliquerez les mises jour. Pour rduire ce problme, vous pouvez rafrachir les enregistrements nayant pas t modifis. Voir Rafrachissement des enregistrements la page 23-36, pour plus de dtails. 5 Appliquer les enregistrements du cache local la base de donnes ou annuler les mises jour. Pour chaque enregistrement crit dans la base de donnes, un vnement BeforeUpdateRecord est dclench. Si une erreur se produit lors de lcriture dun enregistrement dans la base de donnes, un vnement OnUpdateError permet lapplication de corriger cette erreur, si possible, et de poursuivre la mise jour. Lorsque les mises jour sont termines, toutes les mises jour appliques avec succs sont supprimes du cache local. Pour plus dinformations sur lapplication des mises jour dans la base de donnes, voir Mise jour des enregistrements la page 23-24.
Au lieu dappliquer les mises jour, une application peut annuler les mises jour, en vidant le journal de modifications sans les crire dans la base de donnes. Vous pouvez annuler les mises jour en appelant la mthode CancelUpdates. Tous les enregistrements supprims dans le cache sont dsupprims, les enregistrements modifis sont ramens leurs valeurs originelles, et les enregistrements nouvellement insrs disparaissent tout simplement.
En outre, vous pouvez mettre en cache les mises jour en utilisant lensemble de donnes client gnrique ( TClientDataSet) avec un fournisseur externe et un ensemble de donnes source. Pour plus dinformations sur lutilisation de
23-21
Utilisation dun ensemble de donnes client pour mettre en cache les mises jour
TClientDataSet avec un fournisseur externe, voir Utilisation dun ensemble de donnes client avec un fournisseur la page 23-29.
Remarque
Les ensembles de donnes client spcialiss associs chaque mcanisme daccs aux donnes utilisent en fait un fournisseur et un ensemble de donnes source. Mais, et le fournisseur et lensemble de donnes source sont internes par rapport lensemble de donnes client. Le plus simple est dutiliser un des ensembles de donnes client spcialiss pour mettre en cache les mises jour. Mais, il est parfois prfrable dutiliser TClientDataSet avec un fournisseur externe : Si vous utilisez un mcanisme daccs aux donnes nayant pas densemble de donnes client spcialis, vous devez utiliser TClientDataSet avec un composant fournisseur externe. Par exemple, si les donnes proviennent dun document XML ou dun ensemble de donnes personnalis. Si vous travaillez avec des tables entre lesquelles a t tablie une relation matre/dtail, vous devez utiliser TClientDataSet et le connecter, au moyen dun fournisseur, la table matre de deux ensembles de donnes source lis dans une relation matre/dtail. Lensemble de donnes client voit lensemble dtail comme le champ dun ensemble de donnes imbriqu . Cette approche est ncessaire pour permettre lapplication des mises jour des tables matre et client dans lordre correct. Si vous voulez coder des gestionnaires dvnements rpondant la communication entre lensemble client et le fournisseur (par exemple, avant et aprs que lensemble client extrait des enregistrements du fournisseur), vous devez utiliser TClientDataSet avec un composant fournisseur externe. Les ensembles de donnes client spcialiss publient les vnements les plus importants de lapplication des mises jour (OnReconcileError, BeforeUpdateRecord et OnGetTableName), mais ils ne publient pas les vnements priphriques de la communication entre lensemble client et son fournisseur, car au dpart ils ont t prvus pour les applications multiniveaux. Lorsque vous utilisez le BDE, vous pouvez vouloir utiliser un fournisseur externe et un ensemble de donnes source si vous avez besoin dutiliser un objet mise jour. Bien quil soit possible de coder un objet mise jour partir du gestionnaire dvnement BeforeUpdateRecord de TBDEClientDataSet, il est plus simple daffecter la proprit UpdateObject de lensemble de donnes source. Pour plus dinformations sur lutilisation des objets mise jour, voir Utilisation dobjets mise jour pour mettre jour un ensemble de donnes la page 20-45.
23-22
Guide du dveloppeur
Utilisation dun ensemble de donnes client pour mettre en cache les mises jour
modifications en naviguant jusqu elles et en cliquant sur un bouton Dfaire par exemple. La mthode UpdateStatus et les proprits StatusFilter sont utiles pour fournir un feedback sur les mises jour qui se sont produites : UpdateStatus indique quel type de mise jour sest ventuellement produit sur lenregistrement en cours. Cela peut tre lune des valeurs suivantes : usUnmodified indique que lenregistrement en cours est inchang. usModified indique que lenregistrement en cours a t modifi. usInserted indique quun enregistrement a t insr par lutilisateur. usDeleted indique quun enregistrement a t supprim par lutilisateur.
StatusFilter contrle quels types de mises jour sont visibles dans le journal de modifications. StatusFilter fonctionne sur les enregistrements en cache comme les filtres sur des donnes standard. StatusFilter est un ensemble qui peut inclure nimporte quelle combinaison des valeurs suivantes : usUnmodified indique un enregistrement non modifi. usModified indique un enregistrement modifi. usInserted indique un enregistrement insr. usDeleted indique un enregistrement supprim.
Par dfaut, StatusFilter est lensemble [usModified, usInserted, usUnmodified]. Vous pouvez ajouter usDeleted cet ensemble afin de fournir le feedback des enregistrements supprims en plus.
Remarque
UpdateStatus et StatusFilter sont galement utiles dans les gestionnaires des vnements BeforeUpdateRecord et OnReconcileError. Pour plus dinformations sur BeforeUpdateRecord, voir Intervention pendant lapplication des mises jour la page 23-25. Pour plus dinformations OnReconcileError, voir Conciliation des erreurs de mise jour la page 23-27. Lexemple suivant montre comment fournir du feedback sur ltat de mise jour des enregistrements, en utilisant la mthode UpdateStatus. Il suppose que vous avez chang la proprit StatusFilter afin qu elle comprenne usDeleted, ce qui permet aux enregistrements supprims de rester visibles dans lensemble de donnes. Il suppose de plus que vous avez ajout un champ calcul lensemble de donnes, appel Status.
procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet); begin with ClientDataSet1 do begin case UpdateStatus of usUnmodified: FieldByName(Status).AsString := ; usModified: FieldByName(Status).AsString := M; usInserted: FieldByName(Status).AsString := I; usDeleted: FieldByName(Status).AsString := D; end; end; end;
23-23
Utilisation dun ensemble de donnes client pour mettre en cache les mises jour
1 Lapplication client appelle la mthode ApplyUpdates dun objet ensemble de donnes client. Cette mthode transmet le contenu de la proprit Delta de lensemble de donnes client au fournisseur (interne ou externe). Delta est un paquet de donnes qui contient les enregistrements mis jour, insrs et supprims dans un ensemble de donnes client. 2 Le fournisseur applique les mises jour, en plaant en mmoire cache tous les enregistrements problmatiques qu il ne peut pas rsoudre lui-mme. Voir Comment rpondre aux demandes de mise jour des clients la page 24-9, pour plus de dtails sur lapplication des mises jour par le fournisseur. 3 Le fournisseur renvoie tous les enregistrements non rsolus lensemble de donnes client dans un paquet de donnes Result. Le paquet de donnes Result contient tous les enregistrements non mis jour. Il contient aussi les informations derreur, comme les messages derreur et les codes derreur. 4 Lensemble de donnes client essaie de concilier les erreurs de mise jour renvoyes dans le paquet de donnes Result enregistrement par enregistrement.
23-24
Guide du dveloppeur
Utilisation dun ensemble de donnes client pour mettre en cache les mises jour
correctement sont automatiquement effacs du journal de modifications de lensemble de donnes client. ApplyUpdates renvoie le nombre rel derreurs rencontres, qui est toujours infrieur ou gal MaxErrors plus un. Cette valeur de renvoi indique le nombre denregistrements qui nont pas pu tre crits dans la base de donnes. La mthode ApplyUpdates de lensemble de donnes client effectue les oprations suivantes :
1 Elle appelle indirectement la mthode ApplyUpdates du fournisseur. La mthode ApplyUpdates du fournisseur crit les mises jour dans la base de donnes, dans lensemble de donnes source ou dans le document XML, et tente de corriger les erreurs rencontres. Les enregistrements quelle ne peut appliquer cause des erreurs sont renvoys lensemble de donnes client. 2 La mthode ApplyUpdates de lensemble de donnes client essaie alors de concilier ces enregistrements problmatiques en appelant la mthode Reconcile. Reconcile est une routine de gestion derreur qui appelle le gestionnaire dvnement OnReconcileError. Vous devez crire le code du gestionnaire dvnement OnReconcileError pour quil corrige les erreurs. Pour plus dinformations sur lutilisation de OnReconcileError, voir Conciliation des erreurs de mise jour la page 23-27. 3 Enfin, Reconcile supprime du journal de modifications celles dont lapplication a russi et met jour Data avec les nouveaux enregistrements mis jour. Quand Reconcile est termine, ApplyUpdates indique le nombre derreurs survenues.
Important
Dans certains cas, le fournisseur ne peut dterminer comment appliquer les mises jour (par exemple, lors de mises jour partir dune procdure stocke ou dune jointure multitable). Les ensembles de donnes client et les composants fournisseur gnrent des vnements vous permettant de grer de telles situations. Voir Intervention pendant lapplication des mises jour ci-aprs, pour plus de dtails. Si le fournisseur se trouve sur un serveur dapplications sans tat, vous voudrez peut-tre changer avec lui des informations dtat persistantes, avant ou aprs lapplication des mises jour. TClientDataSet reoit un vnement BeforeApplyUpdates avant que les mises jour ne soient envoyes, ce qui vous permet denvoyer au serveur des informations dtat persistantes. Une fois que les mises jour sont appliques (mais avant le processus de conciliation), TClientDataSet reoit un vnement AfterApplyUpdates, ce qui vous permet de rpondre toute information dtat persistante renvoye par le serveur dapplications.
Conseil
23-25
Utilisation dun ensemble de donnes client pour mettre en cache les mises jour
fournisseur pour agir sur la faon dont sont appliques les mises jour. Ces mthodes sont dcrites dans Comment rpondre aux demandes de mise jour des clients la page 24-9. Mais, lorsque le fournisseur est interne, ce qui se passe pour tout ensemble de donnes client associ un mcanisme daccs aux donnes, vous ne pouvez pas dfinir ses proprits ni fournir de gestionnaire dvnement. Il sen suit que lensemble de donnes client publie une proprit et deux vnements vous permettant dagir sur la faon dont le fournisseur interne applique les mises jour. UpdateMode dtermine les champs utiliss pour rechercher des enregistrements dans les instructions SQL que gnre le fournisseur pour appliquer les mises jour. UpdateMode est identique la proprit UpdateMode du fournisseur. Pour plus dinformations sur la proprit UpdateMode du fournisseur, voir Comment contrler lapplication des mises jour la page 24-11. OnGetTableName qui vous permet de fournir au fournisseur le nom de la table de base de donnes laquelle il doit appliquer les mises jour. Cela permet au fournisseur de gnrer les instructions SQL de mise jour lorsqu il ne peut pas identifier la table de la base de donnes partir de la procdure stocke ou de la requte spcifie par CommandText. Par exemple, si la requte excute une jointure multitable qui nimplique des mises jour que pour une seule table, la fourniture dun gestionnaire dvnement OnGetTableName permet au fournisseur interne dappliquer correctement les mises jour. Le gestionnaire dvnement OnGetTableName reoit trois paramtres : le composant fournisseur interne, lensemble de donnes interne ayant extrait les donnes du serveur, et un paramtre pour renvoyer le nom de la table utiliser dans le SQL gnr. BeforeUpdateRecord se produit pour chaque enregistrement du paquet delta. Cet vnement permet deffectuer tout changement de dernire minute avant que lenregistrement ne soit insr, supprim ou modifi. En outre, il vous permet dexcuter vos propres instructions SQL pour appliquer la mise jour lorsque le fournisseur nest pas en mesure de gnrer une instruction SQL correcte (cest par exemple le cas des jointures multitables dans lesquelles plusieurs tables doivent tre mises jour.) Le gestionnaire dvnement BeforeUpdateRecord reoit cinq paramtres : le composant fournisseur interne, lensemble de donnes interne qui a extrait les donnes du serveur, un paquet delta positionn sur lenregistrement qui va tre mis jour, une indication de la nature de la mise jour (insertion, suppression ou modification), et un paramtre qui renvoie lindication que le gestionnaire dvnement a effectu la mise jour. Tout cela est illustr dans le gestionnaire dvnement suivant. Pour simplifier, cet exemple suppose que les instructions SQL sont accessibles en tant que variables globales ne ncessitant que les valeurs des champs :
procedure TForm1.SQLClientDataSet1BeforeUpdateRecord(Sender: TObject; SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind; var Applied Boolean); var
23-26
Guide du dveloppeur
Utilisation dun ensemble de donnes client pour mettre en cache les mises jour
SQL: string; Connection: TSQLConnection; begin Connection := (SourceDS as TCustomSQLDataSet).SQLConnection; case UpdateKind of ukModify: begin { 1st dataset: update Fields[1], use Fields[0] in where clause } SQL := Format(UpdateStmt1, [DeltaDS.Fields[1].NewValue, DeltaDS.Fields[0].OldValue]); Connection.Execute(SQL, nil, nil); { 2nd dataset: update Fields[2], use Fields[3] in where clause } SQL := Format(UpdateStmt2, [DeltaDS.Fields[2].NewValue, DeltaDS.Fields[3].OldValue]); Connection.Execute(SQL, nil, nil); end; ukDelete: begin { 1st dataset: use Fields[0] in where clause } SQL := Format(DeleteStmt1, [DeltaDS.Fields[0].OldValue]); Connection.Execute(SQL, nil, nil); { 2nd dataset: use Fields[3] in where clause } SQL := Format(DeleteStmt2, [DeltaDS.Fields[3].OldValue]); Connection.Execute(SQL, nil, nil); end; ukInsert: begin { 1st dataset: values in Fields[0] and Fields[1] } SQL := Format(InsertStmt1, [DeltaDS.Fields[0].NewValue, DeltaDS.Fields[1].NewValue]); Connection.Execute(SQL, nil, nil); { 2nd dataset: values in Fields[2] and Fields[3] } SQL := Format(InsertStmt2, [DeltaDS.Fields[2].NewValue, DeltaDS.Fields[3].NewValue]); Connection.Execute(SQL, nil, nil); end; end; Applied := True; end;
23-27
Utilisation dun ensemble de donnes client pour mettre en cache les mises jour
enregistrement que le fournisseur na pas pu appliquer sur le serveur de la base de donnes. Il faut toujours coder un gestionnaire dvnement OnReconcileError ou OnUpdateError, mme sil ne fait quabandonner les enregistrements nayant pas pu tre appliqus. Les gestionnaires des deux vnements fonctionnent de manire identique. Ils incluent les paramtres suivants : DataSet : Un ensemble de donnes client qui contient lenregistrement mis jour qui na pas pu tre appliqu. Vous pouvez utiliser les mthodes de lensemble de donnes client pour obtenir des informations sur lenregistrement problmatique et pour le modifier afin de rsoudre tous les problmes. Vous pouvez notamment utiliser les proprits CurValue, OldValue et NewValue des champs de lenregistrement en cours pour dterminer la cause du problme de mise jour. Toutefois, vous ne pouvez pas appeler une mthode de lensemble de donnes client qui modifie lenregistrement en cours dans votre gestionnaire dvnement. E : Un objet qui reprsente le problme qui sest produit. Vous pouvez utiliser cette exception pour extraire un message derreur ou pour dterminer la cause dune erreur de mise jour. UpdateKind : Le type de mise jour ayant gnr lerreur. UpdateKind peut tre ukModify (problme survenu lors de la mise jour dun enregistrement existant modifi), ukInsert (problme survenu lors de linsertion dun nouvel enregistrement) ou ukDelete (problme survenu lors de la suppression dun enregistrement existant). Action : Un paramtre var qui indique laction entreprendre la fin de lexcution du gestionnaire dvnement. Dans votre gestionnaire dvnement, vous initialisez ce paramtre pour Ignorer lenregistrement et le laisser dans le journal de modifications. (rrSkip ou raSkip) Abandonner lopration de conciliation entire. (rrAbort ou raAbort) Fusionner la modification infructueuse avec lenregistrement correspondant sur le serveur. (rrMerge ou raMerge) Cela ne fonctionne que si lenregistrement du serveur ninclut pas de modification sur les champs modifis dans lenregistrement de lensemble de donnes client. Remplacer la mise jour courante dans le journal de modifications par la valeur de lenregistrement dans le gestionnaire dvnement, qui a normalement t corrig. (rrApply ou raCorrect) Ignorer lerreur compltement. (rrIgnore) Cette possibilit nexiste que dans le gestionnaire dvnement OnUpdateError, elle est prvue pour le cas o le gestionnaire dvnement applique la mise jour dans le serveur de la base de donnes. Lenregistrement mis jour est supprim du journal de modifications et fusionn dans Data, comme si le fournisseur avait appliqu la mise jour.
23-28
Guide du dveloppeur
Retirer les modifications de lenregistrement sur lensemble de donnes client, en rappliquant les valeurs initialement fournies. (raCancel) Cette possibilit nexiste que dans le gestionnaire dvnement OnReconcileError. Mettre jour la valeur de lenregistrement en cours en fonction de lenregistrement du serveur. (raRefresh) Cette possibilit nexiste que dans le gestionnaire dvnement OnReconcileError. Le code suivant montre un gestionnaire dvnement OnReconcileError qui utilise la bote de dialogue derreur et de conciliation de lunit RecError prsente dans le rpertoire objrepos. Pour utiliser cette bote de dialogue, ajoutez RecError votre clause uses.
procedure TForm1.ClientDataSetReconcileError(DataSet: TCustomClientDataSet; E: EReconcileError; UpdateKind: TUpdateKind, var Action TReconcileAction); begin Action := HandleReconcileError(DataSet, UpdateKind, E); end;
23-29
23-30
Guide du dveloppeur
contient les fournisseurs locaux (appartenant la mme fiche ou au mme module de donnes) et les fournisseurs distants accessibles par le biais du composant connexion.
Remarque
Si le composant connexion est une instance de TDCOMConnection, le serveur dapplications doit tre recens sur la machine client. A lexcution, vous pouvez passer dun fournisseur lautre (local ou distant) en modifiant la proprit ProviderName dans le code.
Extractions incrmentales
En changeant la proprit PacketRecords, vous pouvez demander que lensemble de donnes client lise les donnes en fragments plus petits. PacketRecords spcifie la quantit denregistrements extraire la fois et le type des enregistrements renvoyer. Par dfaut, PacketRecords vaut -1, ce qui signifie que tous les enregistrements disponibles sont extraits la fois, que ce soit la premire ouverture de lensemble de donnes client ou lorsque lapplication appelle explicitement GetNextPacket. Lorsque PacketRecords vaut -1, lensemble de donnes client nextrait pas de donnes supplmentaires aprs la premire extraction des donnes, car il dispose de tous les enregistrements disponibles. Pour extraire les enregistrements par petits lots, affectez PacketRecords une valeur correspondant au nombre denregistrements voulu. Par exemple, linstruction suivante fixe la taille de chaque paquet de donnes dix enregistrements :
ClientDataSet1.PacketRecords := 10;
Ce processus dextraction denregistrements par petits lots est appel extraction incrmentale. Les ensembles de donnes client utilisent lextraction incrmentale lorsque PacketRecords est suprieur zro. Pour lire chaque lot denregistrements, lensemble de donnes client appelle GetNextPacket. Les paquets extraits sont ajouts la fin des donnes se trouvant dj dans lensemble de donnes client. GetNextPacket renvoie le nombre denregistrements extraits. Si la valeur renvoye est quivalente la valeur de PacketRecords, cest que tous les enregistrements disponibles nont pas t traits. Si la valeur renvoye est suprieure 0 mais infrieure PacketRecords, cest que
23-31
le dernier enregistrement a t atteint durant lopration dextraction. Si GetNextPacket renvoie 0, cest quil ny a plus aucun enregistrement extraire.
Attention
Lextraction incrmentale ne fonctionne pas si les donnes sont extraites dun fournisseur distant situ sur un serveur dapplications sans tat. Voir Gestion des informations dtat dans les modules de donnes distants la page 25-23, pour plus dinformations sur lutilisation de lextraction incrmentale avec les modules de donnes distants sans tat. La proprit PacketRecords peut aussi tre utilise pour extraire des informations mtadonnes sur lensemble de donnes source. Pour extraire des informations mtadonnes, PacketRecords doit valoir 0.
Remarque
Extraction la demande
Lextraction automatique denregistrements est contrle par la proprit FetchOnDemand. Lorsque FetchOnDemand vaut True (la valeur par dfaut), lensemble de donnes client lit automatiquement les enregistrements en fonction des besoins. Pour empcher lextraction automatique des enregistrements, mettez FetchOnDemand False. Si FetchOnDemand est False, lapplication doit appeler explicitement GetNextPacket pour extraire des enregistrements. Par exemple, les applications qui doivent reprsenter des ensembles de donnes trs volumineux accessibles en lecture seulement peuvent dsactiver FetchOnDemand afin que les ensembles de donnes client nessaient pas de charger plus de donnes que la mmoire ne peut en contenir. Entre les extractions, lensemble de donnes client libre sa mmoire cache laide de la mthode EmptyDataSet. Cette approche, toutefois, ne fonctionne pas trs bien lorsque le client doit renvoyer les mises jour au serveur. Le fournisseur contrle si les enregistrements figurant dans les paquets de donnes comprennent des donnes BLOB et des ensembles de donnes dtail imbriqus. Si le fournisseur exclut cette information des enregistrements, la proprit FetchOnDemand oblige lensemble de donnes client extraire automatiquement les donnes BLOB et les ensembles de donnes dtail au fur et mesure des besoins. Si FetchOnDemand vaut False, et si le fournisseur ne contient pas de donnes BLOB ni densembles de donnes dtail avec les enregistrements, vous devez appeler explicitement la mthode FetchBlobs ou FetchDetails pour extraire ces informations.
23-32
Guide du dveloppeur
Les ensembles de donnes client stockent les valeurs des paramtres dans leur proprit Params. Ces valeurs sont rafrachies par des paramtres de sortie quelconques chaque fois que lensemble de donnes client lit les donnes depuis lensemble de donnes source. Il peut cependant exister des cas o un composant TClientDataSet dans une application client a besoin de paramtres de sortie alors quil ne lit pas de donnes. Pour lire des paramtres de sortie sans lire denregistrement, ou pour initialiser des paramtres dentre, lensemble de donnes client peut extraire des valeurs de paramtre de lensemble de donnes source en appelant la mthode FetchParams. Les paramtres sont renvoys dans un paquet de donnes depuis le fournisseur et affects la proprit Params de lensemble de donnes client. A la conception, la proprit Params peut tre initialise en cliquant avec le bouton droit sur lensemble de donnes client et en choisissant Rcuprer les paramtres.
Remarque
Il nest jamais ncessaire dappeler FetchParams lorsque lensemble de donnes client utilise un fournisseur interne et un ensemble de donnes source, car la proprit Params reflte toujours les paramtres de lensemble de donnes source interne. Dans le cas de TClientDataSet, la mthode FetchParams (ou la commande Rcuprer les paramtres) ne fonctionne que si lensemble de donnes client est connect un fournisseur dont lensemble de donnes associ peut fournir des paramtres. Par exemple, si lensemble de donnes source est un ensemble de donnes de type table, il ny a aucun paramtre rcuprer. Si le fournisseur rside sur un systme spar dans le cadre dun serveur dapplications sans tat, vous ne pouvez pas utiliser FetchParams pour extraire des paramtres de sortie. Dans un serveur dapplications sans tat, dautres clients peuvent modifier et r-excuter la requte ou la procdure stocke, en changeant les paramtres de sortie avant lappel de FetchParams. Pour extraire des paramtres de sortie depuis un serveur dapplications sans tat, utilisez la mthode Execute. Si le fournisseur est associ une requte ou une procdure stocke, Execute indique au fournisseur dexcuter la requte ou la procdure stocke et de renvoyer les ventuels paramtres de sortie. Ces paramtres renvoys sont alors utiliss pour mettre automatiquement jour la proprit Params.
23-33
proprit Params dans linspecteur dobjets. Cela appelle lditeur de collection, dans lequel vous pouvez ajouter, supprimer ou rorganiser les paramtres. Lorsque vous slectionnez un paramtre dans lditeur de collection, vous pouvez en modifier les proprits laide de linspecteur dobjets. A lexcution, utilisez la mthode CreateParam de la proprit Params pour ajouter des paramtres votre ensemble de donnes client. CreateParam renvoie un objet paramtre, dot dun nom, dun type de paramtre et dun type de donnes particuliers. Vous pouvez alors utiliser les proprits de cet objet paramtre pour affecter une valeur au paramtre. Par exemple, le code suivant attribue la valeur 605 un paramtre appel CustNo :
with ClientDataSet1.Params.CreateParam(ftInteger, CustNo, ptInput) do AsInteger := 605;
Si lensemble de donnes client nest pas actif, vous pouvez envoyer les paramtres au serveur dapplications et rcuprer un paquet de donnes qui reflte ces valeurs de paramtre en mettant simplement la proprit Active True.
Les noms de paramtres doivent correspondre aux noms des paramtres correspondants dans lensemble de donnes source.
23-34
Guide du dveloppeur
doit se trouver dans un enregistrement pour que celui-ci soit inclus dans les donnes de lensemble client. Cela fonctionne comme un filtre, sauf quavec un filtre, les enregistrements sont encore en mmoire cache mais considrs comme non disponibles. Le nom de chaque paramtre doit correspondre un nom de champ. Lorsque vous utilisez TClientDataSet, ce sont les noms des champs du composant TTable ou TSQLTable associ au fournisseur. Lorsque vous utilisez TSQLClientDataSet ou TBDEClientDataSet, ce sont les noms des champs de la table sur le serveur de base de donnes. Lensemble client ne contient alors que les enregistrements dont les valeurs dans les champs quivalents correspondent celles des paramtres. Par exemple, supposons une application qui affiche les commandes dun seul client. Lorsque lutilisateur identifie le client, lensemble de donnes client dfinit sa proprit Params pour inclure un paramtre unique nomm CustID, dont la valeur identifie le client dont les commandes doivent tre affiches. Quand lensemble de donnes client demande les donnes de lensemble de donnes source, il transmet la valeur de ce paramtre. Le fournisseur nenvoie ensuite que les enregistrements concernant le client identifi. Ceci est beaucoup plus efficace que la solution dans laquelle tous les enregistrements de commande sont envoys par le fournisseur lapplication client puis filtrs laide de lensemble de donnes client.
Seuls les ensembles de donnes qui utilisent le BDE peuvent importer des contraintes partir du serveur. Cela signifie que les contraintes du serveur ne sont incluses dans les paquets de donnes que si vous utilisez TBDEClientDataSet
23-35
ou TClientDataSet avec un fournisseur qui reprsente une base de donnes base sur le BDE. Pour plus dinformations sur la faon dimporter les contraintes du serveur et dempcher un fournisseur de les inclure dans les paquets de donnes, voir Gestion des contraintes du serveur la page 24-15.
Remarque
Pour plus dinformations sur lutilisation des contraintes lorsquelles ont t importes, voir Utilisation des contraintes du serveur la page 19-25. Bien que limportation des contraintes et des expressions du serveur soit une fonctionnalit de grand intrt, qui aide une application prserver lintgrit des donnes, il y a des circonstances o apparat la ncessit de les dsactiver de manire provisoire. Par exemple, si une contrainte du serveur est base sur la valeur maximale en cours dans un champ et si lensemble de donnes client utilise la lecture incrmentale, la valeur maximale en cours dans lensemble de donnes client peut tre diffrente de la valeur maximale sur le serveur de la base de donnes et les contraintes appeles diffremment. Dans un autre cas, si un ensemble de donnes client applique un filtre aux enregistrements quand des contraintes sont actives, ce filtre peut provoquer des interfrences indsirables avec les conditions des contraintes. Dans chacun de ces cas, une application peut dsactiver le contrle des contraintes. Pour dsactiver temporairement les contraintes, appelez la mthode DisableConstraints. A chaque appel de DisableConstraints, un compteur de rfrences est incrment. Tant que la valeur de ce compteur est suprieure zro, les contraintes ne sont pas appliques sur lensemble de donnes client. Pour ractiver les contraintes pour lensemble de donnes client, appelez la mthode EnableConstraints de lensemble de donnes. Chaque appel EnableConstraints dcrmente le compteur de rfrences. Quand ce compteur atteint la valeur zro, les contraintes sont nouveau actives.
Conseil
Appelez toujours DisableConstraints et EnableConstraints dans des blocs apparis pour garantir que les contraintes sont actives quand vous souhaitez quelles le soient.
23-36
Guide du dveloppeur
RefreshRecord. A la diffrence de la mthode Refresh, RefreshRecord ne met jour que lenregistrement en cours dans lensemble de donnes client. RefreshRecord modifie la valeur denregistrement initialement obtenue du fournisseur mais laisse intacts tous les changements contenus dans le journal de modifications.
Attention
Il nest pas appropri dappeler systmatiquement RefreshRecord. Si les modifications de lutilisateur entrent en conflit avec celles apportes lensemble de donnes sous-jacent par dautres utilisateurs, lappel de RefreshRecord masque ce conflit. Lorsque lensemble de donnes client applique ses mises jour, aucune erreur de conciliation ne se produit et lapplication ne peut pas rsoudre le conflit. Pour viter que les erreurs de mise jour ne soient masques, vous pouvez vrifier quaucune mise jour nest en attente avant dappeler RefreshRecord . Par exemple, ci-dessous, AfterScroll rafrachit lenregistrement en cours chaque fois que lutilisateur se dplace sur un nouvel enregistrement (ce qui garantit la valeur la plus rcente), mais seulement lorsquil nest pas dangereux de procder ainsi :
procedure TForm1.ClientDataSet1AfterScroll(DataSet: TDataSet); begin if ClientDataSet1.UpdateStatus = usUnModified then ClientDataSet1.RefreshRecord; end;
1 Lensemble de donnes client reoit un vnement BeforeApplyUpdates, o il spcifie des informations personnalises dans un OleVariant nomm OwnerData. 2 Le fournisseur reoit un vnement BeforeApplyUpdates, o il peut rpondre lOwnerData depuis lensemble de donnes client et mettre jour la valeur de lOwnerData avec les nouvelles informations.
23-37
3 Le fournisseur poursuit son processus normal dassemblage dun paquet de donnes (comprenant tous les vnements qui laccompagnent). 4 Le fournisseur reoit un vnement AfterApplyUpdates, o il peut rpondre la valeur courante de lOwnerData et la mettre jour en lui donnant une valeur pour lensemble de donnes client. 5 Lensemble de donnes client reoit un vnement AfterApplyUpdates, o il peut rpondre la valeur renvoye de lOwnerData.
Les appels aux autres mthodes dIAppServer sont accompagns dun ensemble semblable dvnements BeforeXXX et AfterXXX qui vous permettent de personnaliser la communication entre lensemble de donnes client et son fournisseur. En outre, lensemble de donnes client dispose dune mthode spciale, DataRequest, dont le seul but est de permettre une communication avec le fournisseur spcifique lapplication. Quand lensemble de donnes client appelle DataRequest, il transmet un OleVariant en tant que paramtre pouvant contenir les informations que vous voulez. En retour, est gnr sur le fournisseur lvnement OnDataRequest, o vous pouvez rpondre, de la faon que vous avez dfinie dans lapplication, et renvoyer une valeur lensemble de donnes client.
Ne supprimez jamais poAllowCommandText de la proprit Options de TSQLClientDataSet, de TBDEClientDataSet ou de TIBClientDataSet. La proprit Options de lensemble de donnes client est adresse au fournisseur interne, aussi la suppression de poAllowCommandText empche lensemble de donnes client dindiquer quelles donnes accder.
23-38
Guide du dveloppeur
Utilisation dun ensemble de donnes client avec des donnes bases sur des fichiers
Lensemble de donnes client envoie sa chane CommandText au fournisseur deux moments : Quand lensemble de donnes client est ouvert pour la premire fois. Une fois que le premier paquet de donnes est extrait du fournisseur, lensemble de donnes client nenvoie plus CommandText lorsquil lit les paquets de donnes suivants. Quand lensemble de donnes client envoie une commande Execute au fournisseur. Pour envoyer une commande SQL ou pour changer le nom dune table ou dune procdure stocke un autre moment, vous devez utiliser explicitement linterface IAppServer par le biais de la proprit AppServer. Cette proprit reprsente linterface par laquelle lensemble de donnes client communique avec son fournisseur.
Utilisation dun ensemble de donnes client avec des donnes bases sur des fichiers
Les ensembles de donnes client peuvent fonctionner avec des fichiers sur disque ddis tout comme il le font avec les donnes issues dun serveur. Cela leur permet dtre utiliss dans les applications de bases de donnes de type fichier et les applications modle briefcase. Les fichiers spciaux que les ensembles de donnes client utilisent pour leurs donnes sont appels MyBase.
Conseil
Tous les ensembles de donnes client sont appropris une application du modle briefcase, mais pour une application MyBase pure (une application qui nutilise pas de fournisseur), il est prfrable dutiliser TClientDataSet, car il implique une charge systme minimale. Dans une application MyBase pure, lapplication client ne peut pas obtenir de dfinitions de table ni de donnes du serveur et aucun serveur ne peut recevoir ses mises jour. A la place, lensemble de donnes doit indpendamment : Dfinir et crer les tables Charger les donnes enregistres Fusionner les modifications dans ses donnes Enregistrer les donnes
23-39
Utilisation dun ensemble de donnes client avec des donnes bases sur des fichiers
Vous pouvez copier un ensemble de donnes existant ( la conception ou lexcution). Pour plus dinformations sur la copie des ensembles de donnes existants, voir Copie de donnes dun autre ensemble de donnes la page 23-16. Vous pouvez crer un ensemble de donnes client partir de nimporte quel document XML. Voir Conversion de documents XML en paquets de donnes la page 26-7, pour plus de dtails. Une fois lensemble de donne cr, vous pouvez lenregistrer dans un fichier. A partir de ce moment-l, vous navez plus besoin de recrer la table ; il vous suffit de la charger depuis le fichier que vous avez enregistr. Lorsque vous commencez laborer une application de base de donnes de type fichier, vous pouvez crer et enregistrer des fichiers vides pour vos ensembles de donnes avant dcrire lapplication elle-mme. Ainsi, vous dmarrez en ayant les mtadonnes de votre ensemble de donnes client dj dfinies, ce qui facilite la dfinition de linterface utilisateur.
23-40
Guide du dveloppeur
Utilisation dun ensemble de donnes client avec des donnes bases sur des fichiers
Nappelez pas MergeChangeLog pour les ensembles de donnes client qui utilisent un fournisseur. Dans ce cas, vous devez appeler la mthode ApplyUpdates pour crire les modifications dans la base de donnes. Pour plus dinformations, voir Application des mises jour la page 23-24. Il est galement possible de fusionner les modifications dans les donnes dun ensemble de donnes client spar si ce dernier a initialement fourni les donnes dans la proprit Data. Pour ce faire, vous devez utiliser un fournisseur densembles de donnes. Voir un exemple dans Affectation directe des donnes la page 23-16. Si vous ne souhaitez pas utiliser les capacits D faire fournies par le journal de modifications, vous pouvez dfinir la proprit LogChanges de lensemble de donnes client par False. Lorsque LogChanges vaut False, les modifications sont automatiquement fusionnes lorsque vous postez des enregistrements et il est inutile dappeler MergeChangeLog.
Remarque
23-41
Utilisation dun ensemble de donnes client avec des donnes bases sur des fichiers
Remarque
SaveToFile ne conserve aucun index ajout lensemble de donnes client lexcution, sauf les index ajouts lorsque vous avez cr lensemble de donnes client. Si vous sauvegardez toujours les donnes dans le mme fichier, vous pouvez utiliser la place la proprit FileName. Si FileName est initialise, les donnes sont automatiquement sauvegardes dans le fichier nomm la fermeture de lensemble de donnes client. Vous pouvez aussi sauvegarder les donnes dans un flux laide de la mthode SaveToStream. SaveToStream accepte un paramtre : un objet flux qui reoit les donnes.
Remarque
Si vous sauvegardez un ensemble de donnes client alors que des modifications existent encore dans le journal de modifications, ces modifications ne sont pas fusionnes avec les donnes. Lorsque vous rechargez les donnes laide de la mthode LoadFromFile ou LoadFromStream, le journal de modifications contient toujours les modifications non fusionnes. Ce point est important pour les applications qui supportent le modle briefcase, dans lequel les modifications finissent par tre appliques un composant fournisseur sur le serveur dapplications.
23-42
Guide du dveloppeur
24
Chapitre 24
Chapitre
Les composants fournisseur (TDataSetProvider et TXMLTransformProvider) dfinissent le mcanisme qu utilisent le plus couramment les ensembles de donnes client pour obtenir leurs donnes. Les fournisseurs reoivent les demandes de donnes dun ensemble de donnes client (ou agent XML), extraient les donnes demandes, empaqutent les donnes en un paquet de donnes transportable et renvoient les donnes lensemble de donnes client (ou agent XML). Cette activit est appele fourniture. reoivent les donnes mises jour dun ensemble de donnes client (ou agent XML), appliquent les mises jour au serveur de base de donnes, lensemble de donnes source ou au document XML, et consignent toutes les mises jour inapplicables en renvoyant les mises jour non rsolues lensemble de donnes client en vue dune rgularisation ultrieure. Cette activit est appele rsolution. Lessentiel de lactivit dun composant fournisseur seffectue automatiquement. Vous navez pas besoin dcrire de code dans le fournisseur pour crer les paquets de donnes partir des donnes dun ensemble de donnes ou dun document XML ou pour appliquer les mises jour. Toutefois, les composants fournisseur comprennent une srie dvnements et de proprits qui permettent votre application de contrler plus directement les informations empaquetes pour les clients et la faon dont elle rpond aux requtes client. Lorsque vous utilisez TBDEClientDataSet, TSQLClientDataSet ou TIBClientDataSet, le fournisseur est interne lensemble de donnes client, et lapplication ne peut pas y accder directement. Lorsque vous utilisez TClientDataSet ou TXMLBroker, toutefois, le fournisseur est un composant spar qui vous permet de contrler les informations empaquetes pour les clients et les rponses aux vnements qui se produisent au cours des processus de fourniture et de rsolution. Les ensembles de donnes client qui possdent un fournisseur interne mettent
24-1
disposition une partie des proprits et vnements du fournisseur interne comme leurs propres proprits et vnements mais, pour un contrle maximal, vous pouvez utiliser TClientDataSet avec un composant fournisseur spar. Lorsque vous utilisez un composant fournisseur spar, il peut rsider dans la mme application que lensemble de donnes client (ou agent XML) ou sur un serveur dapplications dans le cadre dune application multiniveau. Ce chapitre dcrit comment utiliser un composant fournisseur pour contrler les interactions avec les ensembles de donnes client ou les agents XML.
24-2
Guide du dveloppeur
24-3
TClientDataSet
ApplyUpdates (mthode), BeforeApplyUpdates (vnement), AfterApplyUpdates (vnement). DataRequest (m thode). Execute (mthode), BeforeExecute (vnement), AfterExecute (vnement). FetchParams (m thode), BeforeGetParams (vnement), AfterGetParams (vnement). Utilis pour crer une liste la conception pour la proprit ProviderName. GetNextPacket (m thode), Data (proprit), BeforeGetRecords (vnement), AfterGetRecords (vnement) FetchBlobs (mthode), FetchDetails (m thode), RefreshRecord (mthode), BeforeRowRequest (vnement), AfterRowRequest (vnement)
AS_ApplyUpdates (mthode)
AS_RowRequest (mthode)
Dtermination du mode dapplication des mises jour laide dun fournisseur densemble de donnes
TXMLTransformProvider appliquent toujours les mises jour au document XML associ. Toutefois, lorsque vous utilisez TDataSetProvider, vous pouvez choisir le mode dapplication des mises jour. Par dfaut, quand les composants TDataSetProvider appliquent les modifications et rsolvent les erreurs de modification, ils communiquent directement avec le serveur de bases de donnes en utilisant des instructions SQL gnres dynamiquement. Cette approche prsente cet avantage que lapplication serveur na pas besoin de fusionner les modifications deux fois (dabord pour lensemble de donnes, puis sur le serveur distant). Cependant, vous pouvez prfrer une autre approche : par exemple, vous pouvez utiliser certains des vnements sur le composant ensemble de donnes. Il se peut aussi que lensemble de donnes utilis ne gre pas lutilisation dinstructions SQL (par exemple, si la fourniture est effectue partir dun composant TClientDataSet ). TDataSetProvider vous laisse dcider si vous souhaitez appliquer les modifications sur le serveur de bases de donnes en utilisant le SQL ou sur lensemble de
24-4
Guide du dveloppeur
donnes source en dfinissant la proprit ResolveToDataSet. Quand cette proprit a la valeur True, les modifications sont appliques lensemble de donnes. Lorsqu elle a pour valeur False, les mises jour sont directement appliques au serveur de bases de donnes sous-jacent.
Ces techniques de contrle du contenu des paquets de donnes sont uniquement disponibles pour les fournisseurs densemble de donnes. Lorsque vous utilisez TXMLTransformProvider, vous pouvez uniquement grer le contenu des paquets de donnes en contrlant le fichier de transformation utilis par le fournisseur.
La ncessit de spcifier suffisamment de champs pour viter des enregistrements en doublon se pose galement lorsque lensemble de donnes source du fournisseur reprsente une requte. Vous devez dfinir la requte de telle sorte quelle comprenne suffisamment de champs pour assurer lunicit de tous les enregistrements, mme si votre application nutilise pas tous les champs.
24-5
poReadOnly poDisableEdits
poDisableInserts
poDisableDeletes
poFetchBlobsOnDemand
poFetchDetailsOnDemand
24-6
Guide du dveloppeur
poIncFieldProps
poCascadeDeletes
poCascadeUpdates
poAllowMultiRecordUpdates
poNoReset
poPropogateChanges
poAllowCommandText
poRetainServerOrder
24-7
les paquets delta envoys par les ensembles de donnes client lors de la mise jour des enregistrements. Dans ce cas, lensemble de donnes client peut ne jamais exploiter ces informations que le fournisseur senvoie lui-mme. Quand vous ajoutez des informations personnalises dans lvnement OnGetDataSetProperties, chaque attribut individuel (appel parfois un paramtre optionnel) est spcifi en utilisant un tableau Variant contenant trois lments : le nom (une chane), la valeur (un Variant) et un indicateur boolen indiquant si les informations doivent tre places dans les paquets delta lorsque le client applique les mises jour. Ajoutez plusieurs attributs en crant un tableau Variant de tableaux Variant. Par exemple, le gestionnaire dvnement OnGetDataSetProperties suivant envoie deux valeurs : lheure laquelle les donnes ont t fournies et le nombre total denregistrements dans lensemble de donnes source. Seule lheure laquelle les donnes ont t fournies est renvoye quand les ensembles de donnes client appliquent les mises jour :
procedure TMyDataModule1.Provider1GetDataSetProperties(Sender: TObject; DataSet: TDataSet; out Properties: OleVariant); begin Properties := VarArrayCreate([0,1], varVariant); Properties[0] := VarArrayOf([TimeProvided, Now, True]); Properties[1] := VarArrayOf([TableSize, DataSet.RecordCount, False]); end;
Quand lensemble de donnes client applique les mises jour, lheure laquelle les enregistrements ont t initialement fournis peut tre lue dans lvnement OnUpdateData du fournisseur :
procedure TMyDataModule1.Provider1UpdateData(Sender: TObject; DataSet: TCustomClientDataSet); var WhenProvided: TDateTime; begin WhenProvided := DataSet.GetOptionalParam(TimeProvided); ... end;
24-8
Guide du dveloppeur
Pour modifier le paquet de donnes avant de lenvoyer au client, crivez un gestionnaire de lvnement OnGetData. Les gestionnaires dvnement OnGetData transmettent le paquet de donnes comme paramtre sous la forme dun ensemble de donnes client. En utilisant les mthodes de lensemble de donnes client, vous pouvez modifier les donnes avant de les expdier au client. Comme tous les appels de mthode effectu s via linterface IAppServer, le fournisseur peut communiquer des informations dtat persistantes un ensemble de donnes client avant et aprs lappel de GetRecords. Cette communication seffectue en utilisant les gestionnaires dvnements BeforeGetRecords et AfterGetRecords. Pour davantage dinformations sur la persistance dinformations dtat dans les serveurs dapplications, voir Gestion des informations dtat dans les modules de donnes distants la page 25-23.
24-9
Les erreurs de mise jour peuvent tre traites par le fournisseur densemble de donnes ou lensemble de donnes client. Lorsque le fournisseur fait partie dune application multiniveau, il doit grer toutes les erreurs de mise jour qui ne ncessitent pas dinteraction avec lutilisateur pour tre rsolues. Quand le fournisseur ne peut rsoudre une condition derreur, il stocke une copie temporaire de lenregistrement posant problme. Quand le traitement des enregistrements est termin, le fournisseur renvoie lensemble de donnes client le nombre derreurs ayant eu lieu et copie les enregistrements non rsolus dans un paquet de donnes rsultat quil renvoie lensemble de donnes client pour que celui-ci termine la rconciliation. Les gestionnaires dvnements de tous les vnements du fournisseur reoivent les mises jour sous la forme dun ensemble de donnes client. Si le gestionnaire dvnement ne traite que certains types de mise jour, vous pouvez filtrer lensemble de donnes en vous basant sur le type de mise jour des enregistrements. Le filtrage des enregistrements vite au gestionnaire dvnement de parcourir des enregistrements quil nutilise pas. Pour filtrer lensemble de donnes client daprs le type de mise jour de ses enregistrements, dfinissez sa proprit StatusFilter.
Remarque
Les applications doivent proposer des fonctions supplmentaires quand les mises jour sont diriges vers un ensemble de donnes qui reprsente plusieurs tables. Pour des dtails sur la manire de procder, voir Application des mises jour des ensembles de donnes reprsentant plusieurs tables la page 24-13.
24-10
Guide du dveloppeur
Le gestionnaire dvnement OnUpdateData suivant insre la date en cours dans chaque nouvel enregistrement insr dans la base de donnes :
procedure TMyDataModule1.Provider1UpdateData(Sender: TObject; DataSet: TCustomClientDataSet); begin with DataSet do begin First; while not Eof do begin if UpdateStatus = usInserted then begin Edit; FieldByName(DateCreated).AsDateTime := Date; Post; end; Next; end; end;
Si vous ne spcifiez pas le contraire, tous les champs des enregistrements du paquet delta sont utiliss dans les clauses UPDATE et WHERE. Vous pouvez nanmoins exclure certains champs. Vous pouvez le faire en utilisant la proprit UpdateMode du fournisseur. UpdateMode peut prendre lune des valeurs suivantes :
Tableau 24.4 Valeur
upWhereAll upWhereChanged upWhereKeyOnly
24-11
Vous pouvez avoir besoin dun contrle encore plus prcis. Par exemple, dans linstruction prcdente, vous pouvez empcher que le champ EMPNO ne soit modifi en le retirant de la clause UPDATE et enlever les champs TITLE et DEPT de la clause WHERE pour empcher des conflits de mise jour quand dautres applications ont modifi les donnes. Pour sp cifier la clause dans laquelle un champ spcifique apparat, utilisez la proprit ProviderFlags. ProviderFlags est un ensemble qui peut inclure les valeurs du tableau suivant :
Tableau 24.5 Valeur
pfInWhere
Par exemple, le gestionnaire dvnement OnUpdateData suivant permet au champ TITLE dtre mis jour et utilise les champs EMPNO et DEPT pour rechercher lenregistrement dsir. Si une erreur se produit et quune seconde tentative de recherche est effectue uniquement base sur la cl, linstruction SQL gnre recherche uniquement le champ EMPNO :
procedure TMyDataModule1.Provider1UpdateData(Sender: TObject; DataSet: TCustomClientDataSet); begin with DataSet do begin FieldByName(TITLE).ProviderFlags := [pfInUpdate]; FieldByName(EMPNO).ProviderFlags := [pfInWhere, pfInKey]; FieldByName(DEPT).ProviderFlags := [pfInWhere]; end; end; Remarque
Vous pouvez utiliser la proprit UpdateFlags pour contrler comment les mises jour sont appliques mme si vous actualisez un ensemble de donnes sans utiliser dinstructions SQL gnres dynamiquement. Ces indicateurs indiquent quand mme les champs utiliss pour rechercher des enregistrements et les champs actualiss.
24-12
Guide du dveloppeur
quand il teste les conflits de mise jour. Si vous voulez tester les erreurs de mise jour concernant des champs BLOB, vous pouvez utiliser lvnement BeforeUpdateRecord. Vous pouvez galement utiliser cet vnement pour appliquer vous-mme les mises jour ou pour filtrer et rejeter les mises jour. Le gestionnaire dvnement BeforeUpdateRecord vous permet de signaler quune mise jour a dj t gre et quelle ne doit pas tre applique. Le fournisseur passe cet enregistrement sans le considrer comme une erreur de mise jour. Cet vnement vous permet dappliquer les mises jour dans une procdure stocke (qui ne peut tre mise jour automatiquement), en permettant au fournisseur de ne pas effectuer le traitement automatique une fois lenregistrement mis jour dans le gestionnaire dvnement.
Application des mises jour des ensembles de donnes reprsentant plusieurs tables
Quand un fournisseur densemble de donnes gnre des instructions SQL qui appliquent directement les mises jour dans un serveur de bases de donnes, il lui faut le nom de la table de la base de donnes qui contient les enregistrements. Cela peut tre automatiquement gr pour de nombreux
24-13
ensembles de donnes tels que les ensembles de donnes de type table ou les composants TQuery dynamiques. Toutefois, les mises jour automatiques reprsentent un problme dans le cas o le fournisseur doit appliquer les mises jour aux donnes sous-jacentes une procdure stocke renvoyant un ensemble de rsultats ou une requte multitable. Il nest pas vident de dterminer le nom de la table dans laquelle appliquer les mises jour. Si la requte ou procdure stocke est un ensemble de donnes BDE (TQuery ou TStoredProc) et quelle possde un objet mise jour associ, le fournisseur utilise cet objet. Toutefois, en labsence dobjet mise jour, vous devez spcifier le nom de la table par code dans un gestionnaire dvnement OnGetTableName. Quand ce gestionnaire dvnement a indiqu un nom de table, le fournisseur peut gnrer les instructions SQL appropries pour appliquer les mises jour. La solution consistant fournir le nom de la table ne fonctionne que si les mises jour doivent tre appliqu es une seule table de base de donnes (sil suffit de modifier les enregistrements dune seule table). Si la mise jour ncessite la modification de plusieurs tables de la base de donnes, vous devez explicitement appliquer les mises jour en utilisant lvnement BeforeUpdateRecord du fournisseur. Quand ce gestionnaire dvnement a appliqu une mise jour, vous devez initialiser son paramtre Applied True afin que le fournisseur ne gnre pas une erreur.
Remarque
Si le fournisseur est associ un ensemble de donnes BDE, vous pouvez utiliser un objet mise jour dans le gestionnaire dvnement BeforeUpdateRecord pour appliquer les mises jour laide dinstructions SQL personnalises. Voir Utilisation dobjets mise jour pour mettre jour un ensemble de donnes la page 20-45, pour plus de dtails.
24-14
Guide du dveloppeur
Cette liste nest pas exhaustive. Votre serveur de bases de donnes peut grer certaines ou toutes les contraintes prcdentes, ainsi que dautres. Pour davantage dinformations sur les contraintes quil gre, consultez la documentation de votre serveur. Les contraintes dun serveur de base de donnes prennent la place de nombreuses vrifications effectues auparavant par les applications classiques de bases de donnes de bureau. Vous pouvez tirer profit des contraintes dfinies par le serveur dans vos applications de bases de donnes multiniveaux sans avoir reproduire les contraintes dans le code du serveur dapplications ou dans celui de lapplication client. Si le fournisseur utilise un ensemble de donnes BDE, la proprit Constraints vous permet de reproduire et dappliquer les contraintes du serveur aux donnes transmises ou reues par les applications client. Si Constraints a la valeur True (cas par dfaut), les contraintes du serveur stockes dans lensemble de donnes source figurent dans les paquets de donnes et affectent les tentatives de modification des donnes par les clients.
Important
Avant que le fournisseur ne puisse transfrer aux ensembles de donnes client les informations relatives aux contraintes, il doit lire ces informations sur le serveur de bases de donnes. Pour importer les contraintes de bases de donnes du serveur, utilisez lexplorateur SQL pour importer les contraintes du serveur de base de donnes et les expressions par dfaut dans le dictionnaire de donnes. Les contraintes et les expressions par dfaut du dictionnaire de donnes sont automatiquement proposes aux ensembles de donnes BDE.
24-15
Il est parfois ncessaire de ne pas appliquer les contraintes du serveur aux donnes envoyes un ensemble de donnes client. Ainsi quand un ensemble de donnes client reoit les donnes en paquets et autorise la modification locale des donnes avant la lecture de tous les enregistrements, il peut tre ncessaire de dsactiver certaines des contraintes du serveur qui risquent dtre dclenches cause dun ensemble de donnes temporairement incomplet. Pour empcher la rplication des contraintes du fournisseur par lensemble de donnes client, affectez la valeur False Constraints. De toute faon, les ensembles de donnes client peuvent dsactiver ou activer les contraintes en utilisant les mthodes DisableConstraints et EnableConstraints. Pour davantage dinformations sur lactivation et la dsactivation des contraintes par les ensembles de donnes client, voir Gestion des contraintes lies au serveur la page 23-35.
24-16
Guide du dveloppeur
25
Chapitre 25
Chapitre
Ce chapitre dcrit la cration dune application de base de donnes client/ serveur multiniveau. Une application client/serveur multiniveau est partitionne en units logiques, appeles niveaux, dont les diffrentes units fonctionnent en coordination les unes avec les autres sur des machines spares. Les applications multiniveaux partagent des donnes et communiquent par un rseau local voire mme par Internet. Elles offrent de nombreux avantages, comme les applications clients simples et la logique dentreprise centralise. Dans sa forme la plus simple, parfois appele modle niveau triple, une application multiniveau est partitionne en trois niveaux : une application client : elle fournit une interface utilisateur sur la machine de lutilisateur ; un serveur dapplications : il rside dans un emplacement central du rseau, accessible tous les clients, et offre des services de donnes courants ; un serveur de bases de donnes distant : il supporte le systme de gestion de base de donnes relationnelles (SGBDR). Dans ce modle niveau triple, le serveur dapplications gre les flux de donnes entre les clients et le serveur de base de donnes distant ; il est donc parfois dnomm courtier ou broker de donnes . Avec Delphi, on ne cre gnralement que le serveur dapplications et ses clients, bien que, si vous tes rellement ambitieux, vous puissiez crer galement votre propre dorsal de base de donnes. Dans les applications multiniveaux plus complexes, les services supplmentaires se situent entre un client et un serveur de base de donnes distant. Vous pouvez, par exemple, disposer dun courtier de services de scurit pour prendre en charge la scurit des transactions Internet ou de services de pont pour prendre en charge le partage de donnes avec des bases de donnes rsidant sur dautres plates-formes.
25-1
Le support Delphi pour le dveloppement des applications multiniveaux tend la faon dont les ensembles de donnes client communiquent avec un composant fournisseur laide de paquets de donnes transportables. Ce chapitre se focalise sur la cration dune application de bases de donnes niveau triple. Quand vous savez crer et grer une application niveau triple, vous pouvez crer et ajouter des couches de services supplmentaires en fonction de vos besoins.
25-2
Guide du dveloppeur
Composants connexion
Les composants fournisseur et ensemble de donnes client requirent midas.dll ou midaslib.dcu, qui gre les ensembles de donnes stocks sous forme de paquets de donnes. (Etant donn que le fournisseur est utilis sur le serveur dapplications et que lensemble de donnes client est utilis sur lapplication client, si vous utilisez midas.dll, vous devez le dployer la fois sur lapplication serveur et sur lapplication client.) Si vous utilisez des ensembles de donnes BDE, le serveur dapplications peut ncessiter lexplorateur SQL qui facilite la gestion des bases de donnes et qui permet dimporter les contraintes serveur dans le dictionnaire des donnes, de sorte quelles peuvent tre contrles nimporte quel niveau dune application multiniveau.
Remarque
Vous devez acqurir des licences serveur pour dployer vos applications. Larchitecture qui accueille ces composants est dcrite dans Utilisation dune architecture multiniveau la page 14-15.
25-3
1 Un utilisateur dmarre lapplication client. Le client se connecte au serveur dapplications (qui peut tre spcifi lors de la conception ou lors de lexcution). Si le serveur dapplications nest pas dj en fonctionnement, il dmarre. Le client reoit une interface IAppServer du serveur dapplications. 2 Le client demande des donnes au serveur dapplications. Un client peut demander toutes les donnes la fois ou bien demander les donnes par fragments durant la session (extraction sur demande). 3 Le serveur dapplications rcupre les donnes (si ncessaire, en tablissant dabord une connexion avec la base de donnes), les empaquette pour le client puis renvoie un paquet de donnes au client. D autres informations (par exemple, les caractristiques de laffichage des champs) peuvent tre incluses dans les mtadonnes du paquet de donnes. Ce processus dempaquetage des donnes est appel fourniture. 4 Le client dcode le paquet de donnes et affiche les donnes lutilisateur. 5 Pendant que lutilisateur interagit avec lapplication client, les donnes sont mises jour (des enregistrements sont ajouts, supprims ou modifis). Ces modifications sont stockes par le client dans un journal de modifications. 6 Le client applique ensuite les mises jour au serveur dapplications, gnralement en rponse une action de lutilisateur. Pour appliquer les mises jour, le client empaquette son journal des modifications et le transmet en tant que paquet de donnes au serveur. 7 Le serveur dapplications dcode le paquet et met les mises jour (dans le contexte dune transaction, le cas chant). Si un enregistrement ne peut pas tre valid (par exemple parce quune autre application a modifi lenregistrement aprs que le client la demand et avant que le client nait appliqu ses mises jour), le serveur dapplications essaie de rgulariser les modifications du client avec les donnes courantes ou enregistre les enregistrements qui nont pu tre valids. Cette opration de validation des enregistrements et de sauvegarde des enregistrements problme est dnomme rsolution. 8 Aprs lopration de rsolution, le serveur dapplications renvoie au client les enregistrements non transmis pour rsolution ultrieure. 9 Le client rgularise les enregistrements non rsolus. Cela peut seffectuer de plusieurs manires. Le client tente habituellement de remdier la situation qui a empch la validation des enregistrements ou bien annule les changements. Si lerreur peut tre corrige, le client applique de nouveau les mises jour. 10 Le client rafrachit ses donnes partir du serveur.
25-4
Guide du dveloppeur
Remarque
Delphi comprend galement un composant connexion qui ne se connecte pas un serveur dapplications mais qui fournit une interface IAppServer aux ensembles de donnes client afin quils puissent communiquer avec les fournisseurs dans la mme application. Ce composant, TLocalConnection, nest pas requis mais facilite lvolution ultrieure vers une application multiniveau. Pour plus dinformations sur lutilisation des composants connexion, voir Connexion au serveur dapplications la page 25-27.
25-5
client utilise son composant connexion pour tablir une connexion avec le serveur dapplications, qu il utilise pour communiquer avec son fournisseur slectionn. Tout ce processus est automatique et vous navez pas besoin dcrire du code pour grer les requtes entrantes, ni pour fournir les interfaces. Un serveur dapplications repose sur un module de donnes distant, module de donnes spcialis qui gre linterface IAppServer. Les applications client utilisent linterface IAppServer pour communiquer avec les fournisseurs sur le serveur dapplications. Il existe quatre types de modules de donnes distants : TRemoteDataModule : il sagit dun serveur Automation double interface. Utilisez ce type de module de donnes distant si les clients utilisent DCOM, HTTP, sockets ou OLE pour se connecter au serveur dapplications, sauf si vous souhaitez installer le serveur dapplications avec MTS. TMTSDataModule : il sagit dun serveur Automation double interface. Utilisez ce type de module de donnes distant si vous crez le serveur dapplications en tant que bibliothque active (.DLL) installe avec MTS ou COM+. Vous pouvez utiliser des modules de donnes distants MTS avec DCOM, HTTP, sockets ou OLE. TCorbaDataModule : il sagit dun serveur CORBA. Utilisez ce type de module de donnes distant pour fournir des donnes aux clients CORBA. TSoapDataModule : il sagit dun module de donnes qui implmente un descendant de IAppServer comme interface invocable dans une application service Web. Utilisez ce type de module de donnes distant pour fournir des donnes aux clients accdant aux donnes en tant que service Web. Si le serveur dapplications doit tre dploy sur MTS ou COM+, le module de donnes distant contient des vnements pour lactivation et la dsactivation du serveur dapplications. Cela lui permet dacqurir des connexions de bases de donnes quand il est activ et de les librer quand il est dsactiv.
25-6
Guide du dveloppeur
fournisseur densemble de donnes rassemble les donnes en paquets de donnes qui sont envoys aux ensembles de donnes client et applique les mises jour reues des ensembles de donnes client un ensemble de donnes source ou un serveur de bases de donnes. Pour plus dinformations sur les fournisseurs densemble de donnes, voir chapitre 24, Utilisation des composants fournisseur. Pour chaque document XML que le module de donnes distant expose aux clients, il doit comprendre un fournisseur XML. Un fournisseur XML se comporte comme un fournisseur densemble de donnes, la diffrence quil rcupre les donnes dun document XML et les applique celui-ci, au lieu dutiliser un serveur de bases de donnes. Pour plus dinformations sur les fournisseurs XML, voir Utilisation dun document XML comme source pour un fournisseur la page 26-9.
Remarque
Ne confondez pas les composants connexion de base de donnes, qui connectent les bases de donnes un serveur de bases de donnes, avec les composants connexion utiliss par les applications client dune application multiniveau. Les composants connexion des applications multiniveaux sont disponibles sur la page DataSnap de la palette de composants.
25-7
dinformations sur le regroupement des handles de bases de donnes, voir Fournisseurs de ressources base de donnes la page 39-6. Transactions. Lorsque vous utilisez un module de donnes transactionnel, vous pouvez proposer une gestion amliore des transactions ne se limitant pas une seule connexion de base de donnes. Des modules de donnes transactionnels peuvent participer des transactions recouvrant plusieurs bases de donnes ou contenir des fonctions qui nimpliquent aucune base de donnes. Pour davantage dinformations sur la gestion des transactions propose par les objets transactionnels, voir Gestion des transactions dans les applications multiniveaux la page 25-21. Activation juste temps et dsactivation ds que possible. Vous pouvez crire votre serveur de sorte que les instances du module de donnes distant soient actives et dsactives en fonction des besoins. Lorsque vous utilisez lactivation juste temps et la dsactivation ds que possible, votre module de donnes distant est instanci uniquement lorsquil est requis pour traiter des requtes client. Cela lui vite de mobiliser des ressources inutilises comme les handles de bases de donnes. Lutilisation de lactivation juste temps et de la dsactivation ds que possible offre un juste milieux entre le routage de tous les clients par le biais dune seule instance du module de donnes distant et la cration dune instance pour chaque connexion client. Avec une seule instance du module de donnes distant, le serveur dapplications doit traiter tous les appels de bases de donnes par le biais dune seule connexion de base de donnes. Cela aboutit un goulet dtranglement et peut pnaliser les performances sil y a trop de clients. Avec plusieurs instances du module de donnes distant, chaque instance peut grer une connexion de base de donnes, ce qui vite de srialiser les accs aux bases de donnes. Toutefois, cela monopolise les ressources car les autres clients ne peuvent pas utiliser la connexion la base de donnes tant quelle est associe au module de donnes distant dun client. Pour tirer parti des transactions, de lactivation juste temps et de la dsactivation ds que possible, les instances du module de donnes distant doivent tre sans tat. Cela signifie que vous devez fournir plus de support lorsque votre client utilise des informations dtat. Par exemple, le client doit passer les informations sur lenregistrement en cours lors des lectures incrmentales. Pour plus de renseignements sur les informations dtat et les modules de donnes distants dans les applications multiniveaux, voir Gestion des informations dtat dans les modules de donnes distants la page 25-23. Par dfaut, tous les appels un module de donnes transactionnel gnrs automatiquement sont transactionnels (ils supposent qu la fin de lappel le module de donnes peut tre dsactiv et que toutes les transactions en cours ventuelles peuvent tre valides (commit) ou annules (rollback). Vous pouvez crire un module de donnes transactionnel dpendant dinformations dtat persistantes en initialisant False la proprit AutoComplete, mais il ne supportera pas les transactions, ni lactivation juste temps, ni la dsactivation ds que possible moins dutiliser une interface personnalise.
25-8
Guide du dveloppeur
Attention
Les serveurs dapplications utilisant des modules de donnes transactionnels ne doivent pas ouvrir de connexions de bases de donnes avant lactivation du module de donnes. Pendant le dveloppement de votre application, assurezvous que tous les ensembles de donnes sont inactifs et que la base de donnes nest pas connecte avant lexcution de votre application. Dans lapplication ellemme, vous devez ajouter du code pour ouvrir les connexions de bases de donnes lors de lactivation du module de donnes et pour les fermer lors de sa dsactivation.
25-9
ScktSrvr.exe peut sexcuter en tant quapplication de service NT. Recensez-le dans le gestionnaire de services en le lanant avec loption en ligne de commande -install. Vous pouvez le drecenser avec loption en ligne de commande -uninstall. Avant de pouvoir utiliser une connexion socket, le serveur dapplications doit recenser sa disponibilit pour les clients utilisant une connexion socket. Par dfaut, tous les nouveaux modules de donnes distants se recensent eux-mmes en ajoutant un appel de la mthode EnableSocketTransport dans la mthode
25-10
Guide du dveloppeur
UpdateRegistry. Vous pouvez retirer cet appel pour empcher les connexions de socket votre serveur dapplications.
Remarque
Des serveurs plus anciens najoutant pas ce recensement, vous pouvez dsactiver la vrification que le serveur dapplications est recens en dslectionnant dans ScktSrvr.exe llment de menu Connexions|Objets recenss seulement. Tant quil na pas libr une rfrence aux interfaces sur le serveur dapplications, le protocole Sockets noffre aucune protection sur le serveur contre les dfaillances systme client. Tout en gnrant moins de trafic de messages que DCOM (qui envoie priodiquement des messages), lutilisation de Sockets peut aboutir la situation dans laquelle un serveur dapplications, non conscient de la dconnexion du client, ne libre pas ses ressources.
25-11
Au contraire de ce qui se passe avec la plupart des autres composants connexion, vous ne pouvez pas utiliser de rappels lorsque la connexion a t tablie via HTTP.
1 Crez le serveur dapplications. 2 Recensez ou installez le serveur dapplications. 3 Crez une application client.
Lordre de cration est important. Vous devez crer et excuter le serveur dapplications avant de crer un client. Lors de la conception, vous pouvez alors vous connecter au serveur dapplications pour tester votre client. Vous pouvez, bien entendu, crer un client sans spcifier le serveur dapplications lors de la conception et nindiquer le nom du serveur qu lexcution, mais cela ne vous
25-12
Guide du dveloppeur
permet pas de voir si votre application fonctionne correctement et vous ne pourrez pas choisir les serveurs et les fournisseurs laide de linspecteur dobjets.
Remarque
Si vous ne crez pas lapplication client sur le mme systme que le serveur, et si vous nutilisez pas une connexion DCOM, vous pouvez recenser le serveur dapplications sur le systme client. Ainsi, le composant connexion dtecte le serveur dapplications la conception, ce qui vous permet de choisir des noms de serveur et de fournisseur partir dune liste droulante de linspecteur dobjets. Si vous utilisez une connexion Web, SOAP ou socket, le composant connexion lit le nom des serveurs recenss sur la machine serveur.
2 Ajoutez un nouveau module de donnes distant au projet. Dans le menu principal, choisissez Fichier|Nouveau|Autre et, dans la page Multiniveaux de la bote de dialogue Nouveaux lments, slectionnez
Module de donnes distant si vous crez un serveur COM Automation auxquels les clients peuvent accder laide de DCOM, HTTP, Sockets ou OLEnterprise ; Module de donnes transactionnel si vous crez un module de donnes distant excut dans MTS ou COM+. Les connexions peuvent tre tablies laide de DCOM, HTTP ou de sockets. Mais seul DCOM gre les services de scurit. Module de donnes CORBA si vous crez un serveur CORBA. Module de donnes SOAP si vous crez un serveur SOAP dans une application service Web. Pour plus de dtails sur la configuration dun module de donnes distant, voir Configuration du module de donnes distant la page 25-15.
25-13
Remarque
Les modules de donnes distants sont plus que de simples modules de donnes. Le module de donnes CORBA fait office de serveur CORBA. Le module de donnes SOAP implmente une interface invocable dans une application service Web. Les autres modules de donnes sont des objets COM Automation.
3 Placez sur le module de donnes les composants ensemble de donnes appropris, et configurez-les pour accder au serveur de base de donnes. 4 Placez sur le module de donnes un composant TDataSetProvider pour chaque ensemble de donnes. Ce fournisseur est ncessaire au courtage des demandes client et lempaquetage des donnes. Attribuez la proprit DataSet de chaque composant fournisseur le nom de lensemble de donnes devant tre accessible. Vous pouvez dfinir dautres proprits pour le fournisseur. Voir chapitre 24, Utilisation des composants fournisseur, pour plus de dtails sur la configuration dun fournisseur.
Si vous manipulez des donnes de documents XML, vous pouvez utiliser un composant TXMLTransformProvider au lieu dun ensemble de donnes et du composant TDataSetProvider. Lorsque vous utilisez TXMLTransformProvider, dfinissez la proprit XMLDataFile afin de spcifier le document XML dont proviennent les donnes et auquel les mises jour sont appliqu es.
5 Ecrivez du code pour le serveur dapplications afin dimplmenter les vnements, les rgles dentreprise partag es, les validations de donnes partages et la scurit partage. Lorsque vous crivez ce code, vous pouvez
Etendre linterface du serveur dapplications afin doffrir lapplication client dautres possibilits pour appeler le serveur. Lextension de linterface du serveur dapplications est dcrite dans Extension de linterface du serveur dapplications la page 25-19. Fournir une gestion des transactions au-del des transactions automatiquement cres lorsque les mises jour sont appliques. La gestion des transactions dans les applications de bases de donnes multiniveaux est dcrite dans Gestion des transactions dans les applications multiniveaux la page 25-21. Crer des relations matre / dtail entre les ensembles de donnes de votre serveur dapplications. Les relations matre / dtail sont dcrites dans Gestion des relations matre / dtail la page 25-22. Faire en sorte que votre serveur dapplications soit sans tat. La gestion des informations dtat est dcrite dans Gestion des informations dtat dans les modules de donnes distants la page 25-23. Diviser votre serveur dapplications en plusieurs modules de donnes distants. Lutilisation de plusieurs modules de donnes distants est dcrite dans Utilisation de plusieurs modules de donnes distants la page 25-24.
6 Enregistrez, compilez et recensez ou installez le serveur dapplications. Le recensement dun serveur dapplications est dcrit dans Recensement du serveur dapplications la page 25-25.
25-14
Guide du dveloppeur
7 Si votre serveur dapplications nutilise pas DCOM ou SOAP, vous devez installer le logiciel runtime qui reoit les messages client, instancie le module de donnes distant et trie les appels dinterface.
Pour le protocole TCP/IP Sockets, il sagit dune application de rpartition de sockets, Scktsrvr.exe. Pour les connexions HTTP, il sagit de httpsrvr.dll, une dll ISAPI/NSAPI qui doit tre installe avec votre serveur Web. Pour CORBA, il sagit du VisiBroker ORB.
Configuration de TRemoteDataModule
Pour ajouter un composant TRemoteDataModule dans votre application, choisissez Fichier|Nouveau|Autre et slectionnez Module de donnes distant dans la page Multi-niveaux de la bote de dialogue Nouveaux lments. Lexpert Module de donnes distant apparat. Vous devez fournir un nom de classe pour votre module de donnes distant. Il sagit du nom de base dun descendant de TRemoteDataModule que votre application cre. Il sagit aussi du nom de base de linterface de cette classe. Par exemple, si vous spcifiez le nom de classe MyDataServer, lexpert cre une nouvelle unit en dclarant TMyDataServer, un descendant de TRemoteDataModule, qui implmente IMyDataServer, un descendant de IAppServer.
Remarque
Vous pouvez ajouter vos propres proprits et mthodes la nouvelle interface. Pour plus dinformations, voir Extension de linterface du serveur dapplications la page 25-19. Vous devez spcifier le modle threading dans lexpert Module de donnes distant. Vous pouvez choisir Thread Unique, Thread Appartement, Thread Libre ou Les deux. Si vous choisissez Thread Unique, COM fait en sorte quune seule requte client soit traite un moment donn. Aucune requte client ne peut entrer en conflit avec une autre. Si vous choisissez Thread Appartement, COM fait en sorte que toute instance de votre module de donnes distant traite une seule requte un moment donn. Lorsque vous crivez du code dans une bibliothque Thread Appartement, vous devez prvenir les conflits de thread si vous utilisez des variables globales ou des objets non contenus dans le module de donnes distant. Cest le modle recommand si vous utilisez des ensembles de donnes BDE. (Veuillez noter que vous aurez besoin dun composant session
25-15
dont la proprit AutoSessionName vaut True pour grer les problmes de threading sur les ensembles de donnes BDE.) Si vous choisissez Thread Libre, votre application peut recevoir des requtes client simultanes sur plusieurs threads. Vous devez faire en sorte que votre application soit compatible avec les threads. Comme plusieurs clients peuvent simultanment accder votre module de donnes distant, vous devez protger vos donnes dinstance (proprits, objets contenus, etc.) ainsi que les variables globales. Cest le modle recommand si vous utilisez des ensembles de donnes ADO. Si vous choisissez Les deux, votre bibliothque fonctionne de la mme faon que lorsque vous choisissez Thread Libre, la diffrence que tous les rappels (appels vers les interfaces client) sont automatiquement srialiss. Si vous choisissez Neutre, le module de donnes distant peut recevoir des appels simultans dans des threads spars, comme dans le modle Thread Libre, mais COM sassure quil ny a pas deux threads accdant la mme mthode au mme moment. Si vous crez un fichier .EXE, vous devez galement spcifier le type dinstanciation utiliser. Vous pouvez choisir Instance unique ou Instance multiple (linstanciation interne ne sapplique que si le code client fait partie du mme espace de processus.) Si vous choisissez Instance unique, chaque connexion client lance sa propre instance du fichier excutable. Ce processus instancie une seule instance du module de donnes distant, qui est ddi la connexion client. Si vous choisissez Instance multiple, une seule instance de lapplication (processus) instancie tous les modules de donnes distants crs pour les clients. Chaque module de donnes distant est ddi une seule connexion client, mais ils partagent tous le mme espace de processus.
Configuration de TMTSDataModule
Pour ajouter un composant TMTSDataModule dans votre application, choisissez Fichier|Nouveau|Autre et slectionnez Module de donnes transactionnel dans la page Multi-niveaux de la bote de dialogue Nouveaux lments. Lexpert Module de donnes transactionnel apparat. Vous devez fournir un nom de classe pour votre module de donnes distant. Il sagit du nom de base dun descendant de TMTSDataModule que votre application cre. Il sagit aussi du nom de base de linterface de cette classe. Par exemple, si vous spcifiez le nom de classe MyDataServer, lexpert cre une nouvelle unit en dclarant TMyDataServer, un descendant de TMTSDataModule, qui implmente IMyDataServer, un descendant de IAppServer.
Remarque
Vous pouvez ajouter vos propres proprits et mthodes votre nouvelle interface. Pour plus dinformations, voir Extension de linterface du serveur dapplications la page 25-19. Vous devez spcifier le modle threading dans lexpert Module de donnes transactionnel. Choisissez Unique, Appartement ou Les deux.
25-16
Guide du dveloppeur
Si vous choisissez Unique, les requtes client sont srialises afin que lapplication nen traite quune seule la fois. Aucune requ te client ne peut entrer en conflit avec une autre. Si vous choisissez Appartement, le systme fait en sorte que toute instance de votre module de donnes distant traite une seule requ te un moment donn ; les appels utilisent toujours le mme thread. Vous devez prvenir les conflits de thread si vous utilisez des variables globales ou des objets non contenus dans le module de donnes distant. Au lieu dutiliser des variables globales, vous pouvez utiliser le gestionnaire de proprits partages. Pour plus dinformations sur le gestionnaire de proprits partages, voir Gestionnaire de proprits partages la page 39-7. Si vous choisissez Les deux, MTS appelle linterface du module de donnes distant de la mme faon que lorsque vous choisissez Appartement. Toutefois, tous les rappels raliss en direction des applications clients sont automatiquement srialiss afin quaucun nentre en conflit avec un autre.
Remarque
Le modle Appartement sous MTS ou COM + est diffrent du modle correspondant sous DCOM. Vous devez aussi spcifier les attributs des transactions de votre module de donnes distant. Vous pouvez choisir parmi les options suivantes : Requiert une transaction. Lorsque vous slectionnez cette option, chaque fois quun client utilise linterface de votre module de donnes distant, lappel est excut dans le contexte dune transaction. Si lappelant fournit une transaction, il est inutile quune nouvelle transaction soit cre. Requiert une nouvelle transaction. Lorsque vous slectionnez cette option, chaque fois quun client utilise linterface de votre module de donnes distant, une nouvelle transaction est automatiquement cre pour lappel. Supporte les transactions. Lorsque vous slectionnez cette option, votre module de donnes distant peut tre utilis dans le contexte dune transaction, mais lappelant doit fournir la transaction lorsquil appelle linterface. Ne supporte pas les transactions. Lorsque vous slectionnez cette option, votre module de donnes distant ne peut pas tre utilis dans le contexte de transactions.
Configuration de TSoapDataModule
Pour ajouter un composant TSoapDataModule dans votre application, choisissez Fichier|Nouveau|Autre et slectionnez Module de donnes SOAP dans la page Multi-niveaux de la bote de dialogue Nouveaux lments. Lexpert Module de donnes SOAP apparat. Vous devez fournir un nom de classe pour votre module de donnes SOAP. Il sagit du nom de base dun descendant de TSoapDataModule que votre application cre. Il sagit aussi du nom de base de linterface de cette classe. Par exemple, si vous spcifiez le nom de classe MyDataServer, lexpert cre une nouvelle unit en dclarant TMyDataServer, un descendant de TSoapDataModule, qui implmente IMyDataServer, un descendant de IAppServer.
25-17
Vous pouvez modifier les dfinitions de linterface gnre et le descendant de TSoapDataModule en ajoutant vos propres proprits et mthodes. Ces proprits et mthodes ne sont pas appeles automatiquement, mais les applications client qui demandent votre nouvelle interface par son nom peuvent utiliser toutes les proprits et toutes les mthodes que vous avez ajoutes.
Remarque
Pour utiliser TSoapDataModule, le nouveau module de donnes doit avoir t ajout une application service Web. Linterface IAppServer est une interface invocable, recense dans la section dinitialisation de la nouvelle unit. Cela permet au composant invocateur dans le module Web principal de faire suivre tous les appels entrants votre module de donnes.
Configuration de TCorbaDataModule
Pour ajouter un composant TCorbaDataModule dans votre application, choisissez Fichier|Nouveau et slectionnez Module de donnes CORBA dans la page Multi-niveaux de la bote de dialogue Nouveaux lments. Lexpert Module de donnes CORBA apparat. Vous devez fournir un nom de classe pour votre module de donnes distant. Il sagit du nom de base dun descendant de TCorbaDataModule que votre application cre. Il sagit aussi du nom de base de linterface de cette classe. Par exemple, si vous spcifiez le nom de classe MyDataServer, lexpert cre une nouvelle unit en dclarant TMyDataServer, un descendant de TSoapDataModule, qui implmente IMyDataServer, un descendant de IAppServer.
Remarque
Vous pouvez ajouter vos propres proprits et mthodes votre nouvelle interface. Pour plus dinformations sur lajout dlments linterface de votre module de donnes, voir Extension de linterface du serveur dapplications la page 25-19. Lexpert module de donnes CORBA vous permet de spcifier comment votre application serveur cre les instances du module de donnes distant. Vous pouvez choisir entre le mode partag ou instance par client. Lorsque vous choisissez le mode partag, votre application cre une instance unique du module de donnes distant qui gre toutes les requtes client. Ce modle est traditionnellement utilis dans le dveloppement CORBA. Lorsque vous choisissez le mode une instance par client, une nouvelle instance du module de donnes distant est cre pour chaque connexion client. Cette instance persiste jusqu ce que le dlai dinactivit soit coul sans message de la part du client. Cela permet certes au serveur de librer les instances lorsquelles ne sont plus utilises par les clients, mais prsente le risque que le serveur soit libr prmaturment si le client nutilise pas linterface du serveur pendant une longue priode.
Remarque
Contrairement au modle dinstanciation des serveurs COM, o est dtermin le nombre dinstances du processus qui sont excutes, dans le modle CORBA, linstanciation dtermine le nombre dinstances de votre objet qui sont cres. Elles sont toutes cres dans une seule instance de lexcutable serveur.
25-18
Guide du dveloppeur
Outre le modle dinstanciation, vous devez spcifier le modle threading dans lexpert Module de donnes CORBA. Vous pouvez choisir Monothread ou Multithread. Si vous choisissez Monothread, chaque instance du module de donnes distant est assure de ne recevoir quune requte client un moment donn. Vous pouvez accder en scurit aux objets contenus dans votre module de donnes distant. Toutefois, vous devez prvenir les conflits de thread lorsque vous utilisez des variables globales ou des objets non contenus dans le module de donnes distant. Si vous choisissez Multithread, chaque connexion client dispose de son propre thread. Toutefois, votre application peut tre appele par plusieurs clients simultanment, chacun sur un thread diffrent. Vous devez prvenir laccs simultan aux donnes dinstance ainsi qu la mmoire globale. Lcriture de serveurs multithreads est dlicate lorsque vous utilisez une instance partage du module de donnes distant car vous devez protger toute lutilisation des objets contenus dans le module.
25-19
Remarque
Aucune de ces approches ne fonctionne si vous implmentez TSoapDataModule. Pour les descendants de TSoapDataModule, vous devez modifier linterface du serveur directement. Le comportement de Delphi lorsque vous ajoutez de nouvelles entres linterface, en utilisant lditeur de bibliothque de types ou la commande Ajouter linterface, diffre selon que vous crez un serveur bas sur COM (TRemoteDataModule ou TMTSDataModule) ou un serveur CORBA (TCorbaDataModule). Lorsque vous ajoutez une interface COM, vos modifications sont ajoutes au code source de votre unit et au fichier de la bibliothque de types (.TLB). Lorsque vous effectuez un ajout linterface CORBA, vos modifications sont rpercutes dans le code source de votre unit et dans lunit _TLB automatiquement gnre. Lunit _TLB est ajoute la clause uses de votre unit. Vous devez ajouter cette unit la clause uses dans votre application client si sous souhaitez tirer parti de la liaison anticipe. De plus, vous pouvez enregistrer un fichier .IDL partir de lditeur de bibliothque de types laide de la commande Fichier|Enregistrer sous. Le fichier .IDL est requis pour recenser linterface dans le rfrentiel dinterfaces et dans le dmon dactivation dobjets.
Remarque
Vous devez enregistrer explicitement le fichier TLB en choisissant Rafrachir dans lditeur de bibliothque de types et en sauvegardant ensuite les modifications depuis lEDI. Une fois que vous avez effectu un ajout linterface de votre module de donnes distant, localisez les proprits et les mthodes ajoutes limplmentation de votre module de donnes distant. Ajoutez du code pour terminer cette implmentation en remplissant le corps des nouvelles mthodes. Les applications client appellent les extensions de votre interface laide de la proprit AppServer de leur composant connexion. Pour plus dinformations sur la procdure suivre, voir Appel des interfaces serveur la page 25-33.
25-20
Guide du dveloppeur
leur achvement. Cela permet larrt des transactions et la dsactivation du module de donnes distant. De plus, vous ne pouvez pas renvoyer depuis ces nouvelles mthodes de valeurs qui rendraient possible une communication directe entre les clients et les objets ou interfaces du serveur dapplications sans fournir une rfrence fiable. Si vous utilisez un module de donnes MTS sans tat, oublier dutiliser une rfrence fiable peut provoquer des blocages car vous ne garantissez pas que le module de donnes distant soit actif. Pour davantage dinformations sur les rfrences fiables, voir Transfert de rfrences dobjets la page 39-21.
Si vous utilisez le BDE, la validation en deux phases nest entirement implmente que sur les bases de donnes Oracle7 et MS-SQL. Si votre transaction implique plusieurs bases de donnes et que certaines dentre elles sont des serveurs distants autres que Oracle7 ou MS-SQL, il existe un risque minime dchec partiel. Toutefois, dans toute base de donn es, vous pouvez utiliser les transactions. Par dfaut dans un module de donnes transactionnel, tous les appels de IAppServer sont transactionnels. Il suffit dactiver lattribut de transaction de votre module de donnes pour indiquer quil doit participer aux transactions. De plus, vous pouvez tendre linterface du serveur dapplications pour inclure des appels de mthode qui encapsulent des transactions que vous avez dfinies.
25-21
Si lattribut de transaction indique que le module de donnes distantncessite une transaction, tous les appels des clients sont automatiquement inclus dans une transaction jusqu ce que vous spcifiez que la transaction est acheve. Ces appels russissent ou sont annuls en bloc.
Remarque
Ne combinez pas les transactions MTS ou COM+ avec des transactions explicites cres par un composant connexion de base de donnes ou laide de commandes SQL explicites. Lorsque votre module de donnes transactionnel est rpertori dans une transaction, il rpertorie automatiquement tous les appels de votre base de donnes dans la transaction. Pour plus dinformations sur lutilisation des transactions MTS et COM+, voir Support transactionnel MTS et COM+ la page 39-9.
25-22
Guide du dveloppeur
Pour utiliser la lecture incrmentale dans un serveur dapplications sans tat, vous pouvez faire ce qui suit : Lorsque le fournisseur rassemble un ensemble denregistrements dans un paquet de donnes, il note la valeur de CUST_NO sur le dernier enregistrement du paquet :
TRemoteDataModule1.DataSetProvider1GetData(Sender: TObject; DataSet: TCustomClientDataSet); begin DataSet.Last; { se positionne sur le dernier enregistrement } with Sender as TDataSetProvider do Tag := DataSet.FieldValues[CUST_NO]; {enregistre la valeur de CUST_NO } end;
25-23
Le fournisseur envoie cette dernire valeur CUST_NO au client aprs avoir envoy le paquet de donnes :
TRemoteDataModule1.DataSetProvider1AfterGetRecords(Sender: TObject; var OwnerData: OleVariant); begin with Sender as TDataSetProvider do OwnerData := Tag; {envoie la dernire valeur de CUST_NO } end;
Sur le client, lensemble de donnes client enregistre cette dernire valeur de CUST_NO :
TDataModule1.ClientDataSet1AfterGetRecords(Sender: TObject; var OwnerData: OleVariant); begin with Sender as TClientDataSet do Tag := OwnerData; {enregistre la dernire valeur de CUST_NO } end;
Avant de lire un paquet de donnes, le client envoie la dernire valeur de CUST_NO quil a reue :
TDataModule1.ClientDataSet1BeforeGetRecords(Sender: TObject; var OwnerData: OleVariant); begin with Sender as TClientDataSet do begin if not Active then Exit; OwnerData := Tag; { envoie la dernire valeur de CUST_NO au serveur dapplications } end; end;
Enfin, sur le serveur, le fournisseur utilise la dernire valeur de CUST_NO envoye comme valeur minimale dans la requ te :
TRemoteDataModule1.DataSetProvider1BeforeGetRecords(Sender: TObject; var OwnerData: OleVariant); begin if not VarIsEmpty(OwnerData) then with Sender as TDataSetProvider do with DataSet as TSQLDataSet do begin Params.ParamValues[MinVal] := OwnerData; Refresh; { oblige la requte se rexcuter } end; end;
25-24
Guide du dveloppeur
modle dans lequel un module de donnes distant parent principal rpartit les connexions des clients parmi les modules de donnes distants enfant. Pour crer le module de donnes distant parent, vous devez tendre son interface IAppServer en ajoutant les proprits qui exposent les interfaces des modules de donnes distants enfant. En dautres termes, pour chaque module de donnes distant enfant, ajoutez une proprit linterface du module de donn es parent dont la valeur reprsente linterface IAppServer interface du module de donnes enfant. La mthode daccs en lecture une proprit doit ressembler ceci :
function ParentRDM.Get_ChildRDM: IChildRDM; begin {Le module de donnes distant parent utilise un composant fabricant dfini dans lunit du module de donnes distant enfant. Cela est plus efficace dans le cas de la cration de plusieurs enfants pour diffrents clients } Result := ChildRDMFactory.CreateCOMObject(nil) as IChildRDM; Result.ParentRDM := Self; end;
Pour plus dinformations sur lextension de linterface du module de donnes distant parent, voir Extension de linterface du serveur dapplications la page 25-19.
Conseil
Vous pouvez galement tendre linterface de chaque module de donnes enfant en exposant linterface du module de donnes parent ou les interfaces des autres modules de donnes enfant. Cela facilite la communication entre les diffrents modules de donnes de votre serveur dapplications. Une fois que les proprits qui reprsentent les modules de donnes distants enfant ont t ajoutes au module de donnes distant principal, les applications client nont pas besoin dtablir de connexions distinctes chaque module de donnes distant sur le serveur dapplications. En effet, elles partagent une connexion unique au module de donnes distant parent, qui rpartit ensuite les messages parmi les modules de donnes enfant. Etant donn que chaque application client utilise la mme connexion pour chaque module de donnes distant, les modules de donnes distants peuvent partager une connexion de base de donnes unique, ce qui permet dconomiser les ressources. Pour plus dinformations sur la partage dune connexion unique par les applications enfant, voir Connexion un serveur dapplications qui utilise plusieurs modules de donnes la page 25-35.
25-25
recens comme tout autre serveur COM. Pour plus dinformations sur le recensement dun serveur COM, voir Recensement dun objet COM la page 36-18. Si vous utilisez un module de donnes transactionnel, il ne faut pas recenser le serveur dapplications. Vous devez la place linstaller dans MTS ou COM+. Pour davantage dinformations sur linstallation dobjets transactionnels, voir Installation dobjets transactionnels la page 39-24. Lorsque le serveur dapplications utilise SOAP, il doit tre recens afin que son interface soit reconnue par le rpartiteur SOAP. Lorsque le serveur dapplications utilise SOAP, lapplication doit tre une application service Web. En tant que telle, elle doit tre recense sur votre serveur Web, afin quelle puisse recevoir les messages HTTP entrants. De plus, si vous souhaitez que des clients non crits avec Delphi accdent aux interfaces de votre application, vous pouvez publier un document WSDL dcrivant les interfaces invocables de votre application. Pour plus informations sur lexportation dun document WSDL pour une application service Web, voir Gnration de documents WSDL pour une application service Web la page 31-8. Lorsque le serveur dapplications utilise CORBA, le recensement est facultatif. Si vous souhaitez que les applications client utilisent la liaison dynamique votre interface, vous devez installer linterface du serveur dans le rfrentiel dinterfaces. De plus, si vous souhaitez que les applications client dmarrent le serveur dapplications lorsquil nest pas encore excut, ce dernier doit tre recens avec lOAD (Object Activation Daemon).
1 Ajoutez un nouveau module de donnes au projet. 2 Placez un composant connexion sur le module de donnes. Le type de composant connexion que vous ajoutez dpend du protocole de communication que vous souhaitez utiliser. Voir Structure de lapplication client la page 25-5, pour plus de dtails. 3 Initialisez les proprits sur votre composant connexion pour spcifier le serveur dapplications avec lequel il doit tablir une connexion. Pour plus dinformations sur la configuration du composant connexion, voir Connexion au serveur dapplications la page 25-27.
25-26
Guide du dveloppeur
4 Initialisez les autres proprits du composant connexion selon les besoins de votre application. Par exemple, vous pouvez initialiser la proprit ObjectBroker pour permettre au composant connexion de choisir dynamiquement parmi plusieurs serveurs. Pour plus dinformations sur lutilisation des composants connexion, voir Gestion des connexions serveur la page 25-32. 5 Placez autant de composants TClientDataSet que ncessaire sur le module de donnes, et initialisez la proprit RemoteServer pour chaque composant avec le nom du composant connexion plac lors de ltape 2. Pour une prsentation dtaille des ensembles de donnes client, voir chapitre 23, Utilisation densembles de donnes client. 6 Initialisez la proprit ProviderName de chaque composant TClientDataSet. Si votre composant connexion est connect au serveur dapplications lors de la conception, vous pouvez choisir un fournisseur disponible dans la liste droulante de la proprit ProviderName. 7 Poursuivez comme si vous criez une application de base de donnes quelconque. Les clients dapplications multiniveaux disposent de quelques fonctionnalits supplmentaires :
Votre application peut appeler directement le serveur dapplications. Appel des interfaces serveur la page 25-33 dcrit la procdure suivre. Vous pouvez utiliser les fonctionnalits des ensembles de donnes client qui permettent de grer leur interaction avec les composants fournisseur. Ces fonctionnalits sont dcrites dans Utilisation dun ensemble de donnes client avec un fournisseur la page 23-29.
25-27
serveur. Si le serveur est recens ou install sur la machine client, ou si le composant connexion est connect la machine serveur, vous pouvez initialiser la proprit ServerName lors de la conception partir dune liste droulante dans linspecteur dobjets. ServerGUID spcifie le GUID de linterface du module de donnes distant. Vous pouvez rechercher cette valeur laide de lditeur de bibliothque de types. Si vous utilisez CORBA, identifiez le serveur laide de la proprit RepositoryID. RepositoryID spcifie lId de rfrentiel de linterface usine du serveur dapplications, qui apparat comme troisime argument dans lappel de TCorbaVCLComponentFactory.Create, automatiquement ajout la section dinitialisation de lunit dimplmentation du serveur CORBA. Vous pouvez aussi initialiser cette proprit sur le nom de base de linterface du module de donnes CORBA (la mme chane que la proprit ServerName des autres composants connexion) pour quelle soit automatiquement convertie en lId de rfrentiel appropri. Grer les connexions serveur. Les composants connexion peuvent tre utiliss pour crer ou abandonner des connexions et pour appeler des interfaces de serveur dapplications. Gnralement, le serveur dapplications et lapplication client se trouvent sur des machines diffrentes. Mais mme si le serveur rside sur la mme machine que lapplication client (par exemple, pendant la construction et le test de toute lapplication multiniveau), vous pouvez utiliser le composant connexion pour identifier le serveur dapplications par son nom, spcifier une machine serveur et utiliser linterface du serveur dapplications.
Mme lorsquil existe une entre de registre systme pour le serveur dapplications, vous pouvez spcifier ComputerName pour craser cette entre. Cela peut tre particulirement utile pendant le dveloppement, le test et le dbogage. Si votre application client peut choisir parmi plusieurs serveurs, vous pouvez utiliser la proprit ObjectBroker au lieu de spcifier la valeur de ComputerName. Pour plus dinformations, voir Courtage de connexions la page 25-31.
25-28
Guide du dveloppeur
Si vous fournissez le nom dun ordinateur hte ou dun serveur introuvable, le composant connexion DCOM dclenche une exception lorsque vous essayez douvrir la connexion.
Vous pouvez configurer le port du rpartiteur de sockets en cliquant avec le bouton droit sur licne du serveur de socket Borland et en choisissant Proprits. Bien que les connexions socket ne permettent pas lutilisation des protocoles de scurit, vous pouvez personnaliser la connexion socket en ajoutant votre propre cryptage. Pour cela,
1 Crez un objet COM supportant linterface IDataIntercept. Cest une interface de cryptage et de dcryptage des donnes. 2 Utilisez TPacketInterceptFactory comme fabricant de classes de cet objet. Si vous utilisez un expert pour crer lobjet COM ltape 1, remplacez la ligne de la section dinitialisation indiquant TComponentFactory.Create(...) par TPacketInterceptFactory.Create(...).
25-29
3 Recensez votre nouveau serveur COM sur la machine client. 4 Dfinissez la proprit InterceptName ou InterceptGUID du composant connexion socket pour spcifier cet objet COM. Si vous avez utilis TPacketInterceptFactory ltape 2, votre serveur COM apparat dans la liste droulante de linspecteur dobjets pour la proprit InterceptName. 5 Enfin, cliquez avec le bouton droit sur licne du serveur de socket Borland, choisissez Proprits et, dans la page des proprits, affectez aux proprits InterceptName et InterceptGUID lidentificateur ProgId ou GUID de lintercepteur.
Ce mcanisme peut servir galement la compression et la dcompression des donnes.
Lorsque vous utilisez TWebConnection, wininet.dll doit tre install sur la machine client. Si vous avez IE3 ou une version suprieure, wininet.dll se trouve dans le rpertoire systme de Windows. Si le serveur Web ncessite une authentification, ou si vous utilisez un serveur proxy qui demande une authentification, vous devez dfinir la valeur des proprits UserName et Password pour que le composant connexion tablisse la connexion. Si votre application client peut choisir parmi plusieurs serveurs, vous pouvez utiliser la proprit ObjectBroker au lieu de spcifier la valeur de URL. Pour plus dinformations, voir Courtage de connexions la page 25-31.
25-30
Guide du dveloppeur
Le composant connexion SOAP tablit une connexion avec une application serveur Web implmentant linterface IAppServer comme service Web. TSoapConnection localise cette application serveur Web en utilisant une URL (Uniform Resource Locator). LURL spcifie le protocole (http ou, si vous utilisez la scurit SSL, https), le nom dhte de la machine excutant le serveur Web, le nom de lapplication service Web et le chemin correspondant au nom de chemin du THTTPSoapDispatcher sur le serveur dapplications. Spcifiez cette valeur dans la proprit URL.
Remarque
Lorsque vous utilisez TSoapConnection, wininet.dll doit tre installe sur la machine client. Si vous avez install IE3, ou une version suprieure, wininet.dll se trouve dans le rpertoire systme de Windows. Si le serveur Web exige une authentification, ou si vous utilisez un serveur proxy ncessitant une authentification, vous devez dfinir les valeurs des proprits UserName et Password pour permettre au composant connexion de se connecter.
Courtage de connexions
Si votre application client peut choisir parmi plusieurs serveurs, vous pouvez utiliser un courtier dobjets pour localiser un systme serveur disponible. Le courtier dobjets gre une liste de serveurs disponibles pour le composant connexion. Lorsque le composant connexion a besoin de se connecter un serveur dapplications, il demande au courtier dobjets un nom dordinateur (ou une adresse IP, un nom dhte, une URL). Le courtier fournit un nom puis le composant connexion tablit la connexion. Si le nom fourni ne fonctionne pas
25-31
(par exemple si le serveur nest pas oprationnel), le courtier fournit un autre nom et rpte lopration jusqu ce que la connexion soit tablie. Une fois que le composant connexion a tabli une connexion avec un nom fourni par le courtier, il enregistre ce nom en tant que valeur de la proprit approprie (ComputerName, Address, Host, RemoteHost ou URL). Si le composant connexion ferme la connexion puis a besoin de louvrir nouveau, il utilise cette valeur de proprit et ne demande un nouveau nom au courtier que si la connexion choue. Pour utiliser un courtier dobjets, spcifiez la proprit ObjectBroker de votre composant connexion. Lorsque la proprit ObjectBroker est initialise, le composant connexion nenregistre pas la valeur de ComputerName, Address, Host, RemoteHost ou URL.
Remarque
Nutilisez pas la proprit ObjectBroker avec des connexions CORBA. CORBA possde son propre service de courtage.
Connexion au serveur
Pour localiser le serveur dapplications et vous y connecter, vous devez dabord initialiser les proprits du composant connexion pour identifier le serveur dapplications. Ce processus est dcrit dans Connexion au serveur dapplications la page 25-27. Avant douvrir la connexion, tous les ensembles de donnes client qui utilisent le composant connexion pour communiquer avec le serveur dapplications doivent lindiquer en initialisant leur proprit RemoteServer. La connexion est automatiquement ouverte lorsque les ensembles de donnes client essaient daccder au serveur dapplications. Par exemple, linitialisation True de la proprit Active de lensemble de donnes client ouvre la connexion, pour autant que la proprit RemoteServer ait t dfinie. Si vous ne liez aucun ensemble de donnes client au composant connexion, vous pouvez ouvrir la connexion en initialisant True la proprit Connected du composant connexion. Avant dtablir une connexion un serveur dapplications, un composant connexion gnre un vnement BeforeConnect. Vous pouvez excuter des actions particulires avant de vous connecter en les codant dans un gestionnaire BeforeConnect. Aprs avoir tabli une connexion, le composant connexion gnre un vnement AfterConnect o vous pouvez galement excuter toute action ncessaire.
25-32
Guide du dveloppeur
Au lieu dutiliser un seul composant connexion pour basculer entre les serveurs dapplications disponibles, une application client peut disposer de plusieurs composants connexion, chacun deux tant connect un serveur dapplications particulier. Avant de fermer une connexion, un composant connexion appelle automatiquement son gestionnaire dvnement BeforeDisconnect, sil existe. Pour excuter des actions particulires avant la dconnexion, crivez un gestionnaire BeforeDisconnect. De mme, aprs la fermeture de la connexion, le gestionnaire dvnement AfterDisconnect est appel. Pour excuter des actions particulires aprs la dconnexion, crivez un gestionnaire AfterDisconnect.
Toutefois, cette technique offre une liaison tardive (dynamique) de lappel dinterface. En raison de cela, lappel de la procdure SpecialMethod nest pas lie avant lexcution lorsque lappel est excut. La liaison tardive est trs souple mais son utilisation vous prive de nombreux avantages tels que code insight et la vrification de type. De plus, la liaison tardive est plus lente que la liaison
25-33
anticipe car le compilateur gnre des appels supplmentaires vers le serveur pour configurer les appels dinterface avant de les raliser. Lorsque vous utilisez DCOM ou CORBA comme protocole de communication, vous pouvez utiliser la liaison anticipe dappels AppServer. Utilisez loprateur as pour affecter la variable AppServer le descendant IAppServer que vous avez cr lorsque vous avez cr le module de donnes distant. Par exemple :
with MyConnection.AppServer as IMyAppServer do SpecialMethod(x,y);
Pour utiliser la liaison anticipe sous DCOM, la bibliothque de types du serveur doit tre recense sur la machine client. Vous pouvez utiliser TRegsvr.exe, fourni avec Delphi, pour recenser la bibliothque de types.
Remarque
Reportez-vous la dmo TRegSvr (qui offre le source de TRegsvr.exe) pour un exemple de recensement de la bibliothque de types par programmation. Pour utiliser la liaison anticipe avec CORBA, vous devez ajouter votre projet lunit _TLB gnre par lditeur de bibliothque de types. Pour ce faire, ajoutez cette unit la clause uses de votre unit. Lorsque vous utilisez TCP/IP ou HTTP, vous ne pouvez pas rellement utiliser la liaison anticipe mais, comme le module de donnes distant utilise une interface double, vous pouvez utiliser la dispinterface du serveur dapplications pour amliorer les performances dune simple liaison tardive. La dispinterface porte le mme nom que linterface du module de donn es distant, suivi de la chane Disp. Vous pouvez affecter la proprit AppServer une variable de ce type pour obtenir la dispinterface. Par exemple :
var TempInterface: IMyAppServerDisp; begin TempInterface :=IMyAppServerDisp(IDispatch(MyConnection.AppServer)); ... TempInterface.SpecialMethod(x,y); ... end;
Remarque
Pour utiliser la dispinterface, vous devez ajouter lunit _TLB gnre lorsque vous enregistrez la bibliothque de types la clause uses de votre module client. Si vous utilisez SOAP, vous ne pouvez pas utiliser la proprit AppServer. A la place, vous devez utiliser un objet interface distante (THTTPRio) et effectuer des appels liaison anticipe. Comme dans tous les appels liaison anticipe, lapplication client doit connatre la dclaration de linterface du serveur dapplications la compilation. Pour lajouter votre application client, vous pouvez soit ajouter lunit utilise par le serveur pour dclarer et recenser linterface la clause uses du client, soit faire rfrence un document WSDL dcrivant linterface. Pour plus dinformations sur limportation dun document WSDL dcrivant linterface du serveur, voir Importation de documents WSDL la page 31-9.
25-34
Guide du dveloppeur
Remarque
Lunit qui dclare linterface du serveur doit aussi la recenser dans le registre dinvocation. Pour savoir comment recenser des interfaces invocables, voir D finition des interfaces invocables la page 31-4. Une fois que votre application utilise lunit du serveur qui dclare et recense linterface, ou que vous avez import un document WSDL pour gnrer une telle unit, crez une instance de THTTPRio pour linterface souhaite :
X := THTTPRio.Create(nil);
Ensuite, assignez lURL utilise par votre composant connexion lobjet interface distante :
X.URL := SoapConnection1.URL;
Vous pouvez alors utiliser loprateur as pour convertir linstance de THTTPRio en linterface du serveur dapplications :
InterfaceVariable := X as IMyAppServer; InterfaceVariable.SpecialMethod(x,y);
1 Pour la connexion au module de donnes distant principal, ajoutez et configurez un composant connexion tel que dcrit dans Connexion au serveur dapplications la page 25-27. La seule limite est que vous ne pouvez pa utiliser une connexion CORBA ou SOAP. 2 Pour chaque module de donnes distant enfant, utilisez un composant TSharedConnection.
Affectez sa proprit ParentConnection le composant connexion ajout ltape 1. Le composant TSharedConnection partage la connexion tablie par cette connexion principale.
25-35
Affectez sa proprit ChildName le nom de la proprit sur linterface du module de donnes distant principal qui expose linterface du module de donnes distant enfant dsir. Lorsque vous affectez le composant TSharedConnection plac ltape 2 comme valeur de la proprit RemoteServer dun ensemble de donnes client, il fonctionne comme si vous utilisiez une connexion entirement indpendante au module de donnes distant enfant. Toutefois, le composant TSharedConnection utilise la connexion tablie par le composant plac ltape 1.
Il existe deux faons denvisager la construction de lapplication Web : Vous pouvez combiner larchitecture de base de donnes multiniveau au support dActiveX fourni par Delphi pour distribuer lapplication client en tant que contrle ActiveX. Cela permet nimporte quel navigateur supportant ActiveX dexcuter votre application client en tant que serveur en processus. Vous pouvez utiliser les paquets de donn es XML pour construire une application InternetExpress. Cela permet aux navigateurs supportant javascript dinteragir avec votre application client par le biais de pages html. Ces deux approches sont trs diffrentes. Votre choix dpendra des considrations suivants : Chaque approche repose sur une technologie diffrente (ActiveX contre javascript et XML). Prenez en compte les systmes de vos utilisateurs finals. La premire approche exige un navigateur supportant ActiveX (ce qui limite vos clients aux plates-formes Windows). La seconde exige un navigateur
25-36
Guide du dveloppeur
supportant javascript et les capacits DHTML introduites par Netscape 4 et Internet Explorer 4. Les contrles ActiveX doivent tre tlchargs sur le navigateur pour agir en tant que serveur en processus. Il sen suit que les clients utilisant lapproche ActiveX exigent beaucoup plus de mmoire que les clients dune application base sur HTML. Lapproche InternetExpress peut sintgrer dautres pages HTML. Un client ActiveX doit tre excut dans une fentre part. Lapproche InternetExpress utilise HTTP standard, excluant donc les problmes de coupe-feu auxquels sont confrontes les applications ActiveX. Lapproche ActiveX autorise une plus grande souplesse dans la faon de programmer votre application. Vous ntes pas limit par les capacits des bibliothques javascript. Les ensembles de donnes client utiliss dans lapproche ActiveX exposent plus de fonctionnalits (filtres, fourchettes, globalisation, paramtres facultatifs, lecture diffre des BLOB ou des dtails imbriques, etc.) que les navigateurs XML utiliss par lapproche InternetExpress.
Attention
Votre application client Web risque dapparatre et de se comporter de manire diffrente selon le navigateur qui laffiche. Testez-la avec les navigateurs dont se serviront vos utilisateurs finals.
25-37
25-38
Guide du dveloppeur
Une application InternetExpress tend larchitecture dapplication serveur Web de base pour faire office de client dun serveur dapplications. Les applications InternetExpress gnrent des pages HTML qui associent HTML, XML et javascript. HTML rgit la disposition et laspect des pages vues par les utilisateurs finals dans leur navigateur. XML code les paquets de donnes et les paquets delta qui reprsentent les informations base de donnes. Javascript permet aux contrles HTML dinterprter et de manipuler les donnes des paquets XML sur la machine client. Si lapplication InternetExpress utilise DCOM pour se connecter au serveur dapplications, vous devez suivre des tapes supplmentaires afin de garantir que le serveur dapplications accorde les droits daccs et de lancement ses clients. Voir Droits daccs au serveur dapplications et son lancement la page 25-41, pour plus de dtails.
Astuce
Vous pouvez crer une application InternetExpress pour fournir des navigateurs Web avec des donnes relles mme si vous navez pas dapplication serveur. Ajoutez simplement un fournisseur et son ensemble de donnes au module Web.
1 Choisissez Fichier|Nouveau pour afficher la bote de dialogue Nouveaux lments. Dans la page Nouveau, slectionnez Application serveur Web. Cette procdure est dcrite par Cration dapplications serveur Web avec lagent Web la page 28-1. 2 Depuis la page DataSnap de la palette de composants, ajoutez un composant connexion au module Web qui apparat lorsque vous crez une nouvelle application serveur Web. Le type du composant connexion dpendra du protocole de communication utilis. Voir Slection dun protocole de connexion la page 25-10, pour plus de dtails. 3 Dfinissez les proprits de votre composant connexion pour spcifier le serveur dapplications avec lequel il doit tablir la connexion. Pour en savoir plus sur la dfinition dun composant connexion, voir Connexion au serveur dapplications la page 25-27. 4 Depuis la page InternetExpress de la palette de composants, ajoutez au module Web un courtierXML au lieu dun ensemble de donnes client. Comme TClientDataSet, TXMLBroker reprsente les donnes venant dun fournisseur sur le serveur dapplications et interagit avec le serveur dapplications via son interface IAppServer. Cependant, au contraire des ensembles de donnes, les courtiers XML demandent des paquets de donnes XML et non OleVariants, et interagissent avec les composants InternetExpress et non les contrles de donnes.
25-39
5 Dfinissez la proprit RemoteServer du courtier XML pour quelle pointe sur le composant connexion ajout ltape 2. Dfinissez la proprit ProviderName pour quelle indique le fournisseur sur le serveur dapplications qui fournit les donnes et applique les mises jour. Pour plus dinformations sur la configuration dun courtier XML, voir Utilisation dun courtier XML la page 25-42. 6 Ajoutez au module Web un producteur de page InternetExpress (TInetXPageProducer) pour chaque page qui sera vue par les utilisateurs dans leur navigateur. Pour chaque producteur de page, vous devez dfinir une proprit IncludePathURL. Elle indique o se trouvent les bibliothques javascript. Ces bibliothques ajoutent aux contrles HTML des capacits de gestion des donnes. 7 Cliquez avec le bouton droit sur une page Web et choisissez Editeur dactions pour afficher lditeur dactions. Ajoutez llment daction correspondant chaque message que vous voulez g rer depuis les navigateurs. Associez les producteurs de page que vous avez ajout ltape 6 avec ces actions en dfinissant leur proprit Producer ou en crivant du code dans un gestionnaire de lvnement OnAction. Pour plus dinformations sur lajout des lments daction dans lditeur dactions, voir Ajout dactions au rpartiteur la page 28-5. 8 Double-cliquez sur chaque page Web pour afficher lditeur de pages Web (vous pouvez galement afficher cet diteur en cliquant dans linspecteur dobjets sur le bouton points de suspension situ ct de la proprit WebPageItems). Dans lditeur, vous pouvez ajouter des lments Web pour concevoir les pages que verront les utilisateurs dans leur navigateur. Pour plus dinformations sur la conception de pages Web pour votre application InternetExpress, voir Cration des pages Web avec un producteur de page InternetExpress la page 25-44. 9 Construisez votre application Web. Une fois lapplication installe avec votre serveur Web, les navigateurs pourront lappeler en spcifiant le nom de lapplication dans la portion de lURL correspondant au nom de script et le nom du composant page Web dans la partie correspondant au chemin daccs.
xmldb.js
25-40
Guide du dveloppeur
xmlshow.js
Ces bibliothques sont dans le rpertoire Source/Webmidas. Lorsque vous les aurez installes, vous devrez dfinir la proprit IncludePathURL de tous les producteurs de page InternetExpress pour indiquer o elles se trouvent. Il est possible dcrire vos propres pages HTML en utilisant les classes javascript fournies dans ces bibliothques au lieu dutiliser les lments Web pour gnrer vos pages Web. Toutefois, vous devez vrifier que votre code ne fait rien dillgal car ces classes comportent une vrification derreurs minimale (afin de rduire la taille des pages Web gnres). Les classes des bibliothques javascript sont un standard en cours de dveloppement, elles sont rgulirement mises jour. Si vous voulez les utiliser directement plutt que de laisser les lments Web gnrer le code javascript, vous pouvez obtenir leurs dernires versions et une documentation sur leur utilisation partir de CodeCentral disponible via community.borland.com.
Le serveur dapplications sexcutant sous le compte invit, il ne peut tre arrt par aucun autre compte. Pour accorder lapplication Web le droit daccder au serveur dapplications et de le lancer, excutez DCOMCnfg.exe, qui se trouve dans le rpertoire System32 de la machine excutant le serveur dapplications. Les tapes suivantes dcrivent comment configurer votre serveur dapplications :
1 Lorsque vous excutez DCOMCnfg, slectionnez votre serveur dans la liste des applications de la page Applications. 2 Cliquez sur le bouton Proprits. Lorsque le dialogue change, slectionnez la page Scurit.
25-41
3 Slectionnez Permissions daccs personnalises, et appuyez sur le bouton Modifier. Ajoutez le nom IUSR_computername la liste de comptes ayant un droit daccs, o computername est le nom de la machine excutant lapplication Web. 4 Slectionnez Permissions de lancement personnalises, et appuyez sur le bouton Modifier. Ajoutez IUSR_computername la liste. 5 Cliquez sur le bouton Appliquer.
25-42
Guide du dveloppeur
Si le fournisseur sur le serveur dapplications reprsente une requte ou une procdure stocke, vous pouvez souhaiter transmettre les valeurs des paramtres avant dobtenir le paquet de donnes XML. Vous pouvez fournir ces valeurs laide de la proprit Params. Les composants qui gnrent le code HTML et javascript pour lapplication InternetExpress utilisent automatiquement le paquet de donnes XML du courtier XML lorsque vous avez dfini leur proprit XMLBroker. Pour obtenir le paquet de donnes XML directement dans le code, utilisez la mthode RequestRecords.
Remarque
Quand le courtier XML fournit un paquet de donnes un autre composant (ou que vous appelez RequestRecords), il reoit un vnement OnRequestRecords. Vous pouvez utiliser cet vnement pour fournir votre propre chane XML au lieu du paquet de donnes du serveur dapplications. Par exemple, vous pouvez lire le paquet de donnes XML partir du serveur dapplications laide de GetXMLRecords, puis le modifier avant de le fournir la page Web.
25-43
Certains vnements vous permettent dintgrer des traitements personnaliss au niveau de chacune des tapes de ce processus de mise jour :
1 La premire fois que le rpartiteur passe le message de mise jour au courtier XML, il reoit un vnement BeforeDispatch, o vous pouvez pr-traiter la demande ou mme la grer entirement. Cet vnement permet au courtier XML de grer dautres messages que les messages de mise jour. 2 Si le gestionnaire de lvnement BeforeDispatch ne gre pas le message, le courtier XML reoit un vnement OnRequestUpdate, o vous pouvez appliquer les mises jour vous-mme plutt que de suivre le processus par dfaut. 3 Si le gestionnaire de lvnement OnRequestUpdate ne gre pas la demande, le courtier XML applique les mises jour et reoit un paquet delta contenant les erreurs sy rapportant. 4 Sil ny a pas derreur de mise jour, le courtier XML reoit un vnement OnGetResponse, o vous pouvez crer un message de rponse indiquant que les mises jour ont t appliques avec succs ou envoyer des donnes rafrachies au navigateur. Si le gestionnaire de lvnement OnGetResponse nachve pas la rponse (ne dfinit pas le paramtre Handled par True), le courtier XML envoie une rponse qui redirige le navigateur sur le document ayant gnr le paquet delta. 5 Sil y a des erreurs de mise jour, le courtier XML reoit un vnement OnGetErrorResponse. Vous pouvez utiliser cet vnement pour tenter de rsoudre les erreurs ou pour gnrer une page Web qui les dcrit lutilisateur final. Si le gestionnaire de lvnement OnGetErrorResponse nachve pas la rponse (ne dfinit pas le paramtre Handled par True), le courtier XML appelle un gnrateur de contenu particulier, appel le ReconcileProducer, pour gnrer le contenu du message de rponse. 6 Enfin, le courtier XML reoit un vnement AfterDispatch, o vous pouvez effectuer toutes les actions voulues avant de renvoyer une rponse au navigateur Web.
25-44
Guide du dveloppeur
Pour plus dinformations sur les producteurs de page, voir Utilisation du composant gnrateur de page la page 28-14. Contrairement la majorit des producteurs de page, le producteur de page InternetExpress dispose dun modle par dfaut, valeur de sa proprit HTMLDoc. Ce modle contient un jeu de balises transparentes pour HTML que le producteur de page InternetExpress utilise pour assembler le document HTML (avec javascript et XML imbriqu s) en incluant le contenu produit par les autres composants. Avant qu il soit possible de traduire toutes les balises transparentes pour HTML et dassembler le document, vous devez indiquer lemplacement des bibliothques javascript utilises par le code javascript imbriqu dans la page. Cet emplacement est spcifi en dfinissant la proprit IncludePathURL. Vous pouvez spcifier les composants gnrant chaque partie de la page Web avec lditeur de pages Web. Affichez lditeur de pages Web en double-cliquant sur le composant page Web ou, dans linspecteur dobjets, en cliquant sur le bouton points de suspension situ ct de la proprit WebPageItems. Les composants que vous ajoutez dans lditeur de pages Web gnrent le code HTML qui remplace une des balises transparentes pour HTML du modle par dfaut du producteur de page InternetExpress. Ces composants constituent la valeur de la proprit WebPageItems. Aprs avoir insr les composants dans lordre qui vous convient, vous pouvez personnaliser le modle pour ajouter votre propre code HTML ou modifier les balises par dfaut.
Vous devez avoir install Internet Explorer 4, ou une version suprieure, pour utiliser lditeur de pages Web. Le haut de lditeur de pages Web affiche les lments Web qui gnrent le document HTML. Ces lments Web sont imbriqus : chaque type dlment assemble le HTML gnr par ses sous-lments. Diffrents types dlments peuvent contenir diffrents sous-lments. A gauche, une arborescence affiche tous les lments Web en indiquant la faon dont ils simbriquent. A droite, vous pouvez voir les lments Web inclus dans llment en cours de slection. Lorsque vous slectionnez un composant en haut de lditeur de pages Web, vous pouvez dfinir ses proprits dans linspecteur dobjets. Cliquez sur le bouton Nouveau pour ajouter un sous-lment llment en cours de slection. Le dialogue Ajout de composant Web montre uniquement les lments pouvant tre ajouts llment slectionn. Le producteur de page InternetExpress peut contenir un des deux types dlment suivants, chacun dentre eux gnrant une fiche HTML : TDataForm gnre une fiche HTML pour afficher les donnes et les contrles qui manipulent les donnes ou soumettent les mises jour.
25-45
Les lments que vous ajoutez TDataForm affichent les donnes dans une grille multi-enregistrement (TDataGrid) ou dans un jeu de contrles, chacun reprsentant un seul champ et un seul enregistrement (TFieldGroup). En outre, vous pouvez ajouter un jeu de boutons pour naviguer dans les donnes ou pour poster les mises jour (TDataNavigator). Vous pouvez galement ajouter un bouton qui applique les mises jour en retour sur le client Web (TApplyUpdatesButton). Chacun de ces lments contient des sous-lments qui reprsentent une valeur ou un bouton individuel. Enfin, avec la plupart des lments Web, vous pouvez ajouter une grille de disposition (TLayoutGroup) permettant de personnaliser la disposition des lments quils contiennent. TQueryForm gnre une fiche HTML pour afficher ou lire les valeurs dfinies par lapplication. Par exemple, vous pouvez utiliser cette fiche pour afficher et soumettre des valeurs de paramtres. Les lments que vous ajoutez TQueryForm affichent les valeurs dfinies par lapplication (TQueryFieldGroup). Ils peuvent galement constituer un jeu de boutons soumettant ou rinitialisant ces valeurs (TQueryButtons). Chacun de ces lments contient des sous-lments qui reprsentent une valeur ou un bouton individuel. Vous pouvez galement ajouter une grille de disposition une fiche de requte comme vous le faites une fiche de donnes. La partie infrieure de lditeur de pages Web affiche le code HTML gnr et vous permet de voir ce quil donne dans un navigateur (IE4).
25-46
Guide du dveloppeur
Vous pouvez aussi dfinir une feuille de style, qui dtermine un ensemble de dfinitions. Chaque dfinition inclut un slecteur de style (soit le nom dune balise laquelle le style sapplique constamment, soit le nom dun style dfini par lutilisateur), plus la dfinition entre accolades de lattribut :
H2 B {color: red} .MyStyle {font-family: arial; font-weight: bold; font-size: 18px }
Lensemble global des dfinitions est maintenu par le producteur de page InternetExpress dans sa proprit Styles. Chaque lment Web peut alors faire rfrence aux styles par les noms dfinis par lutilisateur via la proprit StyleRule. Si vous partagez une feuille de style avec dautres applications, vous pouvez fournir les dfinitions de style dans la valeur de la proprit StylesFile du producteur de page InternetExpress et non dans la proprit Styles. Les lments Web individuels peuvent continuer faire rfrence aux styles via la proprit StyleRule. Autre proprit commune des lments Web : la proprit Custom. Custom est un jeu doptions que vous ajoutez la balise HTML gnre. HTML dfinit un jeu doptions diffrent pour chaque type de balise. La rfrence de la VCL donne un exemple des options possibles pour la proprit Custom de la plupart des lments Web. Pour plus dinformations sur ces options, reportez-vous un guide de rfrence HTML.
Les balises transparentes pour HTML du modle par dfaut sont traduites comme suit : <#INCLUDES> gnre les instructions qui incluent les bibliothques javascript. Ces instructions ont la forme suivante :
<SCRIPT language=Javascript type="text/javascript" SRC="IncludePathURL/xmldom.js"> </SCRIPT> <SCRIPT language=Javascript type="text/javascript" SRC="IncludePathURL/xmldb.js"> </SCRIPT> <SCRIPT language=Javascript type="text/javascript" SRC="IncludePathURL/xmlbind.js"> </SCRIPT>
<#STYLES> gnre les instructions qui dfinissent une feuille de style partir des dfinitions listes dans la proprit Styles ou StylesFile du producteur de page InternetExpress.
25-47
<#WARNINGS> ne gnre rien pendant lexcution. Au moment de la conception, elle ajoute des messages davertissement concernant les problmes dtects lors de la gnration du document HTML. Vous pouvez voir ces messages dans lditeur de pages Web. <#FORMS> gnre le HTML produit par les composants que vous avez ajouts avec lditeur de pages Web. Le HTML correspondant chaque composant est gnr dans lordre de WebPageItems. <#SCRIPT> gnre le bloc des dclarations javascript utilises dans le HTML gnr par les composants ajouts avec lditeur de pages Web. Vous pouvez remplacer le modle par dfaut en modifiant la valeur de HTMLDoc ou en dfinissant la proprit HTMLFile. Le modle HTML personnalis peut comprendre une ou plusieurs des balises transparentes pour HTML appartenant au modle par dfaut. Le producteur de page InternetExpress traduit automatiquement ces balises lorsque vous appelez la mthode Content . En outre, le producteur de page InternetExpress traduit automatiquement les trois balises suivantes : <#BODYELEMENTS> est remplac du modle par dfaut. Cela HTML lorsque vous voulez lments supplmentaires par le mme HTML que celui rsultant des 5 balises peut servir gnrer un modle dans un diteur utiliser la disposition par dfaut mais ajouter des laide de lditeur.
<#COMPONENT Name=WebComponentName> est remplac par le HTML gnr par le composant nomm WebComponentName. Ce composant peut tre lun de ceux ajouts dans lditeur de pages Web, ou tout autre composant supportant linterface IWebContent, il a le mme propritaire que le producteur de page InternetExpress. <#DATAPACKET XMLBroker=BrokerName> est remplac par le paquet de donnes XML obtenu partir du courtier XML spcifi par BrokerName. Lorsque, dans lditeur de pages Web, vous examinez le HTML gnr par le producteur de page InternetExpress, vous voyez cette balise la place du paquet de donnes luimme. De plus, le modle personnalis peut inclure toute autre balise transparente pour HTML que vous auriez dfinie. Lorsque le producteur de page InternetExpress rencontre une balise appartenant un des sept types quil traduit automatiquement, il gnre un vnement OnHTMLTag, dans lequel vous pouvez crire du code pour effectuer vos propres traductions. Pour plus dinformations sur les modles HTML, voir Modles HTML la page 28-15.
Astuce
Les composants qui apparaissent dans lditeur de pages Web gnrent du code statique. Cest dire que, sauf si le serveur dapplications modifie les mtadonnes figurant dans les paquets de donnes, le code HTML est toujours le mme quelque soit le moment o il est gnr. Pour viter, lexcution, la gnration dynamique de ce code, en rponse chaque message de demande, vous pouvez copier le HTML gnr dans lditeur de pages Web et lutiliser comme modle. Lditeur de pages Web affichant une balise <#DATAPACKET> au lieu de lXML rel, utiliser ce genre de modle nempche pas votre application de lire dynamiquement les paquets de donnes provenant du serveur dapplications.
25-48
Guide du dveloppeur
26
Utilisation de XML dans les applications de bases de donnes
Chapitre 26
Chapitre
En plus de la prise en charge de la connexion des serveurs de bases de donnes, Delphi vous permet de travailler avec des documents XML comme sil sagissait de serveurs de bases de donnes. XML (Extensible Markup Language) est un langage de balisage pour la description de donnes structures. Les documents XML fournissent un format standard transportable pour les donnes, qui est utilis dans les applications Web, la communication inter-entreprises (business-to-business), etc. Pour plus dinformations sur la manipulation directe de documents XML dans Delphi, consultez le chapitre 30, Utilisation de documents XML. La prise en charge des documents XML dans Delphi pour les applications de bases de donnes repose sur un ensemble de composants capables de convertir des paquets de donnes (la proprit Data dun ensemble de donnes client) en documents XML et des documents XML en paquets de donnes. Pour utiliser ces composants, vous devez tout dabord dfinir la transformation entre le document XML et le paquet de donnes. Aprs avoir dfini la transformation, vous pouvez utiliser des composants spciaux pour convertir des documents XML en paquets de donnes. fournir des donnes dun document XML et traiter les mises jour dun document XML. utiliser un document XML comme client dun fournisseur.
26-1
correspondant. Une description de cette relation est stocke dans un document XML spcial appel une transformation. Chaque fichier de transformation contient deux lments : la correspondance entre les nuds dun schma XML et les champs dun paquet de donnes, et un document de squelette XML qui reprsente la structure des rsultats de la transformation. Une transformation est une correspondance unidirectionnelle : partir dun schma ou dun document XML vers un paquet de donnes ou partir des mtadonnes dun paquet de donnes vers un schma XML. Les fichiers de transformation se crent souvent par paire : lun dfinit la correspondance de XML vers le paquet de donnes, et lautre la correspondance du paquet de donnes vers XML. Pour crer les fichiers de transformation pour une correspondance, employez lutilitaire XMLMapper prsent dans le rpertoire bin.
26-2
Guide du dveloppeur
Joe, Ci-joint la spcification de la gestion du nouveau composant XML dans Delphi. Cest une bonne solution notre application inter-entreprises. Le schedule du projet est galement joint. Te semble-til raisonnable ? Dave. </content> <attachment attachfile="XMLSpec.txt"/> <attachment attachfile="Schedule.txt"/> </body> </email>
Une correspondance naturelle entre ce document et un ensemble de donnes consisterait mapper chaque message sur un enregistrement unique. Lenregistrement contiendrait des champs pour le nom et ladresse de lexpditeur. Comme un message lectronique peut avoir plusieurs destinataires, le destinataire (<to>) serait mapp sur un ensemble de donnes imbriqu. De mme, la liste cc serait mappe sur un ensemble de donnes imbriqu. La ligne de sujet serait mappe sur un champ de type chane de caractres tandis que le message lui-mme (<content>) serait probablement mapp sur un champ mmo. Les noms des fichiers joints seraient mapps sur un ensemble de donnes imbriqu, car un message peut avoir plusieurs fichiers joints. Par consquent, le message lectronique ci-dessus serait mapp sur un ensemble de donnes comme suit :
SenderName SenderAddress
Dave Boss
To
CC
Subject
Content Attach
Address
jengineer@MyCo.Com
Address
rsmith@MyCo.Com ldevon@MyCo.Com
La dfinition de telles correspondances implique lidentification dans le document XML des nuds qui peuvent tre rpts, et leur correspondance avec des ensembles de donnes imbriqus. Les lments baliss qui ont des valeurs et apparaissent une fois seulement (comme <content>...</content>) sont mapps
26-3
sur des champs dont le type de donnes reflte le type des donnes pouvant apparatre comme valeurs. Les attributs dune balise (comme lattribut AttachFile de la balise de pice jointe) sont galement mapps sur des champs. Notez que les balises du document XML napparaissent pas toutes dans lensemble de donnes correspondant. Par exemple, llment <head>...<head/> ne possde pas dlment correspondant dans lensemble de donnes rsultant. Gnralement, seuls les lments qui ont des valeurs, les lments qui peuvent tre rpts ou les attributs dune balise sont mapps sur les champs (y compris les champs dun ensemble de donnes imbriqu) dun ensemble de donnes. Un nud pre du document XML qui est mapp sur un champ dont la valeur est compose partir des valeurs des nuds fils constituerait toutefois une exception cette rgle. Par exemple, un document XML peut contenir un ensemble de balises de la forme
<FullName> <Title> Mr. </Title> <FirstName> John </FirstName> <LastName> Smith </LastName> </FullName>
qui peuvent tre mappes sur un champ densemble de donnes unique avec la valeur
Mr. John Smith
Utilisation de XMLMapper
Lutilitaire mappeur XML, xmlmapper.exe, vous permet de dfinir des mappages (ou correspondances) de trois manires : A partir dun schma (ou dun document) XML existant vers un ensemble de donnes client que vous dfinissez. Cette mthode est utile lorsque vous souhaitez crer une application de base de donnes pour manipuler des donnes pour lesquelles vous disposez dj dun schma XML. A partir dun paquet de donnes existant vers un nouveau schma XML que vous dfinissez. Cette mthode est utile lorsque vous souhaitez prsenter des informations de bases de donnes existantes dans XML, par exemple pour crer un nouveau systme de communication inter-entreprise. Entre un schma XML existant et un paquet de donnes existant. Cette mthode est utile lorsque vous disposez dun schma XML et dune base de donnes qui dcrivent tous deux les mmes informations et que vous souhaitez les faire travailler ensemble. Aprs avoir dfini le mappage, vous pouvez gnrer les fichiers de transformation pour la conversion des documents XML en paquets de donnes et vice-versa. Notez que seul le fichier de transformation est directionnel : un mme mappage peut tre utilis pour gnrer la fois la transformation de XML vers le paquet de donnes et du paquet de donnes vers XML.
Remarque
Le mappeur XML se base sur deux .DLL (midas.dll et msxml.dll). Assurez-vous que ces .DLL sont toutes deux installes avant dessayer dutiliser
26-4
Guide du dveloppeur
xmlmapper.exe. De plus, msxml.dll doit tre enregistr en tant que serveur COM. Vous pouvez effectuer cet enregistrement au moyen de Regsvr32.exe.
26-5
construite partir de ces sous-nuds), activez la case cocher Traduction dfinie par lutilisateur. Vous devrez crire par la suite un gestionnaire dvnement pour effectuer la transformation sur des nuds dfinis par lutilisateur. Aprs avoir spcifi la manire dont les nuds doivent tre mapps, choisissez Crer|Paquet de donnes partir de donnes XML. Le paquet de donnes correspondant est automatiquement gnr et affich dans la vue Paquet de donnes. Si vous gnrez un document XML partir dun paquet de donnes, choisissez Crer|Donnes XML partir dun paquet de donnes. Une bote de dialogue apparat dans laquelle vous pouvez spcifier les noms des balises et des attributs dans le document XML qui correspondent aux champs, enregistrements et ensembles de donnes du paquet de donnes. Pour les valeurs des champs, vous indiquez si elles sont mappes sur un lment balis avec une valeur ou sur un attribut en les nommant de faon diffrente. Les noms commenant par un symbole @ mappent sur des attributs de la balise qui correspond lenregistrement, tandis que les noms ne commenant pas par un symbole @ mappent sur des lments baliss qui possdent des valeurs et sont imbriqus dans llment de lenregistrement. Si vous avez charg la fois un document XML et un paquet de donnes (fichier densemble de donnes client), assurez-vous de slectionner les nuds correspondants dans le mme ordre. Les nuds correspondants devraient apparatre les uns ct des autres dans le tableau situ en haut de la page Affectations. Lorsque vous avez charg ou gnr le document XML et le paquet de donnes puis slectionn les nuds apparaissant dans le mappage, le tableau en haut de la page Affectations devrait reflter le mappage que vous avez dfini.
2 Si vous gnrez un paquet de donnes, vous pouvez galement utiliser les boutons radio de la section Format du paquet de donnes cr. Ces boutons vous permettent dindiquer comment le paquet de donnes sera utilis : comme ensemble de donnes, comme paquet delta pour lapplication de mises jour, ou comme paramtres transmettre un fournisseur avant de lire des donnes. 3 Cliquez sur Crer et tester le fichier de transformation pour gnrer une version en mmoire de la transformation. Le mappeur XML affiche le document XML qui serait gnr pour le paquet de donnes dans la vue
26-6
Guide du dveloppeur
Paquet de donnes ou le paquet de donnes qui serait gnr pour le document XML dans le volet Document XML.
4 Enfin, choisissez Fichier|Enregistrer|Transformation pour enregistrer le fichier de transformation. Le fichier de transformation est un fichier XML spcial (avec lextension .xtr) qui dcrit la transformation que vous avez dfinie.
Vous pouvez aussi utiliser TXMLTransform pour convertir un paquet de donnes qui apparat au format XML en un document XML arbitraire.
Spcification de la transformation
Il existe deux mthodes pour spcifier la transformation qui convertit le document XML en paquet de donnes : Utilisez la proprit TransformationFile pour indiquer un fichier de transformation cr laide de xmlmapper.exe. Utilisez la proprit TransformationDocument si vous disposez dune interface IDOMDocument pour la transformation.
26-7
TXMLTransform vrifie ces proprits dans lordre indiqu ci-dessus. Ainsi, il recherche dabord un nom de fichier dans la proprit TransformationFile. Si TransformationFile est une chane vide, il vrifie la proprit TransformationDocument.
26-8
Guide du dveloppeur
begin CurNode := SrcNode.firstChild; Value := Value + CurNode.nodeValue; while CurNode <> SrcNode.lastChild do begin CurNode := CurNode.nextSibling; Value := Value + ; Value := Value + CurNode.nodeValue; end; end; end; end;
26-9
Pour TransformRead, la source est le fichier spcifi par la proprit XMLDataFile du fournisseur (toutefois, si vous affectez XMLDataFile une chane vide, vous pouvez spcifier le document source en utilisant TransformRead.XmlSource ou TransformRead.XmlSourceDocument). Pour TransformWrite, le source est gnr au niveau interne par le fournisseur lorsquil applique des mises jour.
26-10
Guide du dveloppeur
les donnes. Utilisez la mthode SetParams pour fournir ces paramtres dentre avant de lire les donnes partir du fournisseur. SetParams accepte deux arguments : une chane XML partir de laquelle extraire les valeurs des paramtres, et le nom dun fichier de transformation pour traduire ce code XML en paquet de donnes. SetParams utilise le fichier de transformation pour convertir la chane XML en paquet de donnes, puis extrait les valeurs des paramtres de ce paquet de donnes.
Remarque
Vous pouvez outrepasser lun quelconque de ces arguments si vous souhaitez spcifier le document ou la transformation dune autre manire. Il vous suffit de dfinir lune des proprits avec TransformSetParams pour indiquer les paramtres ou la transformation utiliser pour les convertir, puis daffecter largument que vous souhaitez outrepasser une chane vide lorsque vous appelez SetParams. Pour des dtails sur les proprits que vous pouvez utiliser, consultez Conversion de documents XML en paquets de donnes la page 26-7. Aprs avoir configur TransformGetData et spcifi les ventuels paramtres dentre, vous pouvez appeler la mthode GetDataAsXml pour rcuprer le code XML. GetDataAsXml envoie les valeurs de paramtres en cours au fournisseur, rcupre un paquet de donnes, le convertit en document XML puis renvoie ce document sous forme de chane de caractres. Vous pouvez enregistrer cette chane dans un fichier :
var XMLDoc: TFileStream; XML: string; begin XMLTransformClient1.ProviderName := Provider1; XMLTransformClient1.TransformGetData.TransformationFile := CustTableToCustXML.xtr; XMLTransformClient1.TransFormSetParams.SourceXmlFile := InputParams.xml; XMLTransformClient1.SetParams(, InputParamsToDP.xtr); XML := XMLTransformClient1.GetDataAsXml; XMLDoc := TFileStream.Create(Customers.xml, fmCreate or fmOpenWrite); try XMLDoc.Write(XML, Length(XML)); finally XMLDoc.Free; end; end;
26-11
Le nom dun fichier de transformation capable de convertir ces donnes XML en paquet delta dinsertion ou de suppression. En dfinissant le fichier de transformation laide de lutilitaire mappeur XML, vous indiquez si la transformation est destine un paquet delta dinsertion ou de suppression. Le nombre derreurs de mise jour qui peuvent tre tolres sans que lopration de mise jour ne soit abandonne. Si le nombre denregistrements qui ne peuvent pas tre insrs ou supprims est infrieur ce paramtre, ApplyUpdates renvoie le nombre derreurs relles. Si le nombre denregistrements qui ne peuvent pas tre insrs ou supprims est gal ce paramtre, lopration de mise jour tout entire est annule et aucune mise jour nest effectue. Lappel suivant transforme le document XML Customers.xml en paquet delta et applique toutes les mises jour quel que soit le nombre derreurs :
StringList1.LoadFromFile(Customers.xml); nErrors := ApplyUpdates(StringList1.Text, CustXMLToInsert.xtr, -1);
26-12
Guide du dveloppeur
III
Partie III
Partie
Les chapitres de cette section prsentent les concepts et les connaissances ncessaires la construction dapplications distribues sur Internet.
Remarque
Les composants dcrits dans cette section ne sont pas disponibles dans toutes les ditions de Delphi.
27
Chapitre 27
Chapitre
Les applications serveur Web tendent les fonctions et les possibilits des serveurs Web existants. Une application serveur Web reoit des messages de requte HTTP du serveur Web, effectue les actions demandes par les messages et formule des rponses qui sont renvoyes au serveur Web. Toute opration qui peut seffectuer dans une application Delphi peut tre incorpore dans une application serveur Web. Delphi propose deux architectures diffrentes pour dvelopper des applications serveur Web : lagent Web et WebSnap. Bien que ces deux architectures soient diffrentes, WebSnap et lagent Web ont de nombreux lments en commun. Larchitecture WebSnap se comporte comme un sur-ensemble de lagent Web. Elle propose des composants supplmentaires et de nouvelles caractristiques comme le concepteur de surface WebSnap (qui permet au dveloppeur dafficher le contenu dune page sans avoir excuter lapplication). Les applications dveloppes avec WebSnap peuvent contenir des composants agent Web alors que linverse nest pas vrai. Ce chapitre dcrit les caractristiques des architectures agent Web et WebSnap et donne des informations g nrales sur les applications client-serveur Internet.
27-1
Mise en cache des modules Web afin dobtenir des meilleurs temps de rponse. Nanmoins, ces deux approches prsentent des avantages et inconvnients. Les principales diffrences entre ces deux technologies sont prsentes dans le tableau suivant :
Tableau 27.1 Agent Web
Compatibilit ascendante.
Disponibles dans des applications multiplates-formes (CLX). Un seul module Web par application.
Un seul rpartiteur Web par application. Des composants spcialiss pour crer le contenu (gnrateurs de page, composants InternetExpress et les composants service Web). Pas de gestion des scripts.
Pas de gestion intgre des pages nomm es. Pas de gestion des sessions.
Chaque requte doit tre gre explicitement en utilisant un lment action ou un composant dauto-rpartition. Seuls des composants spcialiss permettent de prvisualiser le contenu quils gnrent. Lessentiel du dveloppement se fait de manire non visuelle.
Pour davantage dinformations sur lagent Web, voir chapitre 28, Utilisation de lagent Web. Pour davantage dinformations sur WebSnap, voir chapitre 29, Utilisation de WebSnap.
27-2
Guide du dveloppeur
Terminologie et standard
Terminologie et standard
La majorit des protocoles contrlant lactivit Internet sont dfinis dans des documents Request for Comment (RFC) grs par le comit IETF (Internet Engineering Task Force), comit charg de lingnierie et du dveloppement des protocoles Internet. Plusieurs documents RFC vous apporteront dutiles prcisions pour le dveloppement dapplications Internet : Le RFC822, Standard for the format of ARPA Internet text messages, dcrit la structure et le contenu des en-ttes de messages. Le RFC1521, MIME (Multipurpose Internet Mail Extensions) Part One: Mechanisms for Specifying and Describing the Format of Internet Message Bodies, dcrit la mthode utilise pour encapsuler et transporter des messages multiparties et multiformats. Le RFC1945, Hypertext Transfer Protocol HTTP/1.0, dcrit une mthode de transfert utilise pour distribuer des documents hypermdia collaboratifs. Le comit IETF propose une bibliothque des documents RFC sur le site Web www.ietf.cnri.reston.va.us
La premire partie (qui nappartient pas techniquement lURL) identifie le protocole (http). Cette partie peut spcifier dautres protocoles comme https (secure http), ftp, etc. La partie Hte identifie la machine qui excute le serveur Web et lapplication serveur Web. Bien que cela napparaisse pas dans lillustration prcdente, cette partie peut se substituer au port qui reoit les messages. Gnralement, il nest pas ncessaire de spcifier un port, car le protocole implique le numro de port. La partie Nom script spcifie le nom de lapplication serveur Web. Il sagit de lapplication laquelle le serveur Web transmet les messages. A la suite du nom de script apparat le chemin. Ce dernier identifie la destination du message dans lapplication serveur Web. Les valeurs du chemin peuvent faire rfrence des rpertoires de la machine hte, aux noms de composants qui rpondent des messages spcifiques ou tout autre mcanisme
27-3
utilis par lapplication serveur Web pour diviser le traitement des messages entrants. La partie Requte contient un ensemble de valeurs nommes. Ces valeurs et leurs noms sont dfinis par lapplication serveur Web.
URI et URL
LURL est un sous-ensemble dune URI (Uniform Resource Identifier) dfini dans le document RFC1945. Les applications serveur Web gnrent frquemment un contenu partir de plusieurs sources ; le rsultat final ne rside pas un emplacement prcis, mais est cr si ncessaire. Les URI peuvent dcrire des ressources nayant pas demplacement dfini.
La premire ligne identifie la requte comme un GET. Un message de requ te GET demande lapplication serveur Web de renvoyer le contenu associ lURI suivant le mot GET (ici /art/gallery.dll/animals?animal=doc&color=black). La dernire partie de la premire ligne indique que le client utilise le standard HTTP 1.0. La deuxime ligne est len-tte Connection qui indique que la connexion ne doit pas tre ferme tant que la requte na pas t traite. La troisime ligne est len-tte User-Agent qui donne des informations sur le programme qui a gnr la demande. La ligne suivante dfinit len-tte Host et indique le nom et le port de lhte sur le serveur qui est contact pour constituer la connexion. La dernire ligne est un en-tte Accept qui numre les types de donnes que le client accepte en rponse.
27-4
Guide du dveloppeur
ont accs de nombreuses options pour automatiser la recherche et la prsentation des informations au format HTML. Avant de construire une application serveur Web, il est utile de comprendre comment le client effectue une requte et comment le serveur y rpond.
qui dcrit un serveur HTTP dans le domaine www.TSite.com. Le client contacte www.TSite.com, se connecte au serveur HTTP et lui transmet une requte. La requte est semblable celle-ci :
GET /art/gallery.dll/animals?animal=dog&color=black HTTP/1.0 Connection: Keep-Alive User-Agent: Mozilla/3.0b4Gold (WinNT; I) Host: www.TSite.com:1024 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
27-5
serveur attend lexcution du programme. Lorsque la DLL se referme, elle retransmet le contenu au serveur. Dans ces trois cas, le programme agit sur la requte et effectue les actions demandes par le programmeur : accder aux bases de donnes, faire des recherches ou des calculs simples, crer ou slectionner des documents HTML, etc.
Type dapplication
DLL Microsoft Server (ISAPI) DLL Netscape Server (NSAPI) DLL Serveur Apache Application console CGI Application Windows CGI
Objet requte
TISAPIRequest TISAPIRequest TCGIRequest TWinCGIRequest
Objet rponse
TISAPIResponse TISAPIResponse TApacheResponse TCGIResponse TWinCGIResponse
TApacheApplication TApacheRequest
27-6
Guide du dveloppeur
ISAPI et NSAPI
Une application serveur Web ISAPI ou NSAPI est une DLL qui est charge par le serveur Web. Les informations de requte client sont transmises la DLL sous forme de structure et values par les objets TISAPIApplication, qui crent les objets TISAPIRequest et TISAPIResponse. Chaque message de requte est automatiquement trait dans un thread dexcution distinct.
Apache
Une application serveur Web Apache est une DLL qui est charge par le serveur Web. Les informations de requte client sont transmises la DLL sous forme de structure et values par les objets TApacheApplication, qui crent les objets TApacheRequest et TApacheResponse. Chaque message de requte est automatiquement trait dans un thread distinct.
CGI autonome
Une application serveur Web CGI autonome est une application console qui reoit les informations de requte client sur lentre standard et transmet les rsultats au serveur sur la sortie standard. Les donnes sont valu es par lobjet TCGIApplication, qui cre le rpartiteur, et par les objets TCGIRequest et TCGIResponse. Chaque message de requte est trait dans une instance distincte de lapplication.
Win-CGI autonome
Une application serveur Web Win-CGI autonome est une application Windows qui reoit les informations de requte client depuis un fichier de configuration (INI) cr par le serveur et crit les rsultats dans un fichier que le serveur transmet au client. Le fichier INI est valu par lobjet TCGIApplication, qui cre le rpartiteur, et par les objets TWinCGIRequest et TWinCGIResponse. Chaque message de requte est trait dans une instance distincte de lapplication.
27-7
1 Votre projet tant ouvert dans lEDI, dfinissez les points darrt comme pour dboguer nimporte quel excutable. 2 Choisissez Excuter|Excuter. Cela affiche la fentre console du serveur COM qui constitue votre application serveur Web. A la premire excution de votre application, elle recense le serveur COM afin que le dbogueur dapplication Web puisse y accder. 3 Slectionnez Outils|Dbogueur dapplication Web. 4 Choisissez le bouton D marrer. Cela affiche la page ServerInfo dans votre navigateur par dfaut. 5 La page ServerInfo propose une liste droulante de tous les excutables dbogueur dapplication Web recenss. Slectionnez votre application dans la liste droulante. Si vous ne la trouvez pas dans la liste droulante, essayez de dmarrer votre application comme excutable. Votre application doit tre excute au moins une fois pour se recenser. Si vous ne trouvez toujours pas votre application dans la liste droulante, essayez de ractualiser la page Web (en effet, parfois le navigateur Web cache cette page, ce qui empche de voir les modifications rcentes). 6 Une fois votre application slectionne dans la liste droulante, choisissez le bouton de dmarrage. Cela dmarre votre application dans le dbogueur dapplication Web, qui vous donne des dtails sur les messages de requte et de rponse changs entre votre application et le dbogueur dapplication Web.
27-8
Guide du dveloppeur
1 Dans lEDI choisissez Projet|Ajouter un nouveau projet. Cela ouvre un nouveau projet sans fermer le projet en cours (votre application serveur Web). 2 Excutez lexpert permettant de crer une application agent Web ou WebSnap et choisissez le type dapplication crer. 3 Choisissez Voir|Gestionnaire de projet pour afficher le gestionnaire de projet. 4 Dans le gestionnaire de projet, faites glisser toutes les units constituant votre application serveur Web de lancien projet vers celui que vous venez dajouter. Ne dplacez pas les units qui implmentent la fentre console.
Vous disposez maintenant dune application serveur Web du type appropri.
Certains serveurs Web ncessitent dautres modifications pour que vous ayez le droit de lancer lapplication hte de cette manire. Pour davantage dinformations, consultez la documentation de votre serveur Web. Si vous utilisez Windows 2000 avec IIS 5, vous trouverez des dtails sur toutes les modifications ncessaires pour configurer correctement vos droits ladresse suivante : http://community.borland.com/article/0,1410,23024,00.html Une fois renseignes les zones Application hte et Paramtres dexcution, vous pouvez dfinir vos points darrt afin que lorsque le serveur passe un message de requte votre DLL, un point darrt soit activ et que vous puissiez effectuer le dbogage normalement.
Astuce
Remarque
Avant de lancer le serveur Web avec les paramtres dexcution de votre application, vrifiez qu il nest pas dj ouvert.
27-9
1 Dans la zones Outils dadministration du panneau de configuration, choisissez Stratgie de scurit locale. Dveloppez Stratgies locales et slectionnez Attribution des droits utilisateur. Dans le volet de droite, double-cliquez sur Agir en tant que partie du systme dexploitation. 2 Slectionnez Ajouter pour ajouter un utilisateur la liste, ajoutez votre compte utilisateur en cours. 3 Redmarrez pour que les modifications prennent effet.
27-10
Guide du dveloppeur
28
Chapitre 28
Chapitre
Les composants agent Web (placs dans longlet Internet de la palette des composants) vous permettent de crer des gestionnaires dvnements qui sont associs une URL spcifique. Une fois le traitement achev, il est possible de construire par programme des documents HTML ou XML et de les transfrer au client. Vous pouvez utiliser les composants agent Web pour le dveloppement dapplications multiplates-formes. Souvent, le contenu des pages Web provient de bases de donnes. Vous pouvez utiliser des composants Internet pour grer automatiquement les connexions aux bases de donnes, en permettant une seule DLL de grer simultanment plusieurs connexions de bases de donnes adaptes aux threads. Les sections suivantes de ce chapitre expliquent comment utiliser les composants agent Web pour crer une application serveur Web.
1 Slectionnez Fichier|Nouveau|Autre. 2 Dans la bote de dialogue Nouveaux lments, choisissez longlet Nouveau et slectionnez Application serveur Web. 3 Dans la bote de dialogue qui saffiche, vous pouvez slectionner un type dapplication serveur Web :
ISAPI et NSAPI : la slection de ce type dapplication configure votre projet comme une DLL proposant les mthodes exportes attendues par le serveur Web. Len-tte de la bibliothque est galement inclus dans le fichier projet et les entres ncessaires dans les listes des clauses uses et exports du fichier projet.
28-1
Apache : la slection de ce type dapplication configure votre projet comme une DLL proposant les mthodes exportes attendues par le serveur Web Apache. Len-tte de la bibliothque est galement inclus dans le fichier projet et les entres ncessaires dans les listes des clauses uses et exports du fichier projet. Excutable autonome CGI : la slection de ce type dapplication configure votre projet comme une application en mode console et ajoute les entres ncessaires la clause uses du fichier projet. Excutable autonome Win-CGI : si vous slectionnez ce type dapplication, le projet est configur comme une application Windows et ajoute les entres ncessaires la clause uses du fichier projet. Excutable dbogueur dapplication Web : la slection de ce type dapplication configure un environnement permettant de dvelopper et de tester des applications serveur Web. Ce type dapplication nest pas conu pour tre dploy. Choisissez le type dapplication serveur Web qui communique avec le type de serveur Web que votre application utilisera. Ceci cre un nouveau projet configur pour utiliser les composants Internet et contenant un module Web vide.
Module Web
Le module Web (TWebModule) est un descendant de TDataModule ; il sutilise de la mme faon pour offrir un contrle centralis pour les rgles de gestion et les composants non visuels dans lapplication Web. Ajoutez tout gnrateur de contenu que votre application utilise pour gnrer les messages de rponse. Il peut sagir de gnrateurs de contenu intgrs, tels que TPageProducer, TDataSetPageProducer, TDataSetTableProducer, TQueryTableProducer et TInetXPageProducer ou de descendants de TCustomContentProducer que vous avez crs vous-mme. Si votre application gnre des messages de rponse incluant des donnes extraites dune base de donnes, vous pouvez ajouter des composants daccs aux donnes ou des composants particuliers pour crire un serveur Web qui fait office de client dans une application de bases de donnes multiniveaux. Le module Web ne se contente pas de stocker les composants non visuels et des rgles de gestion : il fait aussi office de rpartiteur en associant les messages de requte HTTP reus aux lments daction qui gnrent les rponses ces requtes. Vous avez peut-tre dj un module de donnes paramtr avec les composants non visuels et les rgles de gestion que vous souhaitez utiliser dans votre application Web. Vous pouvez alors remplacer le module Web par ce module de donnes : il suffit de supprimer le module Web gnr automatiquement et de le remplacer par votre module de donnes. Ajoutez ensuite un composant TWebDispatcher votre module de donnes pour quil puisse rpartir les messages de requte vers les lments daction, comme le ferait un module Web.
28-2
Guide du dveloppeur
Si vous voulez modifier la faon dont les lments daction sont choisis pour rpondre aux messages de requte HTTP reus, drivez un nouveau composant rpartiteur de TCustomWebDispatcher et ajoutez-le au module de donnes. Votre projet ne peut contenir quun rpartiteur. Il peut sagir soit du module Web automatiquement gnr lorsque vous crez le projet, soit du composant TWebDispatcher que vous ajoutez au module de donnes qui remplace le module Web. Si un second module de donnes contenant un rpartiteur est cr lors de lexcution, lapplication serveur Web gnrera une erreur.
Remarque
Le module Web que vous paramtrez en phase de conception est en fait un modle. Dans les applications ISAPI et NSAPI, chaque message de requ te cre un thread distinct. Une instance du module Web et de son contenu est cre dynamiquement pour chaque thread. Le module Web dune application serveur Web base de DLL est mis en mmoire cache pour une utilisation ultrieure afin damliorer les temps de rponse. Ltat du rpartiteur et sa liste dactions ne sont pas rinitialiss entre deux requtes. Si vous activez ou dsactivez des lments daction en cours dexcution, vous obtiendrez des rsultats imprvisibles lorsque ce module sera utilis pour les requtes client suivantes.
Attention
Nincluez pas lunit forms dans la clause uses du projet aprs lunit CGIApp ou ISAPIApp. Forms dclare en effet une autre variable globale du nom dApplication et, si elle apparat aprs lunit CGIApp ou ISAPIApp, Application sera initialise comme un objet de type erron.
28-3
Rpartiteur Web
Le rpartiteur est dcrit plus en dtail dans la section Rpartiteur Web la page 28-4.
Figure 28.1 Structure dune application serveur
Les lments daction grent la lecture de la requte et lassemblage dun message de rponseLes composants gnrateur de contenu spcialiss aident les lments daction gnrer dynamiquement le contenu des rponses de messagepouvant inclure du code HTML personnalis ou un autre contenu MIME. Les gnrateurs de contenu se servent dautres gnrateurs de contenu ou descendants de THTMLTagAttributes, pour crer le contenu du message de rponse. Pour plus dinformations sur les gnrateurs de contenu, voir Gnration du contenu des messages de rponse la page 28-14. Si vous crez le client Web dans une application de base de donnes multiniveau, votre application serveur Web peut inclure dautres composants rpartition automatique qui reprsentent des informations de bases de donnes codes en XML et des classes de manipulation de base de donnes codes en javascript. Si vous crez un serveur qui implmente un service Web, votre application serveur Web peut contenir un composant dauto-rpartition qui transmet les messages utilisant le protocole SOAP un excutant qui les interprte et les excute. Le rpartiteur fait appel ces composants rpartition automatique pour traiter le message de requte aprs avoir essay tous ses lments daction. Lorsque tous les lments daction (ou composants rpartition automatique) ont cr leur rponse en remplissant lobjet TWebResponse, le rpartiteur transmet le rsultat lapplication Web qui le transmet en retour au client via le serveur Web.
Rpartiteur Web
Si vous utilisez un module Web, il agit comme un rpartiteur Web. Si vous utilisez un module de donnes existant, vous devez lui ajouter un composant (TWebDispatcher). Le rpartiteur gre un ensemble dlments daction qui savent
28-4
Guide du dveloppeur
Rpartiteur Web
comment rpondre certains types de messages de requte. Lorsque lapplication Web transmet un objet requte et un objet rponse au rpartiteur, il choisit un ou plusieurs lments daction pour rpondre la requte.
28-5
Elments daction
Si, aprs contrle de tous les lments daction et des composants rpartition automatique spcialement recenss, le message de requte nest pas trait, le rpartiteur appelle llment daction par dfaut. Il nest pas ncessaire que cet lment daction corresponde lURL de destination ou la mthode de requte. Si le rpartiteur atteint la fin de la liste dactions (y compris lventuelle action par dfaut) et quaucune action na t dclenche, rien nest retourn au serveur. Le serveur met alors fin la connexion avec le client. Si la requ te est traite par les lments daction, le rpartiteur gnre un vnement AfterDispatch. Ceci reprsente la dernire possibilit pour votre application de vrifier que la rponse a t gnre et de faire les modifications requises.
Elments daction
Chaque lment daction (TWebActionItem) effectue une tche prcise en rponse un type spcifique de message de requte. Les lments daction peuvent rpondre entirement une requte ou ny rpondre que partiellement et laisser dautres lments daction finir le travail. Les lments daction peuvent envoyer le message de rponse HTTP pour la requte, ou simplement prparer une partie de la rponse, que dautres lments daction termineront. Si une rponse est complte par les lments daction mais non envoye, lapplication serveur Web envoie le message de rponse.
URL de destination
Le rpartiteur compare la valeur de la proprit PathInfo dun lment daction celle de la proprit PathInfo du message de requte. La valeur de cette proprit doit tre le chemin daccs lURL pour toutes les requtes que llment daction est prt grer. Par exemple dans cette URL
http://www.TSite.com/art/gallery.dll/mammals?animal=dog&color=black
28-6
Guide du dveloppeur
Elments daction
Utilisez les informations de chemin daccs pour indiquer o votre application Web doit rechercher des informations au moment de traiter des requtes ou pour subdiviser votre serveur Web en sous-services logiques.
Si vous modifiez la proprit Enabled dune action lors de lexcution, vous risquez dobtenir des rsultats imprvisibles pour les requtes suivantes. Si lapplication serveur Web est une DLL qui met en cache les modules Web, ltat initial ne sera pas rinitialis pour la requte suivante. Utilisez lvnement BeforeDispatch pour vous assurer que tous les lments daction sont correctement initialiss.
28-7
Elments daction
Si la requ te na pas t entirement honore lorsque le rpartiteur atteint la fin de la liste dlments daction, il excute llment daction par dfaut. Le rpartiteur ne vrifie pas les proprits PathInfo et MethodType de llment daction par dfaut. Il ne vrifie pas non plus la proprit Enabled de llment daction par dfaut. Vous pouvez ainsi vous assurer que llment daction par dfaut nest appel qu en dernier recours en mettant sa proprit Enabled False. Llment daction par dfaut doit tre prt grer toute requte dtecte, mme si ce nest quen retournant un code derreur signalant une URI ou une valeur de proprit MethodType non valide. Si llment daction par dfaut ne peut pas traiter la requ te, aucune rponse nest transmise au client Web.
Attention
Si vous modifiez la proprit Default dune action lors de lexcution, vous risquez dobtenir des rsultats imprvisibles pour la requte active. Si la proprit Default dune action ayant dj t dclenche passe True, cette action ne sera pas rvalue et le rpartiteur ne la dclenchera pas lorsqu il atteindra la fin de la liste dactions.
28-8
Guide du dveloppeur
composants gnrateur de contenu, voir Gnration du contenu des messages de rponse la page 28-14.
Envoi de la rponse
Un gestionnaire dvnement OnAction peut renvoyer la rponse au client Web laide des mthodes de lobjet TWebResponse. Cependant, si aucun lment daction nenvoie la rponse au client, elle sera envoye par lapplication serveur Web si le dernier lment daction ayant analys la requte indique que la requte a t traite.
28-9
Informations demandes
Informations sur les options de communication disponibles. Informations identifies par la proprit URL. Informations den-tte issues dun message GET quivalent, sans le contenu de la rponse. Lapplication serveur doit mettre les donnes incluses dans la proprit Content, de la faon approprie. Lapplication serveur doit remplacer la ressource indique par la proprit URL par les donnes de la proprit Content. Lapplication serveur doit supprimer ou masquer la ressource identifie par la proprit URL. Lapplication serveur doit confirmer la rception de la requte.
La proprit Method peut indiquer toute autre mthode que le client Web demande au serveur.
28-10
Guide du dveloppeur
Il nest pas ncessaire que lapplication serveur Web fournisse une rponse pour toutes les valeurs possibles de la proprit Method. Le standard HTTP exige cependant quelle sache rpondre aux requtes GET et HEAD. La proprit MethodType indique si la valeur de Method est GET (mtGet), HEAD (mtHead), POST (mtPost), PUT (mtPut) ou une autre chane (mtAny). Le rpartiteur fait correspondre la valeur de la proprit MethodType avec celle de la proprit MethodType de tous les lments daction.
28-11
Les lments daction qui gnrent la rponse la requte client renseignent les proprits de lobjet rponse. Dans certains cas, il suffit de retourner un code derreur ou de passer la requte une autre URI. Mais dans dautres cas, il faut parfois effectuer des calculs tels que llment daction doit aller chercher des informations dautres sources puis les regrouper avant de les prsenter au format final. La plupart des messages de requte ncessitent une rponse, mme sil ne sagit que dindiquer au client que lopration demande a t effectue.
28-12
Guide du dveloppeur
Description du contenu
Plusieurs proprits dcrivent le contenu de la rponse. ContentType fournit le type de support de la rponse, ContentVersion le numro de version de ce support. ContentLength indique la longueur de la rponse. Si le contenu est cod (par compression des donnes, par exemple), indiquez-le dans la proprit ContentEncoding. Si le contenu provient dune autre URI, indiquez-le dans la proprit DerivedFrom. Si la valeur du contenu tient compte de la date, utilisez les proprits LastModified et Expires pour indiquer si le contenu est toujours valide. La proprit Title peut fournir des informations descriptives sur le contenu.
Si la valeur de la proprit ContentStream nest pas nil, la proprit Content est ignore.
28-13
Envoi de la rponse
Si vous tes sr que le traitement du message de requte est termin, vous pouvez envoyer une rponse directement depuis le gestionnaire dvnementOnAction. Lobjet rponse offre deux mthodes denvoi de rponses : SendResponse et SendRedirect. Appelez SendResponse pour envoyer une rponse avec le contenu et les proprits den-tte de lobjet TWebResponse. Si votre action doit se limiter orienter le client Web vers une autre URI, utilisez la mthode SendRedirect, plus efficace. Si aucun des gestionnaires dvnements nenvoie de rponse, lapplication Web lenvoie lorsque le rpartiteur se referme. Cependant, si aucun lment daction nindique quil a trait la rponse, lapplication ferme la connexion au client Web sans envoyer de rponse.
28-14
Guide du dveloppeur
Modles HTML
Un modle HTML est une suite de commandes HTML et de balises HTML transparentes. Une balise HTML transparente est au format :
<#Nom_de_balise Param1=Valeur1 Param2=Valeur2 ...>
Les crochets (< et >) dfinissent la porte de la balise. Le signe # vient immdiatement aprs le crochet ouvrant, sans espace entre les deux. Il indique au gnrateur de page que la chane qui suit est une balise HTML transparente. Le nom de la balise suit immdiatement le signe dise, sans espace entre les deux. Le nom de la balise peut tre tout identificateur valide ; il identifie le type de conversion reprsent par la balise. Aprs un nom de balise, une balise HTML transparente peut parfois comporter des paramtres fournissant des informations sur la conversion effectuer. Chaque paramtre est au format Paramtre=Valeur. Aucun espace ne doit figurer entre le nom du paramtre, le signe gal et la valeur. Les paramtres sont spars par des espaces. Les crochets (< et >) rendent la balise transparente pour les navigateurs HTML qui ne reconnaissent pas la syntaxe #Nom_de_balise. Bien que vous puissiez crer vos propres balises HTML transparentes pour reprsenter tout type dinformations traites par votre gnrateur de page, plusieurs noms de balises associs des valeurs du type de donnes TTag sont mis votre disposition. Ces noms de balise prdfinis corrrespondent aux commandes HTML susceptibles de varier dun message de rponse lautre. Ils sont dcrits dans le tableau suivant :
Nom de la balise
Link Image Table
Valeur de TTag
tgLink tgImage tgTable
ImageMap
tgImageMap
Object
tgObject
Embed
tgEmbed
Tout autre nom de balise est associ tgCustom. Le gnrateur de page noffre aucun traitement spcifique des noms de balises prdfinis. Ils sont simplement fournis pour aider vos applications structurer le processus de conversion des tches les plus frquentes.
28-15
Remarque
Les noms de balises prdfinis tiennent compte de la diffrence entre majuscules et minuscules.
28-16
Guide du dveloppeur
Le gestionnaire dvnement OnHTMLTag remplace la balise personnalise (<#UserName>) dans le code HTML lors de lexcution :
procedure WebModule1.PageProducer1HTMLTag(Sender : TObject;Tag: TTag; const TagString: string; TagParams: TStrings; var ReplaceText: string); begin if CompareText(TagString,UserName) = 0 then ReplaceText := TPageProducer(Sender).Dispatcher.Request.Content; end;
Cet exemple utilise un gestionnaire dvnement OnAction pour appeler le gnrateur de contenu et assigner le contenu de message de rponse. Vous navez pas besoin dcrire un gestionnaire dvnement OnAction si vous assignez la proprit HTMLFile du gnrateur de page lors de la conception. Dans ce cas, vous pouvez simplement assigner PageProducer1 comme valeur de la proprit Producer de llment daction pour obtenir le mme effet que le gestionnaire dvnement OnAction ci-dessus.
Prenons comme exemple une application qui affiche des pages de calendrier en rponse des messages de requ te indiquant le mois et lanne afficher. Chaque page de calendrier contient une image suivie de lanne et du mois,
28-17
placs entre des images des mois prcdent et suivant, puis du calendrier luimme. Limage finale aurait laspect suivant :
Le gestionnaire dvnement OnHTMLTag du premier gnrateur de page recherche le mois et lanne dans le message de requte. Au moyen de ces informations et du fichier de modle, il : Remplace <#MonthlyImage> par <#Image Month=Janvier Year=1997>. Remplace <#TitleLine> par <#Calendar Month=Dcembre Year=1996 Size=Small> Janvier 1997 <#Calendar Month=Fvrier Year=1997 Size=Small>. Remplace <#MainBody> par <#Calendar Month=Janvier Year=1997 Size=Large>. Le gestionnaire dvnement OnHTMLTag du gnrateur de page suivant utilise le contenu cr par le premier gnrateur de page et remplace la balise <#Image Month=Janvier Year=1997> par la balise HTML <IMG> approprie. Un troisime gnrateur de page convertit les balises #Calendar en tableaux HTML.
28-18
Guide du dveloppeur
28-19
correspond celui dun champ dun ensemble de donnes en la valeur courante de ce champ. Pour plus dinformations sur lutilisation gnrale des gnrateurs de page, voir Utilisation du composant gnrateur de page la page 28-14. Pour utiliser un gnrateur de page ensemble de donnes, ajoutez un composant TDataSetPageProducer au module Web et attribuez sa proprit DataSet lensemble de donnes dont les valeurs de champ doivent tre affiches dans le contenu HTML. Crez un modle HTML qui dcrit le rsultat de votre gnrateur de page ensemble de donnes. Pour chaque valeur de champ afficher, incluez une balise de la forme
<#NomChamp>
dans le modle HTML, o NomChamp spcifie le nom du champ de lensemble de donnes dont la valeur doit tre affiche. Lorsque votre application appelle la mthode Content, ContentFromString ou ContentFromStream, le gnrateur de page ensemble de donnes remplace les balises reprsentant les champs par les valeurs courantes de ces derniers.
28-20
Guide du dveloppeur
28-21
des objets orients donnes dune application de bases de donnes conventionnelle, la proprit DataSource na pas tre dfinie. Ceci sexplique par le fait que TDataSetTableProducer gnre sa propre source de donnes en interne. Vous pouvez choisir la valeur de DataSet en phase de conception si votre application Web affiche toujours des enregistrements issus du mme ensemble de donnes. Vous devez dfinir la proprit DataSet lors de lexcution si lensemble de donnes varie en fonction des informations contenues dans le message de requte HTTP.
28-22
Guide du dveloppeur
29
Chapitre 29
Chapitre
Utilisation de WebSnap
WebSnap tend lagent Web avec de nouveaux composants, des experts et des vues qui simplifient la conception dapplications Web contenant des pages Web complexes orientes donnes. WebSnap gre plusieurs modules ainsi que les scripts ct serveur, ce qui simplifie le dveloppement en quipe. Les composants rpartiteur grent automatiquement les requ tes pour le contenu des pages, la validation des formulaires HTML et les requtes dimages dynamiques. De nouveaux composants, les adaptateurs, permettent de dfinir une interface sous forme de scripts avec les rgles de gestion de votre application. Ainsi, lobjet TDataSetAdapter permet de crer des composants ensembles de donnes manipulables par scripts. Vous pouvez utiliser de nouveaux composants gnrateur pour concevoir rapidement des formulaires ou des tableaux complexes orients donnes ou utiliser XSL pour gnrer une page. Le composant session vous permet de conserver une trace des utilisateurs finaux. Le composant liste dutilisateurs permet de grer des utilisateurs, des mots de passes et des droits daccs. Lexpert application Web permet de gnrer rapidement une application personnalise avec les composants dont vous avez besoin. Lexpert module de page Web vous permet de crer un module dfinissant une nouvelle page de votre application. Lexpert module de donnes Web vous permet de crer un conteneur pour des composants rutiliss dans votre application Web. Les vues de module de page peuvent visualiser le rsultat dun script ct serveur sans avoir excuter lapplication. Longlet Prvisualisation affiche la page dans un navigateur incorpor. La vue Rsultat HTML affiche le HTML gnr. Les vues Arborescence XSL et Arborescence XML simplifient la manipulation du XML et du XSL. Pour grer une quipe de dveloppeurs, vous pouvez utiliser la gestion multimodule de WebSnap afin de dcomposer une application en units dveloppables sparment. Lors de la cration dun nouveau module de page, lexpert module de page peut crer un fichier modle externe. Ce fichier modle
Utilisation de WebSnap
29-1
externe peut tre modifi hors de lEDI et test sans avoir recompiler lapplication. Les sections suivantes de ce chapitre dcrivent comme utiliser les composants WebSnap pour crer une application serveur Web.
1 Slectionnez Fichier|Nouveau|Autre. 2 Dans la bote de dialogue Nouveaux lments, slectionnez longlet WebSnap et choisissez Application WebSnap. 3 La bote de dialogue qui saffiche attend les informations suivantes :
Le type de serveur Le type de module dapplication Web Les options de module dapplication Web Les composants de lapplication
Type de serveur
Slectionnez lun des types suivants dapplication serveur Web : ISAPI et NSAPI : la slection de ce type dapplication configure votre projet comme une DLL proposant les mthodes exportes attendues par le serveur Web. Len-tte de la bibliothque est galement inclus dans le fichier projet, ainsi que les entres ncessaires dans les listes des clauses uses et exports du fichier projet. Apache : la slection de ce type dapplication configure votre projet comme une DLL proposant les mthodes exportes attendues par le serveur Web Apache. Len-tte de la bibliothque est galement inclus dans le fichier projet, ainsi que les entres ncessaires dans les listes des clauses uses et exports du fichier projet. Excutable autonome CGI : la slection de ce type dapplication configure votre projet comme une application en mode console et ajoute les entres ncessaires la clause uses du fichier projet. Excutable autonome Win-CGI : si vous slectionnez ce type dapplication, le projet est configur comme une application Windows et ajoute les entres ncessaires la clause uses du fichier projet. Excutable dbogueur dapplication Web : la slection de ce type dapplication configure un environnement permettant de dvelopper et de tester des applications serveur Web. Ce type dapplication nest pas conu pour tre dploy.
29-2
Guide du dveloppeur
Choisissez le type dapplication serveur Web qui communique avec le type de serveur Web que votre application utilisera.
Le type AdapterPageProducer ne gre que JScript. HTML. Quand le type de gnrateur slectionn utilise un modle HTML, ce groupe est visible. XSL. Quand le type de gnrateur slectionn utilise un modle XSL (comme TXSLPageProducer), ce groupe est visible. Nouveau fichier. Cochez cette option si vous voulez quun fichier modle soit cr et gr comme faisant partie de lunit. Le fichier modle gr apparat alors dans le gestionnaire de projet et utilise le mme nom et le mme emplacement que le fichier source de lunit. Ne cochez pas cette option si
Utilisation de WebSnap
29-3
vous voulez utiliser les proprits du composant gnrateur (en gnral, les proprits HTMLDoc et HTMLFile). Modle. Si loption Nouveau fichier est coche, choisissez le contenu par dfaut du fichier modle en utilisant la liste droulante Modle. Le modle D faut affiche le titre de lapplication, le titre de la page et un lien hypertexte vers les pages publies. Page. Saisissez le nom de la page et le titre du module de page. Le nom de page est utilis pour rfrencer la page dans une requte HTTP ou dans la logique mme de lapplication. Le titre est le nom que lutilisateur final voit quand la page est affiche dans un navigateur. Publi. Cochez cette option pour rpondre automatiquement aux requtes HTTP dont le paramtre pathinfo correspond au nom de la page. Nom de connexion requis. Cochez cette option pour obliger lutilisateur sidentifier avant de pouvoir accder la page.
Composants dapplication
Les composants dapplication fournissent les fonctionnalits de lapplication Web. Si, par exemple, vous utilisez un composant rpartiteur dadaptateur, celui-ci gre automatiquement la validation des formulaires HTML et renvoie automatiquement les images gres dynamiquement. Un rpartiteur de page affiche automatiquement le contenu dune page quand la zone pathinfo dune requte HTTP contient le nom de la page. La slection du bouton Composants affiche une bote de dialogue dans laquelle vous pouvez slectionner un ou plusieurs composants dapplication : Adaptateur dapplication. Contient des informations sur lapplication comme le titre. Le type par dfaut est TApplicationAdapter. Adaptateur utilisateur final. Contient des informations sur lutilisateur, comme le nom, les droits daccs et sil est connect. Le type par dfaut est TEndUserAdapter. Vous pouvez galement slectionner TEndUserSessionAdapter. Rpartiteur de page. Examine la valeur de la zone pathinfo de la requte HTTP et appelle le module de page appropri pour renvoyer le contenu dune page. Le type par dfaut est TPageDispatcher. Rpartiteur dadaptateur. Gre automatiquement la validation des formulaires HTML et les requtes dimage dynamique en appelant des composants action adaptateur ou champs. Le type par dfaut est TAdapterDispatcher. Actions de rpartition. Vous permet de dfinir une collection dlments action pour grer les requtes bases sur pathinfo et le type de mthode. Les lments action appellent des vnements dfinis par lutilisateur ou demandent le contenu des composants gnrateur de page. Le type par dfaut est TWebDispatcher.
29-4
Guide du dveloppeur
Modules Web
Service de localisation de fichiers. Permet de contrler le chargement de fichiers modle et de fichiers include de scripts pendant lexcution de lapplication Web. Le type par dfaut est TLocateFileService. Service de sessions. Sutilise pour stocker des informations sur un utilisateur final qui sont ncessaires pour un court laps de temps. Les sessions vous permettent par exemple de garder la trace des utilisateurs connects et de dconnecter automatiquement un utilisateur aprs une certaine priode dinactivit. Le type par dfaut est TSessionService. Service de liste dutilisateurs. Stocke une liste des utilisateurs autoriss, de leurs mot de passe et droits daccs. Le type par dfaut est TWebUserList. Pour chacun de ces composants, les types de composant lists sont les types par dfaut livrs avec Delphi. Les utilisateurs peuvent crer leur propres types de composant ou utiliser des composants proposs par des tiers.
Modules Web
Il y a quatre types de modules Web : TWebAppPageModule TWebAppDataModule TWebPageModule TWebDataModule
Le module application Web (TWebAppPageModule ou TWebAppDataModule) sert de conteneur aux composants de lapplication qui remplissent des fonctions portant sur lapplication prise comme un tout : la rpartition des requ tes, le gestion des sessions ou la gestion de la liste des utilisateurs. Une application ne peut contenir quun seul module dapplication de ce type. Le module de page Web (TWebPageModule) fournit le contenu dune page alors que le module de donnes Web (TWebDataModule) sert de conteneur des composants utiliss dans divers endroits de votre application. Vous pouvez ventuellement inclure plusieurs modules de pages Web ou modules de donnes Web dans le module dapplication Web.
Utilisation de WebSnap
29-5
Modules Web
Utilisez un module de donnes Web comme conteneur pour les composants partags par votre application. Vous pouvez, par exemple, placer un composant ensemble de donnes dans un module de donnes et y accder depuis : un module de page affichant une grille, et un module de page affichant un formulaire de saisie.
29-6
Guide du dveloppeur
Modules Web
Nom de page
Les modules de page Web ont un nom de page qui sert rfrencer la page dans une requte HTTP ou dans la logique de lapplication. Un fabricant dans lunit du module de page Web spcifie le nom de page pour le module de page Web.
Modle de gnrateur
La plupart des gnrateurs de page utilisent un modle. Gnralement, les modles HTML contiennent du code HTML statique mlang des balises transparentes ou du script excut ct serveur. Quand les gnrateurs de page crent leur contenu, ils remplacent les balises transparentes par les valeurs appropries et excutent les scripts serveur afin de gnrer le HTML qui est affich dans le navigateur du client. XSLPageProducer constitue une exception. Il utilise des modles XSL, qui contiennent du XSL et non du HTML. Les modles XSL ne grent pas les balises transparentes ou les scripts serveur. Les modules de page Web peuvent avoir un fichier modle associ qui est gr comme faisant partie de lunit. Un fichier modle gr apparat dans le gestionnaire de projet et utilise le mme nom et le mme emplacement que le fichier source de lunit. Si le module de page Web na pas de fichier modle associ, ce sont les proprits du composant gnrateur qui spcifient le modle.
Utilisation de WebSnap
29-7
Adaptateurs
IPageResult. Cette interface donne accs au rsultat gnr par un module de page. Cette interface gre trois types de rsultat : Contenu HTTP, Redirection HTTP et Page Include. IGetDefaultAction. Cette interface rcupre lventuelle action dadaptation associe au module de page.
Adaptateurs
Les adaptateurs permettent de crer une interface avec les donnes de lapplication. Ils vous permettent dinsrer du code en langage de script dans une page et de rcuprer des informations en appelant les adaptateurs depuis le code script. Vous pouvez, par exemple, utiliser un adaptateur pour dfinir les champs de donnes afficher dans une page HTML. Une page HTML scripte peut alors contenir du contenu HTML et des instructions en script qui rcupre la valeur de ces champs.
Champs
Les champs sont des composants quutilise le gnrateur de page pour rcuprer des donnes de votre application afin den afficher le contenu dans une page Web. Les champs peuvent galement servir rcuprer une image. Dans ce cas, le champ renvoie ladresse de limage crite dans la page Web. Quand une page affiche son contenu, une requte envoye lapplication Web demande au rpartiteur dadaptateur de rechercher limage relle depuis le composant champ.
29-8
Guide du dveloppeur
Gnrateurs de page
Actions
Les actions sont des composants qui excutent des commandes pour ladaptateur. Quand un gnrateur de page gnre sa page, le langage de script appelle les composants action dadaptation pour renvoyer le nom de laction ainsi que tous les paramtres ncessaires lexcution de la commande. Par exemple, soit un bouton dun formulaire HTML devant supprimer une ligne dune table. Il renvoie dans la requte HTTP le nom de laction associ au bouton et un paramtre indiquant le numro de ligne. Le rpartiteur dadaptateur recherche le composant action ainsi nomm et lui transmet le numro de ligne comme paramtre de laction.
Erreurs
Les adaptateurs grent une liste des erreurs se produisant lors de lexcution dune action. Les gnrateurs de page peuvent accder cette liste afin de les afficher dans la page Web renvoye par lapplication lutilisateur final.
Enregistrements
Certains composants adaptateur, comme TDataSetAdapter, reprsentent plusieurs lignes. Ladaptateur propose alors une interface de scriptage qui permet de parcourir les lignes. Certains adaptateurs grent la pagination et ne permettent de parcourir que les lignes de la page en cours.
Gnrateurs de page
Vous pouvez utiliser les gnrateurs de page afin de produire le contenu pour un module de page Web. Vous pouvez aussi utiliser des gnrateurs comme dans des applications WebBroker, en associant le gnrateur un lment daction dun rpartiteur Web. Lutilisation des modules de page Web offre les avantages suivants : La possibilit de prvisualiser la disposition des pages sans avoir excuter lapplication. Lassociation entre un nom de page et un module permet au rpartiteur de page dappeler automatiquement le gnrateur de page.
Modles
Les gnrateurs proposent les fonctionnalits suivantes : Ils gnrent du contenu HTML. Ils peuvent rfrencer un fichier externe en utilisant la proprit HTMLfile ou une chane interne avec la proprit HTMLDoc.
Utilisation de WebSnap
29-9
Sils sont utiliss en association avec un module de page Web, le modle peuttre un fichier associ une unit. Ils gnrent dynamiquement du HTML qui peut tre insr dans le modle en utilisant des balises transparentes ou du scriptage actif. Les balises transparentes sutilisent de la mme manire que dans une application agent Web. Pour plus dinformations, voir Conversion des balises HTML transparentes la page 28-16. La gestion du scriptage actif vous permet dincorporer du code JavaScript ou VBscript dans la page HTML.
Scriptage actif
WebSnap utilise le scriptage actif pour implmenter les scripts serveur. Le scriptage actif est une technologie cre par Microsoft permettant lutilisation dun langage de script par des objets dapplication via des interfaces COM. Microsoft fournit deux langages de script, VBScript et JScript. La gestion dautres langages est propose par dautres fournisseurs.
Moteur de script
La proprit ScriptEngine du gnrateur de page identifie le moteur de script qui doit valuer les scripts placs dans un modle.
Blocs de script
Les blocs de script sont dlimits par <% et %>. Le moteur de script value tout texte plac lintrieur dun bloc de script. Le rsultat est intgr au contenu du gnrateur de page. Le gnrateur de page crit le texte plac hors dun bloc de script aprs avoir traduit les balises transparentes incorpores. Les blocs de script peuvent galement contenir du texte, ce qui permet de dfinir le texte en sortie laide de conditions ou de boucles. Par exemple, le bloc JScript suivant gnre une liste de cinq lignes numrotes :
<ul> <% for (i=0;i<5;i++) { %> <li>Item <% Response.Write(i) %></li> <% } %> </ul>
29-10
Guide du dveloppeur
Cration de scripts
Les dveloppeurs peuvent profiter des caractristiques de WebSnap pour gnrer des scripts automatiquement.
Experts modles
Lors de la cration dune nouvelle application WebSnap ou dun module de page, les experts WebSnap proposent une zone Modle qui permet de slectionner le contenu initial dun modle de module de page. Par exemple, le modle nomm Dfaut gnre du code JScript affichant le titre de lapplication, le nom de la page et des liens vers les pages publies.
TAdapterPageProducer
TAdapterPageProducer produit des formulaires et des tableaux en gnrant du HTML et du code JScript. Le code JScript gnr appelle les objets adaptateurs pour rcuprer la valeur des champs, les paramtres des champs image et les paramtres daction.
Utilisation de WebSnap
29-11
Quand le modle inclut un script contenu dans une autre page, le script est valu par la page qui inclut le script. Utilisez le code suivant pour inclure une version non value de page1.
<!-- #include page="page1" -- >
Objets scriptables
Les objets scriptables sont des objets VCL ou CLX qui peuvent tre rfrencs par un script. Pour que des objets VCL ou CLX soient accessibles par script, vous devez recenser une interface IDispatch avec lobjet dans le moteur de script actif. Les objets suivants sont manipulables par script : Application. Lobjet application (qui peut tre null) donne accs ladaptateur dapplication du module dapplication Web. Le bloc de code JScript suivant crit le titre de lapplication :
<%= Application.Title %>
EndUser. Lobjet EndUser donne accs ladaptateur utilisateur final du module dapplication Web. Le bloc de code JScript suivant crit le nom de lutilisateur final :
<%= EndUser.DisplayName %>
Session. Lobjet session donne accs lobjet session du module dapplication Web. Le bloc de code JScript suivant crit lID de la session :
<%= Session.SessionID %>
Pages. Les objets page (Pages) donnent accs aux pages de lapplication. Le bloc de code JScript suivant crit des liens vers toutes les pages publies :
<% e = new Enumerator(Pages) for (; !e.atEnd(); e.moveNext()) { if (e.item().Published) { Response.Write(<A HREF=" + e.item().HREF +"> + e.item().Title + </A>) } } %>
Remarquez que la page prvisualisation de lditeur naffiche pas un rsultat correct pour ce bloc de script. En effet, les objets pages sont toujours vides la conception car les fabricants de module de page Web nont pas t recenss. Modules. Les objets module donnent accs aux modules de lapplication. Le bloc de code JScript suivant crit le contenu dun champ adaptateur dans un module nomm DM :
<%= Modules.DM.Adapter1.Field1.DisplayText %>
Page. Lobjet Page donne accs la page en cours. Le bloc de code JScript suivant crit le titre de la page en cours :
<%= Page.Title %>
29-12
Guide du dveloppeur
Producer. Lobjet Producer donne accs au gnrateur de page du module de page Web. Le bloc de code JScript suivant value une balise transparente avant dcrire le contenu :
<% Producer.Write(Voici une balise <#TAG>) %>
Remarquez que la page prvisualisation de lditeur naffiche pas un rsultat correct pour ce bloc de script. En effet, les gestionnaires dvnements qui gnralement remplacent les balises transparentes ne sont excuts que lorsque lapplication sexcute. Response. Lobjet Response donne accs WebResponse. Utilisez cet objet quand vous voulez viter demployer la substitution de balises.
<% Response.Write(Hello World!) %>
Request. Lobjet Request donne accs WebRequest. Le bloc de code JScript suivant crit le pathinfo.
<%= Request.PathInfo %>
Objets adaptateur. Il est possible de rfrencer sans qualification tous les composants de ladaptateur de la page en cours. Pour les adaptateurs dautres modules, utilisez une qualification avec les objets modules. Le bloc de code JScript suivant affiche la valeur du champ FirstName de toutes les lignes de Adapter1 :
<% e = new Enumerator(Adapter1.Records) %> <% for (; !e.atEnd(); e.moveNext()) %> <% { %> <p><%= Adapter1.FirstName.DisplayText %> <% } %>
WebContext
Avant de traiter la requte, le module dapplication Web initialise un objet WebContext (de type TWebContext). WebContext est une variable thread qui donne un accs global aux variables utilises par les composants traitant la requte. Par exemple, WebContext contient les objets TWebResponse et TWebRequest ainsi que les objets adaptateur de requte et de rponse dcrits plus bas dans cette section.
Utilisation de WebSnap
29-13
Composants rpartiteur
Les composants rpartiteur du module dapplication Web contrlent le flux de lapplication. Les rpartiteurs dterminent comment traiter certains types de messages de requte HTTP en analysant la requte HTTP. Le composant rpartiteur dadaptateur (TAdapterDispatcher) recherche un champ de contenu ou un champ de requte qui identifie un composant action dadaptation ou un composant dadaptation de champ image. Si le rpartiteur dadaptateur trouve un composant, il transmet le contrle au composant. Le composant rpartiteur Web (TWebDispatcher) gre une collection des lments action (TWebActionItem) qui savent grer certains types de messages de requte HTTP. Le rpartiteur Web recherche un lment action correspondant la requte. Sil en trouve un, il transmet le contrle cet lment action. Le rpartiteur Web recherche galement les composants dauto-rpartition qui peuvent grer la requ te. Le composant rpartiteur de page (TPageDispatcher) examine la proprit PathInfo de lobjet TWebRequest, en y recherchant le nom dun module de page Web recens. Si le rpartiteur trouve le nom dun module de page Web, il transmet le contrle ce module de page Web.
29-14
Guide du dveloppeur
Quand lapplication Web value le script, lattribut src HTML contiendra les informations ncessaires lidentification du champ ainsi que les paramtres dont le composant champ peut avoir besoin pour rcuprer limage. Le HTML rsultat aura la forme suivante :
<img src="?_lEspece No=90090&__id=DM.Adapter1.Graphic" alt="(GRAPHIC)">
Quand le navigateur envoie lapplication Web une requte HTTP pour obtenir cette image, le rpartiteur dadaptateur est capable de dterminer que le champ Graphic de Adapter1 dans le module DM, doit tre appel avec le paramtre Espece No=90090. Le rpartiteur dadaptateur appelle le champ Graphic pour crire la rponse HTTP approprie. Le script suivant construit un lment <A> faisant rfrence laction EditRow de Adapter1 dans la page appele Details :
<a href="<%=Adapter1.EditRow.LinkToPage("Details", Page.Name).AsHREF%>">Edit...</a>
Quand lutilisateur final clique sur ce lien hypertexte et que le navigateur envoie une requte HTTP, le rpartiteur dadaptateur peut dterminer que laction EditRow de Adapter1 dans le module DM, doit tre appele avec le paramtre Espece No=903010. Le rpartiteur dadaptateur indique galement que la page Edit doit tre affiche si laction est correctement excute et que la page Grid doit tre affiche si lexcution de laction choue. Il appelle ensuite laction EditRow pour rechercher la ligne modifier et la page nomme Edit est appele pour gnrer une rponse HTTP. La figure suivante illustre comment les composants adaptateur sont utiliss pour gnrer du contenu.
Figure 29.1 Flux de la gnration du contenu
Utilisation de WebSnap
29-15
Requtes action
Lobjet requte action est responsable de la dcomposition de la requte HTTP afin dobtenir les informations n cessaires lexcution dune action dadaptation. Les types dinformations ncessaires lexcution dune action dadaptation peuvent tre : Le nom du composant. Identifie le composant action dadaptation. Le mode dadaptation. Les adaptateurs peuvent dfinir un mode. Par exemple, TDataSetAdapter gre les modes modification, insertion et consultation. Une action dadaptation peut sexcuter diffremment selon le mode. Par exemple, avec TDataSetAdapter, laction Apply ajoute un nouvel enregistrement en mode insertion et actualise lenregistrement en mode modification. Page de russite. La page de russite indique la page afficher si laction arrive sexcuter. Page dchec. Indique la page afficher en cas derreur lors de lexcution de laction. Paramtres de requte action. Identifie les paramtres ncessaires laction dadaptation. Par exemple, laction Apply de TDataSetAdapter a besoin de la valeur de cl identifiant lenregistrement actualiser. Valeurs de champ dadaptation. Ce sont les valeurs des champs dadaptation transmis dans la requte HTTP lors de la validation dun formulaire HTML. Les valeurs de champ peuvent tre les nouvelles valeurs saisies par lutilisateur final, les valeurs initiales du champ dadaptation ou des fichiers tlchargs. Cls denregistrement . Si un formulaire HTML apporte des modifications plusieurs enregistrements, les cls utilises par le composant action dadaptation sont ncessaires pour identifier de manire unique chacun des enregistrements afin que laction dadaptation soit effectue sur chaque enregistrement. Par exemple, quand laction Apply de TDataSetAdapter est effectue sur plusieurs enregistrements, les cls denregistrement sont utilises pour rechercher chaque enregistrement de lensemble de donnes avant dactualiser les champs de lensemble de donnes.
29-16
Guide du dveloppeur
Rponse action
Lobjet rponse action gnre une rponse HTTP pour le composant action dadaptation. Laction dadaptation indique le type de rponse en initialisant les proprits de lobjet ou en appelant des mthodes de lobjet action rponse. Les proprits sont : Options de redirection. Les options de redirection indiquent sil faut effectuer une redirection HTTP au lieu de renvoyer un contenu HTML. Statut dexcution. Linitialisation du statut dexcution russi fait que la rponse action par dfaut devient le contenu de la page de russite dfinie par la requte action. Parmi les mthodes de rponses action : RespondWithPag. Laction dadaptation appelle cette mthode quand un module de page Web particulier doit gnrer la rponse. RespondWithComponent. Laction dadaptation appelle cette mthode quand la rponse doit provenir du module de page Web contenant ce composant. RespondWithURL. Laction dadaptation appelle cette mthode quand la rponse est une redirection vers lURL spcifie. Quand la rponse est une page, lobjet rponse action tente dutiliser le rpartiteur de page pour gnrer le contenu de la page. Sil ne trouve pas le rpartiteur de page, il appelle directement le module de page Web. La figure suivante illustre comment les objets rponse action et requte action traitent une requte.
Figure 29.2 Requte et rponse action
Requte dimage
Lobjet requte dimage est responsable de la dcomposition de la requ te HTTP afin dobtenir les informations dont a besoin le champ dadaptation dimage
Utilisation de WebSnap
29-17
pour gnrer une image. Les informations reprsentes par la requte dimage sont : Nom du composant. Identifie le composant champ dadaptation. Paramtres de requte dimage. Identifie les paramtres ncessaires. Par exemple, lobjet TDataSetAdapterImageField a besoin des valeurs de cl ncessaires lidentification de lenregistrement contenant limage.
Rponse image
Lobjet rponse image contient lobjet TWebResponse. Les champs dadaptation rpondent une requte dadaptation en crivant une image dans lobjet rponse Web. La figure suivante illustre comment les champs dadaptation dimage rpondent une requte.
Figure 29.3 Rponse une requte dimage
29-18
Guide du dveloppeur
Il ajoute du contenu la rponse, puis permet dautres lments daction de poursuivre le travail. Il dlgue la requte dautres lments daction. Une fois que le rpartiteur a vrifi tous les lments daction, si le message na pas t correctement trait, il recherche dans les composants dauto-rpartition recenss nutilisant pas dlments daction. Ces composants sont spcifiques aux applications de bases de donnes multiniveaux. Si le message de requ te nest toujours pas entirement trait, le rpartiteur appelle llment daction par dfaut. Il nest pas ncessaire que llment daction par dfaut corresponde lURL cible ou la mthode de la requte.
Utilisation de WebSnap
29-19
Tutoriel WebSnap
Tutoriel WebSnap
La section suivante dcrit les tapes de la conception dune application WebSnap. Ralisez ce tutoriel pour vous familiariser avec larchitecture WebSnap et ses nouveaux concepts en incorporant les nouveaux composants rpartiteur et adaptateur dans un module de page Web. Lapplication WebSnap illustre la manire dutiliser les composants HTML WebSnap pour concevoir une application qui permet de modifier le contenu dune table.
4 Choisissez OK.
1 2 3 4 5
Remarque
Slectionnez Fichier|Tout enregistrer. Dans la zone Nom de fichier, entrez HomeU.pas et choisissez OK. Dans la zone Nom de fichier, entrez CountryU.pas et choisissez OK. Dans la zone Nom de fichier, entrez CountryTutorial.dpr et choisissez OK. Choisissez OK.
Enregistrez lunit et le projet dans le mme rpertoire car lapplication recherche le fichier HomeU.html dans le mme rpertoire que lexcutable.
1 Slectionnez Voir|Gestionnaire de projet. 2 Dans la fentre du gestionnaire de projet, dveloppez CountryTutorial.exe et double-cliquez sur lentre HomeU. 3 Dans la fentre de linspecteur dobjets (en bas gauche), slectionnez ApplicationAdapter dans la liste droulante.
29-20
Guide du dveloppeur
Tutoriel WebSnap
4 Dans longlet Proprits, saisissez Tutoriel Country dans la zone ApplicationTitle. 5 Cliquez sur longlet Prvisualiser dans la fentre de lditeur. Le titre de lapplication est affich en haut de la page.
1 Slectionnez Fichier|Nouveau|Autre. 2 Dans la bote de dialogue Nouveaux lments, slectionnez longlet WebSnap et choisissez Module de page WebSnap. 3 Dans la bote de dialogue, choisissez AdapterPageProducer comme valeur pour la liste Type de gnrateur. 4 Dans la zone Nom de page, saisissez CountryTable. 5 Laissez vide les autres champs, et laissez aux slections leur valeur par dfaut. 6 Choisissez OK.
1 Slectionnez Fichier|Enregistrer. 2 Dans la zone Nom de fichier, entrez CountryTableU.pas et choisissez OK.
Utilisation de WebSnap
29-21
Tutoriel WebSnap
5 Slectionnez un composant Table (cliquez dessus avec le bouton gauche de la souris et maintenez-le enfonc) et faites glisser le composant dans la fentre vue arborescente de lobjet. 6 Slectionnez un composant Session (cliquez dessus avec le bouton gauche de la souris et maintenez-le enfonc) et faites glisser le composant dans la fentre vue arborescente de lobjet. 7 Slectionnez le composant Session dans la fentre vue arborescente de lobjet. Cela affiche les valeurs du composant Session dans la fentre Inspecteur dobjets. 8 Dans linspecteur dobjets, initialisez la proprit AutoSessionName True. 9 Slectionnez le composant Table dans la fentre vue arborescente de lobjet. Cela affiche les valeurs du composant Table dans la fentre Inspecteur dobjets. 10 Dans linspecteur dobjets, initialisez les proprits suivantes :
Remarque
Active True. DatabaseName DBDEMOS. Dans la proprit Name, saisissez Country. TableName country.db.
Le composant Session est ncessaire car nous utilisons le composant BDE (TTable) dans une application multithread.
1 Dans la fentre vue arborescente de lobjet, dveloppez les nuds Session et DBDemos, et slectionnez le nud country.db. Ce nud correspond au composant table Country. 2 Cliquez avec le bouton droit de la souris sur le nud country.db et slectionnez Editeur de champs. 3 Cliquez avec le bouton droit de la souris dans la fentre diteur de CountryTable.Country et slectionnez la commande Ajouter tous les champs. 4 Slectionnez le champ Name dans la liste des champs ajouts. 5 Dans linspecteur dobjets, dveloppez la proprit ProviderFlags. 6 Initialisez la proprit pfInKey True.
29-22
Guide du dveloppeur
Tutoriel WebSnap
2 Slectionnez le composant DataSetAdapter (cliquez dessus avec le bouton gauche de la souris et maintenez-le enfonc) et faites glisser le composant dans la fentre vue arborescente de lobjet. 3 Dans linspecteur dobjets, modifiez les proprits suivantes :
Initialisez DataSet Country. Dans la proprit Name, saisissez Adapter.
1 Slectionnez Voir|Gestionnaire de projet. 2 Dans la fentre du gestionnaire de projet, dveloppez CountryTutorial.exe et double-cliquez sur lentre CountryTableU. 3 Slectionnez Voir|Arborescence dobjets. Le fentre vue arborescente de lobjet (ct gauche) devient active. 4 Dveloppez le composant AdapterPageProducer. 5 Cliquez avec le bouton droit de la souris sur lentre WebPageItems et choisissez Nouveau composant. 6 Dans la fentre Ajout de composant Web, slectionnez AdapterForm, puis choisissez OK. Un composant AdapterForm1 apparat dans la fentre vue arborescente de lobjet. 7 Cliquez avec le bouton droit de la souris sur AdapterForm1 et choisissez Nouveau composant. 8 Dans la fentre Ajout de composant Web, slectionnez AdapterGrid, puis choisissez OK. Un composant AdapterGrid1 apparat dans la fentre vue arborescente de lobjet. 9 Dans linspecteur dobjets, initialisez la proprit Adapter Adapter. 10 Pour prvisualiser la page, slectionnez longlet CountryTableU.pas dans la fentre diteur de code et choisissez en bas longlet Prvisualiser. Si longlet Prvisualiser napparat pas, faites dfiler les onglets. 11 Slectionnez longlet Script HTML pour visualiser le code JScript g nr par les composants WebSnap.
Utilisation de WebSnap
29-23
Tutoriel WebSnap
1 Dans la fentre vue arborescente de lobjet pour CountryTable, dveloppez le composant AdapterPageProducer et toutes ses branches. 2 Cliquez avec le bouton droit de la souris sur le composant AdapterGrid1 et choisissez Nouveau composant. Une entre AdapterCommandColumn1 est ajoute au composant AdapterGrid1. 3 Cliquez avec le bouton droit de la souris sur AdapterCommandColumn1 et choisissez Ajouter des commandes. 4 Slectionnez les commandes DeleteRow, EditRow et NewRow puis choisissez OK. 5 Pour prvisualiser la page, cliquez sur longlet Prvisualiser en bas de lditeur de code.
1 Slectionnez Fichier|Nouveau|Autre. 2 Dans la bote de dialogue Nouveaux lments, slectionnez longlet WebSnap et choisissez Module de page WebSnap. 3 Dans la bote de dialogue, choisissez AdapterPageProducer comme valeur pour la liste Type de gnrateur. 4 Dans la zone Nom de page, saisissez CountryForm. 5 Ne cochez pas la case Publi. 6 Laissez vide les autres champs et laissez aux slections leur valeur par dfaut. 7 Choisissez OK.
1 Slectionnez Fichier|Enregistrer. 2 Dans la zone Nom de fichier, entrez CountryFormU.pas et choisissez OK.
29-24
Guide du dveloppeur
Tutoriel WebSnap
1 Slectionnez Voir|Gestionnaire de projet. 2 Dans la fentre vue arborescente de lobjet, dveloppez CountryTutorial.exe et double-cliquez sur lentre CountryFormU. 3 Slectionnez Voir|Arborescence dobjets. La fentre vue arborescente de lobjet (ct gauche) devient active. 4 Dans la fentre vue arborescente de lobjet, dveloppez le composant AdapterPageProducer, cliquez avec le bouton droit de la souris sur WebPageItems et choisissez Nouveau composant. 5 Slectionnez AdapterForm puis choisissez OK. Une entre AdapterForm1 apparat dans la fentre vue arborescente de lobjet. 6 Cliquez avec le bouton droit de la souris sur WebPageItems et choisissez Nouveau composant. 7 Slectionnez AdapterFieldGroup puis choisissez OK. Une entre AdapterFieldGroup1 apparat dans la fentre vue arborescente de lobjet. 8 Dans linspecteur dobjets, initialisez la proprit Adapter CountryTable.Adapter. 9 Pour prvisualiser la page, cliquez sur longlet Prvisualiser en bas de lditeur de code.
1 Dans la fentre vue arborescente de lobjet, dveloppez le composant AdapterPageProducer et toutes ses branches. 2 Cliquez avec le bouton droit de la souris sur AdapterForm1 et choisissez Nouveau composant. 3 Slectionnez AdapterCommandGroup puis choisissez OK. Une entre AdapterCommandGroup1 apparat dans la fentre vue arborescente de lobjet. 4 Dans linspecteur dobjets, initialisez la proprit DisplayComponent AdapterFieldGroup1.
Utilisation de WebSnap
29-25
Tutoriel WebSnap
5 Cliquez avec le bouton droit de la souris sur lentre AdapterCommandGroup1 et choisissez Ajouter des commandes. 6 Slectionnez les commandes Cancel, Apply et Refresh Row puis choisissez OK. 7 Pour prvisualiser la page, slectionnez longlet CountryTableU.pas dans la fentre diteur de code et choisissez en bas longlet Prvisualiser. Si longlet Prvisualiser napparat pas, faites dfiler les onglets.
1 Dans la fentre vue arborescente de lobjet, dveloppez AdapterCommandGroup1 afin dafficher les entres CmdCancel, CmdApply et CmdRefreshRow. 2 Slectionnez CmdCancel. Dans linspecteur dobjets, saisissez CountryTable dans la proprit PageName. 3 Slectionnez CmdApply. Dans linspecteur dobjets, saisissez CountryTable dans la proprit PageName.
1 Slectionnez Voir|Gestionnaire de projet. 2 Dans la fentre vue arborescente de lobjet, dveloppez CountryTutorial.exe et double-cliquez sur lentre CountryTableU. 3 Dans la fentre vue arborescente de lobjet, dveloppez le composant AdapterPageProducer et toutes ses branches afin dafficher les entres CmdNewRow, CmdEditRow et CmdDeleteRow. Ces entres apparaissent en dessous de lentre AdapterCommandColumn1. 4 Slectionnez CmdNewRow. Dans linspecteur dobjets, saisissez CountryForm dans la proprit PageName. 5 Slectionnez CmdEditRow. Dans linspecteur dobjets, saisissez CountryForm dans la proprit PageName. 6 Pour vrifier que lapplication fonctionne et que tous les boutons effectuent une action, excutez lapplication.
Remarque
Il ny a pas dindication sur les erreurs de bases de donnes, par exemple un type incorrect. Pour le vrifier, essayez dajouter un nouveau pays avec un code incorrect (par exemple abc) dans le champ Area.
29-26
Guide du dveloppeur
Tutoriel WebSnap
1 Cliquez avec le bouton droit de la souris sur AdapterForm1 et choisissez Nouveau composant. 2 Slectionnez AdapterErrorList puis choisissez OK. Une entre AdapterErrorList1 apparat dans la fentre vue arborescente de lobjet. 3 Dplacez AdapterErrorList1 au-dessus de AdapterGrid1 (en le faisant glisser ou en utilisant la flche oriente vers le haut dans la barre doutils de la vue arborescente de lobjet). 4 Dans linspecteur dobjets, initialisez la proprit Adapter Adapter.
1 Excutez lapplication et placez-vous sur la page CountryTable. 2 Dmarrez une autre instance de votre navigateur et placez-vous sur la page CountryTable. 3 Cliquez sur le bouton DeleteRow pour la premire ligne de la grille. 4 Sans rafrachir dans le second navigateur, cliquez sur le bouton DeleteRow pour la premire ligne de la grille.
Utilisation de WebSnap
29-27
Tutoriel WebSnap
1 Excutez lapplication et placez-vous sur la page CountryTable. 2 Choisissez le bouton EditRow. 3 La page CountryForm est affiche. 4 Changez la zone Area en abc et choisissez le bouton Apply. 5 Un message derreur est affich au-dessus du premier champ.
Excution de lapplication
Une fois lapplication termine, pour lexcuter :
1 Slectionnez Excuter|Excuter. Une fentre est alors affiche. Les applications Excutable dbogueur dapplication Web sont des serveurs COM, la fentre qui apparat alors est la fentre console du serveur COM. A la premire excution du projet, les objets COM pouvant tre utiliss directement par le dbogueur dapplication Web sont recenss. 2 Slectionnez Outils|Dbogueur dapplication Web. 3 Cliquez sur le lien URL par dfaut pour afficher la page ServerInfo. La page ServerInfo affiche le nom de tous les excutables dbogueur dapplication Web recenss. 4 Slectionnez CountryTutorial dans la liste droulante et choisissez le bouton Go.
29-28
Guide du dveloppeur
30
Chapitre 30
Chapitre
XML (Extensible Markup Language) est un langage de balisage pour la description de donnes structures. Il ressemble au HTML, cette diffrence prs que les balises dcrivent la structure des informations et non leurs caractristiques daffichage. Les documents XML proposent un moyen simple, sous forme de texte, de stocker des informations qui peuvent tre simplement modifies ou recherches. Ils sont souvent utiliss comme format standard et transportable pour les donnes dapplications Web, les communication businessto-business, etc. Les documents XML donnent une vue hirarchise du corps des donnes. Les balises dun document XML dcrivent le rle et la signification de chaque lment de donnes, comme le montre le document suivant qui dcrit une collection dactions boursires :
<?xml version="1.0" standalone='yes' ?> <!DOCTYPE stockholdings SYSTEM sth.dtd> <StockList> <Stock exchange=NASDAQ> <name>Inprise (Borland)</name> <price>15.375</price> <symbol>INPR</symbol> <shares>100</shares> </Stock> <Stock exchange=NYSE> <name>Pfizer</name> <price>42.75</price> <symbol>PFE</symbol> <shares type=preferred>25</shares> </Stock> </StockList>
Cet exemple illustre des lments typiques dun document XML. La premire ligne est une instruction de traitement. Elle donne des informations sur la manire dinterprter le fichier mais ne contient aucune donne.
30-1
La seconde ligne, qui commence avec la balise <!DOCType>, est une dclaration de type de document. Elle nomme la structure du document et rfrence un autre fichier (sth.dtd) qui dcrit cette structure. Dans ce cas, la structure est dfinie par un fichier DTD (Document Type Definition, dfinition de type de document). Il existe dautres types de fichiers dcrivant la structure dun document XML : XDR (Reduced XML Data) et XSD (XML schemas). Les lignes restantes sont organises de manire hirarchique avec un seul nud racine (la balise <StockList>). Chaque nud de la hirarchie contient soit un ensemble de nuds enfant, soit une valeur texte. Certaines balises (les balises <Stock> et <shares>) contiennent des attributs qui sont des paires Nom=Valeur donnant des dtails sur la manire dinterprter la balise. Mme sil est possible de travailler directement sur le texte dun document XML, les applications utilisent gnralement des outils spcifiques pour analyser et modifier les donnes. Le W3C dfinit un ensemble dinterfaces standard pour reprsenter un document XML analys, appel le modle dobjet document (DOM, Document Object Model). Divers diteurs proposent des analyseurs XML qui implmentent les interfaces DOM afin de vous permettre dinterprter et de modifier plus facilement les documents XML. Delphi propose plusieurs outils pour manipuler les documents XML. Ces outils utilisent un analyseur DOM fournis par un tiers et simplifient lutilisation des documents XML. Ce chapitre dcrit ces outils.
Remarque
Outre les outils dcrits dans ce chapitre, Delphi dispose de composants et doutils assurant la conversion de documents XML en paquets de donnes afin de les intgrer dans larchitecture de base de donnes Delphi. Pour davantage dinformations sur les outils dintgration de documents XML dans des applications de bases de donnes, voir chapitre 26, Utilisation de XML dans les applications de bases de donnes.
30-2
Guide du dveloppeur
Pour utiliser dautres implmentations de DOM, vous devez crer une unit qui inclut une fonction renvoyant linterface de niveau le plus lev (IDOMImplementation). Votre unit doit recenser cette fonction en appelant la procdure globale RegisterDOMImplementation. Certains fournisseurs proposent des extensions aux interfaces standard DOM. Pour pouvoir utiliser ces extensions, lunit XMLDOM dfinit galement une interface IDOMNodeEx. IDOMNodeEx est un descendant de linterface standard IDOMNode qui inclut les plus utiles de ces extensions. Vous pouvez manipuler directement les interfaces DOM pour analyser et modifier des documents XML. Appelez simplement la fonction GetDOM pour obtenir une interface IDOMImplementation que vous pouvez utiliser comme point de dpart.
Remarque
Pour une description dtaille des interfaces DOM, voir les dclarations dans lunit XMLDOM, la documentation de votre fournisseur DOM ou les spcifications fournies par le site Web W3C (www.w3.org). Vous pouvez choisir dutiliser les classes XML Delphi plutt que de manipuler directement les interfaces DOM. Elles sont dcrites ci-dessous
Utilisation de TXMLDocument
Le composant TXMLDocument sert de point de dpart lutilisation dun document XML. Les tapes suivantes dcrivent comment utiliser TXMLDocument pour manipuler directement un document XML :
1 Ajoutez un composant TXMLDocument dans votre fiche ou votre module de donnes. TXMLDocument apparat dans la page Internet de la palette des composants. 2 Initialisez la proprit DOMVendor afin de spcifier limplmentation de DOM que vous souhaitez que le composant utilise pour analyser et modifier un document XML. Linspecteur dobjets liste tous les fournisseurs DOM recenss. Pour davantage dinformations sur les implmentations DOM, voir Utilisation du modle DOM la page 30-2. 3 Selon votre implmentation, vous pouvez initialiser la proprit ParseOptions pour configurer comment limplmentation sous-jacente de DOM analyse le document XML.
30-3
TXMLDocument gnre la hirarchie de nuds suivante : la racine de la hirarchie est le nud StockList. StockList contient deux nuds enfant qui correspondent aux deux balises Stock. Chacun de ces nuds enfant a quatre nuds enfant (name, price, symbol et shares). Ces quatre nuds enfant sont des nuds feuille, ou nuds terminaux. Le texte quils contiennent apparat comme valeur de chaque nud feuille.
Remarque
Cette division en nuds peut varier selon la manire dont limplmentation de DOM gnre les nuds pour un document XML. En particulier, un analyseur DOM traite tous les lments baliss comme des nuds internes. Des nuds supplmentaires (de type nud texte) sont crs pour les valeurs des nuds name, price, symbol et shares. Ces nuds texte apparaissent alors comme des enfants des nuds name, price, symbol et shares.
30-4
Guide du dveloppeur
Pour accder chaque nud, utilisez une interface IXMLNode en partant du nud racine qui est la valeur de la proprit DocumentElement du composant document XML.
30-5
Une version redfinie de AddChild vous permet de spcifier le domaine dappellation dans lequel le nom de balise est dfini. Vous pouvez supprimer des nuds enfant en utilisant les mthodes de la proprit ChildNodes. ChildNodes est une interface IXMLNodeList qui gre les enfants dun nud. Vous pouvez utiliser sa mthode Delete pour supprimer un seul nud enfant qui est identifi par sa position ou par son nom. Par exemple, le code suivant supprime la dernire cotation numre dans le document prcdent :
StockList := XMLDocument1.DocumentElement; StockList.ChildNodes.Delete(StockList.ChildNodes.Count - 1);
Lexpert Liaison de donnes XML gnre linterface suivante (ainsi que la classe qui limplmente) :
ICustomer = interface(IXMLNode) property id: Integer read Getid write Setid; property name: DOMString read Getname write Setname; property phone: DOMString read Getphone write Setphone; function Getid: Integer; function Getname: DOMString; function Getphone: DOMString; procedure Setid(Value: Integer); procedure Setname(Value: DOMString); procedure Setphone(Value: DOMString); end;
Chaque nud enfant est associ une proprit dont le nom correspond au nom de la balise du nud enfant et dont la valeur est linterface du nud enfant (si lenfant est un nud interne) ou la valeur du nud enfant (pour les nuds feuille). Chaque attribut de nud est galement associ une proprit, le nom de la proprit tant le nom de lattribut et sa valeur tant celle de lattribut.
30-6
Guide du dveloppeur
Outre la cration des interfaces (et des classes dimplmentation) pour chaque lment balis du document XML, lexpert cre une fonction globale pour obtenir une interface sur le nud racine. Si, par exemple, le code XML prcdent provient dun document dont le nud racine est la balise <Customers>, lexpert Liaison de donnes cre la routine globale suivante :
function GetCustomers(XMLDoc: TXMLDocument): ICustomers;
Lutilisation des interfaces gnres simplifie votre code car il reflte plus directement la structure du document XML. Ainsi, au lieu dcrire du code comme le suivant :
CustName := XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes['name'].Value;
Remarquez que les interfaces gnres par lexpert Liaison de donnes descendent toutes de IXMLNode. Cela signifie que vous pouvez toujours ajouter ou supprimer des nuds enfant comme si vous nutilisiez pas lexpert Liaison de donnes (voir Ajout et suppression de nuds enfant la page 30-5.) De plus, quand les nuds enfant reprsentent des lments rpts (tous les enfants dun nud ayant le mme type), le nud parent dispose de deux mthodes Add et Insert, pour ajouter dautres rptitions. Ces mthodes sont plus simples que AddChild car il nest pas ncessaire de spcifier le type de nud crer.
1 Choisissez Fichier|Nouveau|Autre et slectionnez licne intitule Expert Liaison de donnes XML dans la page Nouveaux. 2 Lexpert Liaison de donnes XML saffiche. 3 Dans la premire page de lexpert :
Spcifiez le document XML ou le schma pour lequel vous voulez gnrer les interfaces. Ce peut tre un document XML, un fichier de dfinition de type (.dtd), un fichier de donnes XML abrges (.xdr) ou un fichier schma XML (.xsd).
4 Choisissez le bouton Options pour spcifier la stratgie de nomenclature que doit utiliser lexpert lors de la gnration des interfaces et des classes dimplmentation ainsi que les correspondances par dfaut entre les types dfinis dans le schma et les types de donnes Pascal. 5 Passez la seconde page de lexpert. Cette page vous permet de fournir des informations dtailles sur chaque type de nud du document ou du schma. A gauche, se trouve une vue arborescente montrant tous les types de nuds du document. Pour les nuds complexes (les nuds ayant des enfants), la vue arborescente peut tre dveloppe pour afficher les lments enfant. Quand vous slectionnez un nud dans cette vue arborescente, le volet de
30-7
droite de la bote de dialogue affiche des informations sur ce nud et vous permet de spcifier comme lexpert doit le traiter. La zone Nom de la source affiche le nom du type de nud dans le schma XML. La zone Type de donnes affiche le type de la valeur du nud comme spcifie par le schma XML. La zone Documentation vous permet dassocier des commentaires au schma dcrivant lutilisation ou la fonction du nud. Si lexpert gnre du code pour le nud slectionn (cest--dire sil sagit dun type complexe pour lequel lexpert gnre une interface et une classe dimplmentation ou sil sagit dun des nuds enfant dun type complexe pour lequel lexpert gnre une proprit dans linterface du type complexe), vous pouvez utiliser la case cocher Gnrer la liaison pour spcifier si lexpert doit grer du code pour ce nud. Si vous ne cochez pas la case, lexpert ne gnre pas linterface et la classe dimplmentation pour un type complexe et ne cre pas de proprit dans linterface parent pour un nud enfant ou un attribut. La section Options de liaison vous permet de contrler le code gnr par lexpert pour llment slectionn. Pour tous les nuds, vous pouvez spcifier le Nom didentifiant (le nom de linterface gnre ou de la proprit). De plus, pour les interfaces, vous devez indiquer celle qui reprsente le nud racine du document. Pour les nuds reprsentant des proprits, vous pouvez spcifier le type de la proprit et, si la proprit nest pas une interface, sil sagit dune proprit en lecture seule.
6 Une fois spcifi le code que lexpert doit gnrer pour chaque nud, passez la troisime page. Cette page vous permet de choisir certaines options globales contrlant comment lexpert gnre le code, vous permet de prvisualiser le code qui sera gnr et vous permet de demander conserver vos options pour des utilisations ultrieures.
Pour prvisualiser le code gnr par lexpert, slectionnez une interface dans la liste Rcapitulatif des liaisons et visualisez la dfinition dinterface dans la zone Prvisualisation du code. Utilisez la zone Paramtres de liaison des donnes pour indiquer comment lexpert doit enregistrer vos choix. Vous pouvez stocker vos choix comme annotations dans un fichier schma associ au document (le fichier schma spcifi dans la premire page de la bote de dialogue) ou vous pouvez nommer un fichier schma autonome utilis uniquement par lexpert.
7 Quand vous choisissez Terminer, lexpert Liaison de donnes gnre une nouvelle unit dfinissant les interfaces et les classes dimplmentation pour tous les types de nuds de votre document XML. De plus, il cre une fonction globale qui attend un objet TXMLDocument et renvoie linterface sur le nud racine de la hirarchie de donn es.
30-8
Guide du dveloppeur
1 Placez un composant TXMLDocument dans votre fiche ou votre module de donnes. 2 Liez le TXMLDocument un document XML en initialisant la proprit FileName (vous pouvez aussi utiliser lexcution une chane XML avec la proprit XML). 3 Dans votre code, appelez la fonction globale gnre par lexpert pour obtenir une interface sur le nud racine du document XML. Si, par exemple, llment racine du document XML est la balise <StockList>, lexpert gnre par dfaut une fonction GetStockListType, qui renvoie une interface IStockListType :
var StockList: IStockListType; begin StockList := GetStockListType(XMLDocument1);
4 Cette interface a des proprits qui correspondent aux sous-nuds de llment racine du document ainsi que des proprits qui correspondent aux attributs de cet lment racine. Vous pouvez les utiliser pour parcourir la hirarchie du document XML, modifier les donnes du document, etc. 5 Pour enregistrer les modifications effectues en utilisant les interfaces gnres par lexpert, appelez la mthode SaveToFile du composant TXMLDocument ou lisez sa proprit XML.
30-9
30-10
Guide du dveloppeur
31
Chapitre 31
Chapitre
Les services Web sont des applications modulaires autonomes qui peuvent tre publies et invoques travers un rseau (comme le Web). Les services Web proposent des interfaces bien dfinies qui dcrivent les services fournis. Les services Web sont conus pour permettre un couplage flexible entre client et serveur. Cest--dire que limplmentation du serveur nimpose pas au client lutilisation dune plate-forme ou dun langage de programmation spcifique. Non seulement les interfaces sont dfinies en restant neutre quant au langage, mais elles sont galement conues pour utiliser diffrents mcanismes de communication. La gestion par Delphi des services Web est conue pour fonctionner en utilisant le protocole SOAP (Simple Object Access Protocol). SOAP est un protocole standard allg dfinissant lchange dinformations dans un environnement dcentralis et distribu. Il utilise le XML pour encoder des appels de procdures distantes et utilise gnralement HTTP comme protocole de communication. Pour davantage dinformations sur SOAP, voir ses spcifications ladresse suivante :
http://www.w3.org/TR/SOAP/ Remarque
Mme si la gestion par Delphi des services Web est base sur lutilisation de SOAP et dHTTP, le modle est suffisamment souple pour tre tendu afin dutiliser dautres protocoles dencodage ou de communications. La technologie base sur SOAP propose par Delphi est disponible pour le moment sous Windows et elle sera ultrieurement implmente sous Linux, afin de servir de base des applications distribues multiplates-formes. Il ny a pas de runtime client particulier installer comme cest le cas pour des applications distribues utilisant CORBA. Comme cette technologie repose sur des messages HTTP ; elle a cet avantage dtre disponible sur diverses machines. La gestion des services Web constitue le sommet de larchitecture multiplate-forme dapplications serveur Web de Delphi. Vous pouvez utiliser Delphi pour concevoir aussi bien des serveurs implmentant des services Web que des clients appelant ces serveurs. Si vous
31-1
utilisez Delphi pour crer les applications client et serveur, il est possible de partager entre elles une mme unit dfinissant les interfaces des services Web. De plus, vous pouvez avec Delphi crire des clients pour tout serveur qui implmente des services Web rpondant aux messages SOAP ou des serveurs Delphi publiant des services Web utilisables par des clients quelconques. Si le client ou le serveur nest pas crit en utilisant Delphi, vous pouvez publier ou importer les informations dcrivant les interfaces disponibles et la manire de les appeler en utilisant un document WSDL (Web Service Definition Language). Ct serveur, votre application peut publier un document WSDL dcrivant votre service Web. Ct client, un expert peut importer un document WSDL publi afin de vous proposer les dfinitions dinterfaces et les informations de connexion dont vous avez besoin.
THTTPSoapDispatcher et THTTPSoapPascalInvoker sont conus pour rpondre des messages HTTP contenant une requte SOAP. Cependant, larchitecture sousjacente est suffisamment gnrale pour quelle puisse grer dautres protocoles en lui substituant dautres composants rpartiteur et invocateur. Une fois votre interface invocable et les classes dimplmentation recenses, le rpartiteur et linvocateur grent automatiquement tous les messages qui identifient ces interfaces dans len-tte SOAP Action du message de requte HTTP.
1 Dfinissez les interfaces constituant votre service Web. Ces dfinitions dinterface doivent tre des interfaces invocables. Il est judicieux de crer vos dfinitions dinterface dans des units distinctes de celles contenant les classes dimplmentation. Ainsi, lunit qui dfinit les interfaces peut tre incluse la fois dans lapplication serveur et lapplication client. Dans la section initialisation de cette unit, ajoutez du code pour recenser les interfaces. Pour
31-2
Guide du dveloppeur
davantage dinformations sur la conception et le recensement dinterfaces invocables, voir Dfinition des interfaces invocables la page 31-4.
2 Si votre interface utilise des types complexes (non-scalaires), vous devez vous assurer quils peuvent tre transmis correctement. Lapplication service Web ne peut les grer quen utilisant des objets spciaux contenant des informations de type lexcution (RTTI) qui dcrivent leur structure. Pour davantage dinformations sur la cration et le recensement dobjets servant reprsenter des types complexes, voir Utilisation de types complexes dans des interfaces invocables la page 31-5. 3 Dfinissez et implmentez les classes qui implmentent les interfaces invocables dfinies ltape 1. Pour chaque classe dimplmentation, il peut tre ncessaire de crer une procdure de fabrication qui instancie la classe. Dans la section initialisation de lunit, ajoutez du code pour recenser la classe dimplmentation. Ce processus est dcrit dans la section Cration et recensement de limplmentation la page 31-6. 4 Si votre application dclenche une exception lors dune tentative dexcution dune requte SOAP, lexception est automatiquement encode dans un paquet derreur SOAP qui est renvoy la place du rsultat de lappel de mthode. Si vous voulez fournir davantage dinformations quun simple message derreur, vous pouvez crer vos propres classes dexception qui sont encodes et transmises au client. Pour davantage dinformations sur ce sujet, voir Cration de classes dexception personnalises pour les services Web la page 31-7. 5 Choisissez Fichier|Nouveau|Autre puis, dans la page Services Web, doublecliquez sur licne application service Web. Choisissez le type dapplication serveur Web que doit implmenter votre service Web. Pour davantage dinformations sur les diffrents types dapplications serveur Web, voir Types dapplications serveur Web la page 27-6. 6 Lexpert gnre une nouvelle application service Web qui inclut un composant invocateur (THTTPSOAPPascalInvoker) et un composant rpartiteur (THTTPSoapDispatcher). Linvocateur assure la conversion entres les messages SOAP et les mthodes des interfaces que vous avez dfinies ltape 1. Le rpartiteur rpond automatiquement aux messages SOAP entrant et les transmet linvocateur. Vous pouvez utiliser sa proprit WebDispatch pour identifier les messages de requ te HTTP que gre votre application. Cela suppose linitialisation de la proprit PathInfo pour indiquer la partie chemin daccs de toute URL dirige sur votre application, ainsi que la proprit MethodType afin dindiquer len-tte de mthode des messages de requte. 7 Choisissez Projet|Ajouter au projet et ajoutez votre application serveur Web les units cres lors des tapes 1 4. 8 Si vous voulez que votre application puisse fonctionner avec des clients qui nont pas t conus avec Delphi, publiez un document WSDL dfinissant vos interfaces et la manire de les appeler. Pour davantage dinformations sur la gnration dun document WSDL dcrivant votre application service Web, voir Gnration de documents WSDL pour une application service Web la page 31-8.
31-3
Pour quune application service Web puisse utiliser cette interface invocable, elle doit tre recense dans le registre dinvocation. Sur le serveur, lentre du registre dinvocation permet aux composants invocateur (THTTPSOAPPascalInvoker) didentifier la classe dimplmentation utiliser pour lexcution des appels de linterface. Dans les applications client, une entre du registre dinvocation permet aux composants de rechercher les informations identifiant linterface invocable et la manire de lappeler. Dans la section initialisation de lunit dfinissant linterface, ajoutez du code pour recenser linterface dans le registre dinvocation. Pour accder au registre dinvocation, ajoutez lunit InvokeRegistry la clause uses de votre unit. Lunit InvokeRegistry dclare une variable globale, InvRegistry, qui stocke en mmoire un catalogue de toutes les interfaces invocables recenses, de leurs classes dimplmentation et des fabricants qui crent des instances de ces classes dimplmentation. Une fois termine, lunit qui dfinit linterface doit ressembler ce qui suit :
unit EncodeDecode; interface type IEncodeDecode = interface(IInvokable) [{C527B88F-3F8E-1134-80e0-01A04F57B270}] function EncodeValue(Value: Integer): Double; stdcall; function DecodeValue(Value: Double): Integer; stdcall; end; implementation
31-4
Guide du dveloppeur
Les interfaces de services Web doivent avoir un domaine dappellation pour pouvoir sidentifier parmi toutes les interfaces possibles de tous les services Web, donc lors du recensement dune interface dans le registre dinvocation, un domaine dappellation est gnr automatiquement pour linterface. Le domaine dappellation par dfaut est cr partir dune chane qui identifie lapplication de manire unique (la variable AppNamespacePrefix), le nom de linterface et le nom de lunit dans laquelle elle est dfinie.
Astuce
Il est judicieux dutiliser, pour dfinir les interfaces invocables, une unit distincte de celle utilise pour les classes dimplmentation des interfaces. Cette unit peut ainsi tre incluse la fois dans lapplication serveur et dans lapplication client. Comme le domaine dappellation gnr contient le nom de lunit dans laquelle linterface est dfinie, le partage de la mme unit dans les applications serveur et client permet dutiliser automatiquement le mme domaine dappellation.
31-5
suivante provient de lunit XSBuiltIns. Elle recense TXSDateTime, un descendant de TRemotable qui reprsente des valeurs TDateTime :
RemClassRegistry.RegisterXSClass(TXSDateTime, XMLSchemaNameSpace, dateTime, True);
Le premier paramtre est le nom du descendant de TRemotable. Le deuxime est un identificateur de ressource uniforme (URI) qui identifie de manire unique le domaine dappellation de la nouvelle classe. Si vous spcifiez une chane vide, le registre peut gnrer lURI votre place. Le troisime paramtre est le nom du type de donnes que la classe reprsente. Si vous spcifiez une chane vide, le registre utilise simplement le nom de la classe. Le dernier paramtre indique si la valeur de linstance de classe peut tre transmise sous forme de chane (cest-dire si vous avez implment les mthodes XSToNative et NativeToXS).
Astuce
Il est judicieux dimplmenter et de recenser les descendants de TRemotable dans une unit distincte du reste de votre application serveur, y compris des units qui dclarent et recensent les interfaces invocables. Vous pouvez, ainsi, utiliser lunit dfinissant votre type la fois dans le client et dans le serveur et vous pouvez galement utiliser le type dans plusieurs interfaces. Si vous utilisez des tableaux dynamiques pour les paramtres, vous navez pas besoin de crer une classe distante pour les reprsenter, mais vous devez les recenser dans le registre des classes distantes. Si, par exemple, votre interface utilise un type comme le suivant :
type TDateTimeArray = array of TXSDateTime;
Vous devez ajouter le recensement suivant la section initialisation de lunit dans laquelle vous dclarez le tableau dynamique :
RemClassRegistry.RegisterXSInfo(TypeInfo(TDateTimeArray), MyNameSpace, DTarray, False);
Les paramtres sont identiques ceux utiliss par RegisterXSClass, sauf pour le premier qui est un pointeur sur les informations de type du tableau dynamique la place dune rfrence la classe.
31-6
Guide du dveloppeur
Dans la section implmentation de lunit dclarant cette classe, remplissez les mthodes EncodeValue et DecodeValue. Une fois la classe dimplmentation cre, vous devez la recenser dans le registre dinvocation. Ce registre utilise cela pour identifier la classe qui implmente une interface recense et pour la rendre utilisable par le composant invocateur quand il a besoin dappeler linterface. Pour recenser la classe dimplmentation, ajoutez un appel la mthode RegisterInvokableClass de la variable globale InvRegistry dans la section initialisation de votre unit dimplmentation :
InvRegistry.RegisterInvokableClass(TEncodeDecode);
Vous pouvez galement crer des classes dimplmentation qui ne drivent pas de TInvokableClass. Cependant, vous devez dans ce cas fournir une procdure de fabrication quutilise le registre dinvocation pour crer des instances de votre classe. La procdure de fabrication doit tre de type TCreateInstanceProc . Elle renvoie une instance de votre classe dimplmentation. Si la procdure cre une nouvelle instance, lobjet doit se librer lui-mme quand le compteur de rfrence ses interfaces devient nul, en effet le registre dinvocation ne libre pas explicitement les instances dobjet. Sinon, autre solution, la procdure de fabrication peut renvoyer une rfrence une instance globale partag e par tous les appelants. Le code suivant illustre cette dernire approche :
procedure CreateEncodeDecode(out obj: TObject); begin if FEncodeDecode = nil then begin FEncodeDecode := TEncodeDecode.Create; {enregistre une rfrence linterface afin que linstance globale ne se libre pas elle-mme } FEncodeDecodeInterface := FEncodeDecode as IEncodeDecode; end; obj := FEncodeDecode; { renvoie linstance globale } end;
Quand vous utilisez une procdure de fabrication, fournissez la procdure de fabrication comme second paramtre de la mthode RegisterInvokableClass :
InvRegistry.RegisterInvokableClass(TEncodeDecode, CreateEncodeDecode);
31-7
dans le paquet derreur SOAP afin que le client puisse dclencher une exception quivalente. Pour utiliser un descendant de ERemotableException, vous devez le recenser dans le registre des classes distantes. Cest--dire que vous devez, dans lunit qui dfinit votre descendant de ERemotableException, ajouter lunit InvokeRegistry la clause uses et appeler la mthode RegisterXSClass de la variable globale RemClassRegistry. Si le client utilise la mme unit que celle qui dfinit et recense votre descendant de ERemotableException , lorsquil reoit le paquet derreur SOAP, il dclenche automatiquement une instance de la classe dexception approprie en initialisant toutes ses proprits avec les valeurs contenues dans le paquet derreur SOAP.
Si vous voulez utiliser un fichier WSDL physique la place, vous pouvez afficher le document WSDL dans votre navigateur Web puis lenregistrer afin de gnrer le fichier document WSDL. Il nest pas ncessaire de publier le document WSDL depuis la mme application que celle implmentant votre service Web. Pour crer une application qui publie simplement le document WSDL, omettez les units contenant les objets dimplmentation et nincluez que les units dfinissant et recensant les
31-8
Guide du dveloppeur
interfaces invocables, les classes distantes qui reprsentent des types complexes et toutes les exceptions distantes. Par dfaut, quand vous publiez un document WSDL, il indique que les services sont disponibles la mme adresse que celle publiant le document WSDL (mais avec un chemin diffrent). Si vous dployez plusieurs versions de votre application service Web ou si vous dployez votre document WSDL depuis une application diffrente de celle qui implmente le service Web, vous devez modifier le document WSDL afin quil contienne des informations jour sur lemplacement du service Web. Pour changer lURL, utilisez ladministrateur WSDL. Vous devez tout dabord activer ladministrateur. Pour ce faire, initialisez la proprit AdminEnabled du composant TWSDLHTMLPublish True. Aprs, lorsque vous utilisez votre navigateur pour afficher la liste des documents WSDL, elle contient un bouton permettant galement de les administrer. Utilisez ladministrateur WSDL pour spcifier les emplacements (URL) o vous avez dploy votre application service Web.
Pour davantage dinformations sur la cration des units dfinissant une interface invocable dans un serveur de services Web Delphi, voir Dfinition des interfaces invocables la page 31-4. Pour davantage dinformations sur la cration dune unit dfinissant une classe distante pour un type complexe, voir Utilisation de types complexes dans des interfaces invocables la page 31-5. Pour davantage dinformations sur la cration dune unit dfinissant une exception distante, voir Cration de classes dexception personnalises pour les services Web la page 31-7.
31-9
Pour utiliser limportateur de service Web, choisissez Fichier|Nouveau|Autre et, dans la page Services Web, double-cliquez sur licne de limportateur de services Web. Dans la bote de dialogue qui est affiche, spcifiez le nom de fichier du document WSDL (ou dun fichier schma XML) ou spcifiez lURL o est publie ce document. Quand vous cliquez sur le bouton Gnrer, limportateur cre de nouvelles units qui dfinissent et recensent les interfaces invocables pour les oprations dfinies dans le document, ainsi que pour les classes distantes correspondant aux types dfinis par le document. Si le document WSDL, ou le fichier schma XML, utilise des identificateurs qui sont galement des mots rservs Pascal Objet, limportateur adapte automatiquement leur nom afin que le code gnr soit compilable. Quand des types complexes sont dclars en ligne, limportateur ajoute du code pour dfinir et recenser les classes distantes correspondantes dans la mme unit que linterface invocable qui les utilise. Sinon, les types sont dfinis et recenss dans une unit distincte.
Fournissez ensuite lobjet THTTPRio les informations permettant didentifier linterface du serveur et de localiser le serveur. Il y a deux manires de spcifier ces informations : Si le serveur a t conu avec Delphi, lidentification de linterface du serveur se fait automatiquement en se basant sur lURI gnre lors du recensement de linterface. Il suffit donc dinitialiser la proprit URL afin dindiquer lemplacement du serveur. La partie chemin daccs de cette URL doit
31-10
Guide du dveloppeur
Si le serveur na pas t conu en utilisant Delphi, THTTPRio doit rechercher dans un document WSDL lURI de linterface, information qui doit tre place dans len-tte Soap Action, ainsi que lemplacement du serveur. Pour ce faire, utilisez les proprits Service et Port de WSDLLocation :
X.WSDLLocation := Cryptography.wsdl; X.Service := Cryptography; X.Port := SoapEncodeDecode;
Vous pouvez ensuite utiliser loprateur as pour transtyper linstance de THTTPRio en linterface invocable. En procdant ainsi, cela cre dynamiquement en mmoire une vtable pour linterface associe, ce qui permet deffectuer les appels de linterface :
InterfaceVariable := X as IEncodeDecode; Code := InterfaceVariable.EncodeValue(5);
THTTPRio dpend du registre dinvocation pour obtenir des informations sur linterface invocable. Si lapplication client na pas de registre dinvocation ou si linterface invocable nest pas recense, THTTPRio ne peut pas construire la vtable en mmoire.
31-11
31-12
Guide du dveloppeur
32
Chapitre 32
Chapitre
Les composants socket vous permettent de crer une application pouvant communiquer avec dautres systmes par TCP/IP et ses protocoles associs. A laide des sockets, vous pouvez lire et crire sur des connexions dautres machines sans vous soucier des dtails concernant le logiciel rseau sous-jacent. Les sockets offrent des connexions bases sur le protocole TCP/IP et sont assez gnriques pour fonctionner avec des protocoles tels que User Datagram Protocol (UDP), Xerox Network System (XNS), DECnet de Digital ou la famille IPX/SPX de Novell. Lutilisation des sockets vous permet dcrire des applications serveur ou client qui lisent et crivent sur des systmes distants. Une application serveur ou client est en gnral ddie un service unique tel que HTTP (Hypertext Transfer Protocol) ou FTP (File Transfer Protocol). En utilisant les sockets serveur, une application offrant lun de ces services peut se lier aux applications client qui souhaitent utiliser ce service. Les sockets client permettent une application utilisant lun de ces services de se lier des applications serveur offrant ce service.
32-1
Services et ports
La plupart des services standard sont associs, par convention, des numros de ports prcis. Nous tudierons plus tard ces numros de ports. Pour linstant, considrez le numro de port comme un code numrique pour ce service. Si vous implmentez un service standard, les objets socket Linux fournissent des mthodes de recherche de numro de port pour le service. Si vous offrez un service nouveau, vous pouvez spcifier son numro de port dans un fichier / etc/services. Voir votre documentation Linux, pour davantage dinformations sur la configuration dun fichier de services.
32-2
Guide du dveloppeur
Lorsque la connexion au socket client est effective, la connexion serveur est identique une connexion client. Les deux extrmits ont les mmes possibilits et reoivent des vnements de mme type. Seule la connexion dcoute est fondamentalement diffrente, car elle ne comporte quune extrmit.
Connexions client
Les connexions client connectent un socket client sur le systme local un socket serveur sur un systme distant. Les connexions client sont lances par le socket client. En premier lieu, le socket client doit dcrire le socket serveur auquel il souhaite se connecter. Le socket client recherche ensuite le socket serveur et, lorsquil la trouv, demande une connexion. Le socket serveur peut ne pas tablir immdiatement la connexion. Les sockets serveur grent une file dattente des demandes de clients et tablissent la connexion lorsquils le peuvent. Lorsque le socket serveur accepte la connexion du client, il envoie au socket client une description complte du socket serveur auquel il se connecte et la connexion est finalise par le client.
Connexions dcoute
Les sockets serveur ne localisent pas les clients : ils gnrent des demiconnexions passives qui restent lcoute des requtes des clients. Les sockets serveur associent une file dattente leurs connexions dcoute ; la file dattente enregistre les requtes de connexion lorsquelles lui parviennent. Lorsque le socket serveur accepte une demande de connexion client, il forme un nouveau socket pour se connecter au client pour que la connexion dcoute reste ouverte afin daccepter dautres requtes de clients.
Connexions serveur
Les connexions serveur sont formes par des sockets serveur lorsque le socket dcoute accepte une requte du client. La description du socket serveur ayant effectu la connexion au client est envoye au client lorsque le serveur accepte la connexion. La connexion est tablie lorsque le socket client reoit cette description et effectue vritablement la connexion.
32-3
Une description complte dune connexion par socket inclut les adresses du socket chaque extrmit de la connexion. Vous pouvez dcrire ladresse de chaque extrmit du socket en fournissant lhte ou ladresse IP et le numro de port. Avant de faire une connexion par socket, vous devez dcrire compltement les sockets formant ses extrmits. Certaines informations sont disponibles sur le systme excutant votre application. Par exemple, il nest pas ncessaire de dcrire ladresse IP locale dun socket client car elle est dans le systme dexploitation. Les informations fournir dpendent du type de socket implment. Les sockets client doivent dcrire le serveur auquel ils souhaitent se connecter. Les sockets serveur dcoute doivent dcrire le port reprsentant le service quils offrent.
Un systme peut grer plusieurs adresses IP. Les adresses IP sont difficiles mmoriser. Lalternative consiste utiliser le nom de lhte. Les noms dhtes sont des alias dadresses IP exprimes au format URL (Uniform Resource Locator). Une chane dURL comporte un nom de domaine et un service, par exemple :
http://www.ASite.com
La majorit des intranets fournit des noms dhtes pour les adresses IP des systmes sur Internet. Pour dterminer le nom dhte ventuellement associ une adresse IP, excutez la commande suivante depuis la ligne de commande :
nslookup IPADDRESS
O IPADDRESS est ladresse IP qui vous intresse. Si votre adresse IP locale na pas de nom dhte et que vous en souhaitez une, contactez votre administrateur rseau. Les sockets serveur nont pas besoin de spcifier dhtes. Ladresse IP locale peut tre obtenue auprs du systme. Si le systme local gre plusieurs adresses IP, les sockets coutent les requtes client sur toutes ces adresses en mme temps. Lorsquun socket serveur accepte une connexion, le socket client indique ladresse IP du systme distant. Les sockets client doivent spcifier les htes distants en fournissant leur nom ou leur adresse IP.
32-4
Guide du dveloppeur
32-5
Des objets socket sont associs chacun de ces composants socket, et reprsentent lextrmit dune connexion socket existante. Les composants socket utilisent les objets socket pour encapsuler les appels du socket serveur pour que votre application nait pas connatre les dtails de ltablissement de la connexion ou de la gestion des messages du socket Si vous souhaitez personnaliser les dtails des connexions quun composant socket effectue pour vous, vous pouvez utiliser les proprits, les vnements et les mthodes des objets socket.
32-6
Guide du dveloppeur
Formation de la connexion
Lorsque les proprits de votre composant socket client dcrivent le serveur auquel vous souhaitez vous connecter, vous pouvez former la connexion lexcution en appelant la mthode Open. Si vous souhaitez que votre application forme automatiquement la connexion son ouverture, mettez la proprit Active True lors de la conception, laide de linspecteur dobjets.
Fermeture de la connexion
Lorsque vous avez fini de communiquer avec une application serveur sur la connexion socket, vous pouvez fermer la connexion en appelant la mthode Close. La connexion peut galement tre ferme depuis le serveur. Si cest le cas, vous en tes inform par un vnement OnDisconnect.
Dsignation du port
Pour que votre socket serveur puisse couter les requtes de connexion client, vous devez spcifier un port dcoute. Vous pouvez spcifier ce port laide de la proprit LocalPort. Si votre application serveur offre un service standard associ par convention un numro de port prcis, vous pouvez aussi spcifier le nom du service laide de la proprit LocalPort. Il est recommand dutiliser plutt le nom du service car il est facile de faire des fautes de saisie en entrant le numro de port.
32-7
32-8
Guide du dveloppeur
Evnements derreurs
Les sockets client et serveur gnrent un vnement OnError lorsquils reoivent un message derreur mis par la connexion. Vous pouvez crire un gestionnaire dvnement OnError pour rpondre ces messages derreur. Le gestionnaire dvnement reoit des informations sur : lobjet socket ayant reu la notification derreur ; ce que le socket tentait de faire lorsque lerreur sest produite ; le code derreur fourni par le message derreur. Vous pouvez rpondre lerreur dans le gestionnaire dvnement et mettre le code derreur 0 pour empcher le socket de dclencher une exception.
Evnements client
Lorsquun socket client ouvre une connexion, les vnements suivants se produisent : Le socket est paramtr et initialis pour la notification dvnements. Un vnement OnCreateHandle se produit une fois que le serveur et le serveur socket sont crs. A ce moment, lobjet socket accessible par la proprit Handle peut fournir des informations sur le serveur ou client socket qui sera lautre extrmit de la connexion. Ceci est la premire possibilit dobtenir le numro de port utilis pour la connexion, qui peut diffrer du numro de port des sockets dcoute qui ont accept la connexion. La demande de connexion est accepte par le serveur et gre par le socket client. Un vnement de notification OnConnect se produit aprs ltablissement de la connexion.
Evnements serveur
Les composants socket serveur forment deux types de connexions : les connexions dcoute et les connexions aux applications client. Le socket serveur reoit des vnements lors de la formation de ces deux types de connexions.
Evnements dcoute
Juste avant que la connexion dcoute soit forme, lvnement OnListening se produit. Vous pouvez utiliser la proprit Handle pour modifier le socket avant quil ne soit ouvert pour lcoute. Par exemple, si vous souhaitez restreindre les adresses IP que le serveur utilise pour les coutes, vous pouvez le faire dans un gestionnaire dvnement OnListening.
32-9
32-10
Guide du dveloppeur
Connexions bloquantes
Lorsque la connexion est bloquante, votre socket doit initier la lecture ou lcriture sur la connexion, plutt quattendre la notification manant de la connexion socket. Utilisez un socket bloquant lorsque votre ct de la connexion dcide du moment o doivent seffectuer les lectures et les critures. Pour les sockets client, initialisez la proprit BlockMode bmBlocking pour former une connexion bloquante. En fonction de ce dont est capable votre application client, il peut tre recommand de crer un nouveau thread dexcution pour les lectures ou les critures, de telle sorte que votre application puisse continuer lexcution du code dans dautres threads tout en attendant la fin des lectures ou des critures sur la connexion. Pour les sockets serveur, mettez la proprit BlockMode bmBlocking ou bmThreadBlocking pour former une connexion bloquante. Etant donn que les connexions bloquantes interrompent lexcution de tout autre code lorsque le socket attend que des informations soient crites ou lues sur la connexion, les composants de socket serveur gnrent toujours un nouveau thread dexcution pour chaque connexion client lorsque BlockMode est bmThreadBlocking. Quand BlockMode est bmBlocking, lexcution du programme est bloqu jusqu ce quune nouvelle connexion soit tablie.
32-11
32-12
Guide du dveloppeur
IV
Partie IV
Partie
Les chapitres de cette partie prsentent les concepts ncessaires la construction dapplications COM : contrleurs Automation, serveurs Automation, contrles ActiveX et applications COM+.
Remarque
La prise en charge des clients COM est disponible dans toutes les ditions de Delphi. Nanmoins, vous avez besoin de ldition Professionnelle ou Entreprise pour crer des serveurs.
33
Chapitre 33
Chapitre
Delphi fournit des experts et des classes qui facilitent limplmentation dapplications bases sur COM (Component Object Model) de Microsoft. Grce ces experts, vous pouvez crer des classes et des composants bass sur COM que vous utiliserez dans des applications, ou vous pouvez crer des clients ou des serveurs COM compltement fonctionnels qui implmentent des objets COM sophistiqus, des serveurs Automation (y compris, des objets Active Server), des contrles ActiveX ou des fiches ActiveForms.
Remarque
Les composants COM tels que ceux situs sur les pages ActiveX, COM+ et Servers de la palette des composants ne sont pas disponibles dans les applications CLX. Cette technologie est spcifique Windows et nest pas multiplate-forme. COM est un modle de composant logiciel indpendant du langage, conu pour permettre linteraction entre des composants logiciel et des applications sexcutant dans Windows. Laspect majeur de COM est quil permet la communication entre les composants, entre les applications et entre clients et serveurs par le biais dinterfaces clairement dfinies. Les interfaces reprsentent pour les clients un moyen dobtenir lexcution les fonctionnalits prises en charge par un composant COM. Pour que votre composant fournisse des fonctionnalits supplmentaires, il suffit dajouter une autre interface ces fonctionnalits. Les applications peuvent accder aux interfaces des composants COM sils figurent sur le mme ordinateur que les applications ou, sils figurent sur un autre ordinateur du rseau, laide dun mcanisme appel Distributed COM ou DCOM. Pour plus dinformations sur les clients, les serveurs et les interfaces, voir Composantes dune application COM la page 33-3. Ce chapitre prsente les concepts gnraux de la technologie sur laquelle sappuient lAutomation et les contrles ActiveX. Les chapitres suivants traiteront en dtail de la cration dobjets Automation et de contrles ActiveX dans Delphi.
33-1
Les objets et les langages des interfaces Delphi sont conformes la spcification COM. Limplmentation Delphi de la spcification COM utilise un ensemble de classes appel cadre de travail Delphi ActiveX (DAX). Ces classes se trouvent dans les units AxCtrls, OleCtrls et OleServer. En outre, linterface Pascal lAPI COM se trouve dans ActiveX.pas et ComSvcs.pas.
Extensions de COM
COM a volu et a t tendu au-del des services COM de base. COM sert de fondement dautres technologies, comme lAutomation, les contrles ActiveX, les documents Active et les annuaires Active. Pour plus de dtails, voir Extensions de COM la page 33-10. En outre, si vous travaillez dans un environnement distribu important, vous pouvez crer des objets COM transactionnels. Avant Windows 2000, ces objets ne faisaient pas partie de COM, mais sexcutaient dans lenvironnement Microsoft Transaction Server (MTS). Avec larrive de Windows 2000, cette gestion est intgre dans COM+. Les objets transactionnels sont dcrits en dtail dans le chapitre 39, Cration dobjets MTS ou COM+. Delphi fournit des experts permettant dimplmenter facilement des applications qui incorporent toutes ces technologies dans lenvironnement Delphi. Pour plus de dtails, voir Implmentation des objets COM laide dexperts la page 33-19.
33-2
Guide du dveloppeur
Client COM
Interfaces COM
Les clients COM communiquent avec des objets par le biais dinterfaces COM. Les interfaces sont des groupes de routines, lies par la logique ou par la smantique, qui assurent la communication entre le fournisseur dun service (objet serveur) et ses clients. Voici la reprsentation standard dune interface COM :
Figure 33.1 Une interface COM
Par exemple, chaque objet COM implmente linterface de base, IUnknown, qui indique au client les interfaces disponibles sur lobjet COM. Les objets peuvent avoir plusieurs interfaces, o chacune implmente une fonctionnalit. Linterface est le moyen de mettre disposition du client le service fourni par lobjet, sans lui donner les dtails de limplmentation sur la faon dont ce service est fourni. Les aspects majeurs des interfaces COM sont les suivants : Une fois publies, les interfaces sont immuables ; cest--dire qu elles ne changent plus. Une interface permet daccder un ensemble prcis de
33-3
fonctions. Les fonctionnalits supplmentaires sont fournies par le biais dinterfaces supplmentaires. Par convention, les identificateurs dinterfaces COM commencent par un I majuscule suivi dun nom symbolique dfinissant linterface, comme IMalloc ou IPersist. Lidentification unique des interfaces est garantie par un GUID (Globally Unique Identifier), qui est un nombre alatoire de 128 bits. Les GUID utiliss pour identifier les interfaces sont appels IID (Identificateurs dinterfaces). Ils permettent dliminer les conflits de noms entre diffrentes versions dun produit ou diffrents produits. Les interfaces sont indpendantes du langage. Vous pouvez utiliser nimporte quel langage pour implmenter une interface COM, condition que ce langage supporte les structures de pointeurs et puisse appeler une fonction via un pointeur, de faon explicite ou implicite. Les interfaces ne sont pas elles-mmes des objets ; elles fournissent laccs un objet. Donc, les clients nont pas accs directement aux donnes ; ils accdent aux donnes par le biais dun pointeur dinterface. Windows 2000 ajoute une couche supplmentaire dindirection connue en tant quintercepteur partir duquel il fournit des fonctionnalits COM+ telles que lactivation justin-time et le regroupement dobjets. Les interfaces sont toujours drives de linterface de base, IUnknown. Les interfaces peuvent tre rediriges par COM via des proxy pour permettre aux appels de mthodes de linterface de seffectuer entre diffrents threads, processus et machines en rseau, sans que les objets client ou serveur ne soient jamais informs de la redirection. Pour plus dinformations, voir Serveurs en processus, hors processus et distants la page 33-7.
Les clients obtiennent des pointeurs sur dautres interfaces via la mthode QueryInterface de IUnknown. QueryInterface connat chaque interface de lobjet serveur et peut donner au client un pointeur vers linterface demande. Lorsquil reoit un pointeur vers une interface, le client est assur de pouvoir appeler nimporte quelle mthode de linterface. Les objets contrlent leur propre dure de vie grce aux mthodes AddRef et Release de IUnknown, qui sont de simples mthodes de dcompte de rfrences.
33-4
Guide du dveloppeur
Tant que le dcompte de rfrences est diffrent de zro, lobjet reste en mmoire. D s quil atteint zro, limplmentation de linterface peut en toute scurit disposer du ou des objets sous-jacents.
Dans Windows 2000 et toutes les versions ultrieures de Windows, quand un objet sexcute sous COM+, un niveau supplmentaire dindirection est fourni entre le pointeur dinterface et le pointeur vtable. Le pointeur dinterface disponible sur le client pointe sur un intercepteur, qui son tour pointe sur la vtable. Cela permet COM+ de fournir des services comme lactivation just-intime, par lequel le serveur peut tre dsactiv et ractiv dynamiquement dune faon opaque pour le client. COM+ garantit que lintercepteur se comporte comme sil tait un pointeur vtable ordinaire.
Serveurs COM
Un serveur COM est une application ou une bibliothque qui fournit des services une application ou bibliothque client. Un serveur COM est constitu dun ou de plusieurs objets COM, un objet COM tant un ensemble de proprits (donnes membre ou contenu) et de mthodes (fonctions membre). Les clients ne savent pas comment lobjet COM effectue son service ; limplmentation de lobjet est encapsule. Un objet met ses services disposition par le biais de ses interfaces comme dcrit prcdemment.
33-5
En outre, les clients nont pas besoin de savoir o rside lobjet COM. COM fournit un accs transparent quel que soit lemplacement de lobjet. Quand il demande un service un objet COM, le client transmet un identificateur de classe (CLSID) COM. Un CLSID est juste un GUID qui rfrence un objet COM. COM utilise ce CLSID, recens dans le registre systme, pour localiser limplmentation approprie du serveur. Une fois le serveur localis, COM amne le code en mmoire, et fait instancier par le serveur une instance de lobjet pour le client. Ce processus est gr indirectement par un objet spcial appel un fabricant (bas sur les interfaces) qui cre sur demande des instances dobjet. Au minimum, un serveur COM doit effectuer ceci : Recenser des entres dans le registre systme pour associer le module serveur lidentificateur de classe (CLSID). Implmenter un objet fabricant de classe, qui fabrique un autre objet partir dun CLSID particulier. Exposer le fabricant dobjet COM. Fournir un mcanisme de dchargement grce auquel un serveur qui ne sert pas de client pourra tre supprim de la mmoire.
Remarque
Les experts de Delphi automatisent la cration des objets et des serveurs COM comme dcrit dans Implmentation des objets COM laide dexperts la page 33-19.
33-6
Guide du dveloppeur
Remarque
Cela nest pas toujours vrai avec COM+. Quand le client appelle un objet dans un contexte diffrent, COM+ intercepte lappel afin quil se comporte comme lappel dun serveur hors processus (voir plus bas) mme si le serveur est en
33-7
processus. Pour davantage dinformations sur lutilisation de COM+, voir chapitre 39, Cration dobjets MTS ou COM+. Comme illustr dans la figure suivante, quand le processus est soit diffrent, soit sur une autre machine, COM utilise un proxy pour initier les appels de procdure distants. Le proxy rside dans le mme processus que le client, de sorte que vu du client, tous les appels des interfaces semblent pareils. Le proxy intercepte lappel du client et le transmet l o lobjet rel sexcute. Le mcanisme qui permet aux clients daccder aux objets dun espace processus diffrent, ou mme dune machine diffrente, comme sils se trouvaient dans leur propre processus, est appel le marshaling.
Figure 33.4 Serveurs hors processus et distants
La diffrence entre les serveurs hors processus et serveurs distants est le type de communication inter-processus utilis. Le proxy utilise COM pour communiquer avec un serveur hors processus et COM distribu (DCOM) pour communiquer avec une machine distante. DCOM transfre de manire transparente une demande dobjet local dans lobjet distant sexcutant sur une autre machine.
Remarque
Pour les appels de procdure distantes, DCOM utilise le protocole RPC fourni par lenvironnement de calcul distribu (DCE) de Open Source. Pour la scurit distribue, DCOM utilise le protocole de scurit NT LAN Manager (NTLM). Pour les services dannuaire, DCOM utilise DNS (Domain Name System).
Le mcanisme du marshaling
Le marshaling est le mcanisme qui permet un client de faire des appels aux fonctions de linterface dobjets distants qui se trouvent dans un autre processus ou sur une autre machine. Le marshaling Prend un pointeur dinterface dans le processus du serveur et rend un pointeur de proxy disponible au code dans le processus du client. Prend les arguments dun appel linterface passs depuis le client et les place dans lespace processus de lobjet distant.
33-8
Guide du dveloppeur
Pour tout appel linterface, le client met les arguments sur une pile et met un appel une fonction via le pointeur dinterface. Si lappel lobjet nest pas en processus, il est pass au proxy. Celui-ci compresse les arguments dans un paquet de marshaling et transmet la structure lobjet distant. Le stub de lobjet dcompresse le paquet, place les arguments sur la pile et appelle limplmentation de lobjet. Lobjet recre lappel du client dans son propre espace dadressage. Le type de marshaling dpend de ce que lobjet COM implmente. Les objets peuvent utiliser le mcanisme de marshaling standard fourni par linterface IDispatch. Cest un mcanisme de marshaling gnrique qui permet la communication via un appel standard une procdure distante (RPC). Pour plus de dtails sur linterface IDispatch, voir Interfaces dAutomation la page 36-13. Quand lobjet nimplmente pas IDispatch, sil se limite lui-mme aux types compatibles Automation et sil a une bibliothque de types recense, COM fournit automatiquement la gestion du marshaling. Les applications qui ne se limitent pas eux-mmes aux types compatibles automation ou recensent une bibliothque de types doivent fournir leur propre marshaling. Le marshaling est fourni par le biais dune implmentation de linterface IMarshal, ou en utilisant une DLL proxy/stub gnre sparment. Delphi ne prend pas en charge la gnration automatique des DLL proxy/stub.
Agrgation
Dans certains cas, un objet serveur peut utiliser un autre objet COM pour effectuer certaines de ces fonctions. Par exemple, un objet de gestion de stock peut utiliser un objet commande spar pour grer les commandes des clients. Si lobjet de gestion de stock veut prsenter une interface de commande au client, il y a un problme. Mme si le client ayant une interface stock peut appeler QueryInterface pour obtenir linterface commande, quand lobjet commande a t cr, il ne connat pas lobjet gestion de stock et ne peut lui renvoyer une interface stock en rponse un appel de QueryInterface. Un client qui a linterface commande ne peut revenir dans linterface stock. Pour viter ce problme, certains objets COM grent lagrgation. Quand lobjet gestion de stock cre une instance de lobjet commande, il lui transmet une copie de sa propre interface IUnknown. Lobjet commande peut ensuite utiliser cette interface IUnknown et grer les appels de QueryInterface qui demandent une interface, comme linterface stock, quil ne gre pas. Quand cela se produit, les deux objets pris ensemble sappellent un agrgat. Lobjet commande est appel lobjet interne (ou objet contenu) de lagrgat et lobjet stock est appel lobjet externe. Pour pouvoir se comporter comme objet externe dun agrgat, un objet COM doit crer lobjet interne en utilisant lAPI Windows CoCreateInstance ou CoCreateInstanceEx, en lui transmettant comme paramtre un pointeur IUnknown que lobjet interne peut utiliser pour les appels de QueryInterface. Pour crer un objet qui puisse se comporter comme objet interne dun agrgat, il doit descendre de TContainedObject. Quand lobjet est cr, linterface IUnknown de lobjet externe est transmise au constructeur afin quelle puisse tre utilise par la mthode QueryInterface pour les appels que lobjet interne ne peut pas traiter.
Remarque
33-9
Extensions de COM
Clients COM
Les clients peuvent toujours interroger les interfaces dun objet COM pour dterminer ce qu il est capable de faire. Tous les objets COM permettent aux clients de demander les interfaces connues. De plus, si le serveur gre linterface IDispatch, les clients peuvent demander au serveur des informations sur les mthodes gres par le serveur. Les objets serveurs nont pas dattentes concernant lutilisation de ses objets par le client. De mme, les clients nont pas besoin de savoir comment (ou mme si) un objet fournit les services ; ils sen remettent simplement sur les objets serveurs pour fournir les services quils annoncent via leurs interfaces. Il y a deux types de clients COM : les contrleurs et les conteneurs. Un contrleur lance le serveur et interagit avec lui via son interface. Il demande des services de lobjet COM ou il le pilote comme processus distinct. Les conteneurs accueillent des contrles visuels ou des objets qui apparaissent dans linterface utilisateur du conteneur. Ils utilisent des interfaces prdfinies pour ngocier les problmes daffichage avec les objets serveur. Il est impossible davoir une relation conteneur sur DCOM ; par exemple, les contrles visuels qui apparaissent dans linterface utilisateur du conteneur doivent tre localiss localement. En effet, les contrles sont supposs se dessiner eux-mmes, ce qui ncessite quils puissent accder aux ressources GDI locales. Delphi facilite le dveloppement dun contrleur Automation en permettant dimporter la bibliothque de types ou un contrle ActiveX dans un composant enveloppe de telle manire que les objets serveur apparaissent comme les autres composants VCL. Pour des dtails sur ce processus, voir chapitre 35, Cration de clients COM.
Extensions de COM
COM a t initialement conu pour fournir une fonctionnalit de communication de base et permettre lenrichissement de cette fonctionnalit via des extensions. COM lui-mme a tendu sa fonctionnalit premire en dfinissant des ensembles spcialiss dinterfaces couvrant des besoins spcifiques. Le tableau suivant est un rsum de certaines des extensions de services que COM fournit actuellement. Les sections suivantes dcrivent ces services en dtail. Serveurs Automation LAutomation dsigne la capacit dune application contrler par programme les objets dune autre application. Les serveurs Automation sont les objets qui peuvent tre contrls par dautres excutables lexcution. Les contrles ActiveX sont des serveurs en processus COM spcialiss, gnralement conus pour tre incorpors dans une application client. Les contrles proposent des comportements et des vnements la conception et lexcution.
Contrles ActiveX
33-10
Guide du dveloppeur
Extensions de COM
Les pages Active Server sont des scripts qui gnrent des pages HTML. Le langage de script contient des structures permettant la cration et lexcution dobjets Automation, cest--dire quune page Active Server se comporte comme un contrleur Automation Objets supportant la liaison et lincorporation, le glisserdplacer, ldition visuelle et lactivation in-situ. Les documents Word et les feuilles de calcul Excel sont des exemples de documents Active.
Documents Active
Objets Objets capable de rpondre un grand nombre de clients. Ils transactionnels proposent des caractristiques comme lactivation juste--temps, les transactions, le regroupement de ressources et des services de scurit. Ces caractristiques taient initialement gres par MTS, mais ont t intgres dans COM avec larrive de COM+. Bibliothques de types Collection de structures de donnes statiques, souvent enregistres en tant que ressource, fournissant des informations de type dtailles sur un objet et ses interfaces. Les clients des serveurs Automation, les contrles ActiveX et les objets transactionnels ont besoin des informations de type.
Le diagramme page suivante montre les relations entre les extensions de COM et la faon dont elles drivent de COM.
Figure 33.5 Technologies COM
Les objets COM peuvent tre visuels ou non visuels. Certains sexcutent dans le mme espace processus que leurs clients ; dautres peuvent sexcuter dans des
33-11
Extensions de COM
processus diffrents ou sur des machines distantes si les objets assurent le marshaling. Le tableau suivant rcapitule les types dobjets COM que vous pouvez crer, sils sont visuels, les espaces processus dans lesquels ils peuvent sexcuter, le marshaling quils fournissent et sils ont besoin dune bibliothque de types.
Tableau 33.1 Objet
Document Active Automation
Espace processus
En processus ou hors processus En processus, hors processus ou distant En processus En processus pour MTS, tous pour COM+ En processus
Communication
Verbes OLE
Parfois
Marshaling automatique via linterface IDispatch (pour les serveurs hors processus ou distants) Marshaling automatique via linterface IDispatch Marshaling automatique via une bibliothque de types Pas de marshaling requis pour les serveurs en processus Marshaling automatique via une bibliothque de types ; sinon, marshaling manuel via des interfaces personnalises
Habituellement Parfois
Facultativement
Recommande
Facultativement
Recommande
Serveurs Automation
LAutomation dsigne la capacit dune application contrler par programme les objets dune autre application, comme une macro qui peut manipuler plusieurs applications la fois. Le client dun objet Automation est appel contrleur Automation, et lobjet serveur manipul est appel objet Automation. LAutomation peut tre utilise sur des serveurs en processus, locaux ou distants. LAutomation prsente deux caractristiques : Lobjet Automation dfinit un ensemble de proprits et de commandes, et dcrit ses capacits via les descriptions de type. Pour ce faire, il doit disposer dun moyen de fournir des informations sur les interfaces de lobjet, les mthodes des interfaces et les arguments de ces mthodes. Gnralement, ces informations se trouvent dans des bibliothques de types. Le serveur Automation peut aussi gnrer des informations dynamiquement quand elles lui sont demandes via son interface IDispatch interface (voir plus bas).
33-12
Guide du dveloppeur
Extensions de COM
Les objets Automation rendent ces mthodes accessibles pour que dautres applications puissent les utiliser. Pour cela, ils implmentent linterface IDispatch. Cest par le biais de cette interface quun objet peut exposer toutes ses mthodes et proprits. Et cest par le biais de la mthode primaire de cette interface que les mthodes de lobjet peuvent tre appeles, une fois quelles ont t identifies grce aux informations de type. Les dveloppeurs utilisent souvent lAutomation pour crer et utiliser des objets OLE non visuels qui sexcutent dans nimporte quel espace processus, car linterface Automation IDispatch automatise le processus de marshaling. En revanche, lAutomation limite les types que vous pouvez utiliser. Pour obtenir une liste de types compatibles avec les bibliothques de types en gnral, et dinterfaces Automation en particulier, voir Types autoriss la page 34-13. Pour plus dinformations sur lcriture dun serveur Automation, voir chapitre 36, Cration de serveurs COM simples.
Contrles ActiveX
ActiveX est une technologie qui permet aux composants COM, particulirement aux contrles, dtre plus compacts et efficaces. Cela est particulirement important pour les contrles conus pour des applications Intranet qui ncessitent leur tlchargement par le client avant de les utiliser. Les contrles ActiveX sont des contrles visuels qui sexcutent uniquement comme des serveurs en processus et qui peuvent sintgrer dans une application conteneur ActiveX. Ce ne sont pas des applications compltes par eux-mmes, vous pouvez les voir comme des contrles OLE prfabriqus qui sont rutilisables dans diverses applications. Les contrles ActiveX ont une interface
33-13
Extensions de COM
utilisateur apparente et reposent sur lutilisation dinterfaces prdfinies pour ngocier les entres/sorties et les questions daffichage avec le conteneur hte. Les contrles ActiveX utilisent lAutomation pour exposer leurs proprits, mthodes et vnements. Leurs fonctionnalits incluent la capacit dclencher des vnements, la liaison aux sources de donnes et la gestion de licence. Les contrles ActiveX sutilisent parfois dans un site Web comme objets interactifs placs dans une page Web. Ainsi, ActiveX est devenu un standard particulirement destin des contenus interactifs pour le Web, y compris lutilisation de documents ActiveX employs pour visualiser des documents non HTML via un navigateur Web. Pour plus dinformations sur la technologie ActiveX, voir le site Web de Microsoft. Les experts de Delphi facilitent la cration des contrles ActiveX. Pour plus dinformations sur la cration et lutilisation de ces types dobjets, voir chapitre 38, Cration dun contrle ActiveX.
Documents Active
Les documents Active (appels auparavant documents OLE) sont un ensemble de services COM supportant la liaison et lincorporation, le glisser-dplacer et ldition visuelle. Les documents Active intgrent de faon transparente des donnes ou des objets de diffrents formats, par exemple des clips sonores, des feuilles de calcul, du texte et des images. Contrairement aux contrles ActiveX, les documents Active ne sont pas limits aux serveurs en processus ; ils peuvent tre utiliss dans des applications interprocessus. A la diffrence des objets Automation, qui ne sont presque jamais visuels, les objets document Active peuvent tre visuellement actifs dans une autre application. Ils sont associs deux types de donnes : les donnes de reprsentation utilises pour laffichage visuel lcran ou sur un priphrique de sortie, et les donnes natives utilises pour modifier lobjet. Les objets document Active peuvent tre des conteneurs ou des serveurs de documents. Bien que Delphi ne fournisse pas dexpert pour crer automatiquement des documents Active, vous pouvez utiliser la classe TOleContainer de la VCL pour supporter la liaison et lincorporation dans les documents Active existants. Vous pouvez aussi utiliser TOleContainer comme base dun conteneur de document Active. Pour crer des objets pour les serveurs de documents Active, utilisez une des classes de base COM de la VCL et implmentez les interfaces appropries ce type dobjet, en fonction des services que lobjet doit grer. Pour plus dinformations sur la cration et lutilisation de serveurs de documents Active, voir le site Web Microsoft.
Remarque
Bien que la spcification des documents Active contienne une gestion intgre du marshaling des applications processus crois, les documents Active ne
33-14
Guide du dveloppeur
Extensions de COM
sexcutent pas sur des serveurs distants car les types quils utilisent (handles de fentre, de menu, etc.) sont spcifiques un systme sur une machine donne.
Objets transactionnels
Delphi utilise le terme objets transactionnels pour dsigner des objets qui exploitent les services de transaction, la scurit et la gestion des ressources proposes par MTS (pour les versions de Windows antrieures Windows 2000) ou COM+ (pour Windows 2000 et plus). Ces objets sont conus pour travailler dans des environnements distribus importants. Les services de transaction garantissent la fiabilit assurant que des activits sont toujours acheves ou annules (le serveur ne sarrte jamais en ayant fait la moiti dune activit). Les services de scurit vous permettent dexposer diffrents niveaux de services diffrentes classes de clients. La gestion des ressources permet un objet de rpondre davantage de clients en regroupant les ressources et en ne gardant des objets actifs que sils sont utiliss. Pour permettre au systme de proposer ces services, lobjet doit implmenter linterface IObjectControl. Pour accder aux services, les objets transactionnels utilisent une interface appele IObjectContext qui est cre leur usage par MTS ou COM+. Avec MTS, lobjet serveur doit tre conu dans une bibliothque (DLL) qui est installe dans lenvironnement dexcution MTS. Cest--dire que lobjet serveur est un serveur en processus qui sexcute dans lespace de processus dexcution MTS. Avec COM+, cette restriction ne sapplique plus car tous les appels COM sont redirigs par un intercepteur. Pour les clients, les diffrences entre MTS et COM+ sont transparentes. Les serveurs MTS ou COM+ rassemblent les objets transactionnels dans le mme espace de processus. Dans MTS, ce groupe est appel un paquet MTS, alors que dans COM+ il est appel application COM+. Une mme machine peut excuter plusieurs paquets MTS (ou applications COM+), chacun sexcutant dans son propre espace de processus. Pour les clients, les objets transactionnels apparaissent semblables aux autres objets serveur COM. Le client na pas besoin de savoir quoi que ce soit sur les transactions, la scurit ou lactivation juste--temps, sauf sil dmarre lui-mme une transaction. MTS et COM+ proposent un outil distinct pour administrer les objets transactionnels. Cet outil vous permet de configurer les objets des paquets ou des applications COM+, de visualiser les paquets ou les applications COM+ installs dans une machine ou de modifier les attributs des objets, surveiller et grer les transactions, mettre des objets la disposition des clients, etc. Dans MTS, cet outil sappelle explorateur MTS. Dans COM+ cest le gestionnaire de composants COM+.
33-15
Extensions de COM
Bibliothques de types
Les bibliothques de types offrent un moyen dobtenir davantage dinformations de type sur un objet que les interfaces de lobjet. Les bibliothques de types contiennent les informations ncessaires sur les objets et leurs interfaces, comme les interfaces associes tels objets (tant donn le CLSID), les fonctions membre de chaque interface et les arguments requis par ces fonctions. Vous pouvez obtenir les informations de type en interrogeant une instance dun objet pendant qu elle sexcute ou, en chargeant et en lisant les bibliothques de types. Grce ces informations, vous pouvez implmenter un client qui utilise un objet souhait, en sachant exactement les fonctions membre dont vous avez besoin, et ce quil faut passer ces fonctions. Les clients des serveurs Automation, des contrles ActiveX et des objets transactionnels sattendent disposer de ces informations de type. Tous les experts Delphi gnrent automatiquement une bibliothque de types (mme si cest facultatif avec lexpert objet COM). Vous pouvez voir ou modifier ces informations de type en utilisant lditeur de bibliothques de types comme dcrit au chapitre 34, Utilisation des bibliothques de types. Cette section dcrit le contenu dune bibliothque de types, comment la crer, quand lutiliser et comment y accder. Pour les dveloppeurs souhaitant partager des interfaces travers divers langages, la section se termine par des suggestions sur lutilisation des outils de gestion de bibliothques de types.
33-16
Guide du dveloppeur
Extensions de COM
Delphi gnre automatiquement une bibliothque de types lorsque vous crez un objet COM (contrles ActiveX, objets Automation, modules de donnes distant, etc.) en utilisant lun des experts des pages ActiveX et Multiniveau de la bote de dialogue Nouveaux Elments. Vous pouvez dcider de ne pas gnrer de bibliothque de types si vous utilisez lexpert objet COM. Vous pouvez galement crer une bibliothque de types en slectionnant Fichier|Nouveau| Autre, longlet ActiveX, puis Bibliothque de types. Vous pouvez ensuite voir la bibliothque de types en utilisant lditeur de bibliothques de types Delphi. Il est facile de modifier la bibliothque de types laide de lditeur de bibliothques de types et Delphi met automatiquement jour le fichier TLB correspondant quand la bibliothque de types est enregistre. Si vous modifiez les interfaces et les CoClasses cres en utilisant un expert, lditeur de bibliothques de types actualise galement les fichiers dimplmentation. Pour plus dinformations sur lutilisation de lditeur de bibliothques de types pour crire des interfaces et des CoClasses, voir chapitre 34, Utilisation des bibliothques de types.
33-17
Extensions de COM
Lorsquune bibliothque de types a t cre, les scruteurs dobjets, les compilateurs et les outils similaires peuvent y accder par des interfaces spciales :
Interface
ITypeLib ITypeLib2 ITypeInfo
Description
Fournit des m thodes pour accder la description dune bibliothque de types. Augmente ITypeLib pour inclure la gestion des chanes de documentation, les donnes personnalises et des statistiques sur la bibliothque de types. Fournit la description de chaque objet dune bibliothque de types. Par exemple, un navigateur utilise cette interface pour extraire des informations sur les objets de la bibliothque de types. Augmente ITypeInfo pour accder des informations supplmentaires de la bibliothque de types, comme les mthodes daccs aux lments de donnes personnaliss. Fournit un moyen rapide daccder aux informations dont le compilateur a besoin lors de la liaison avec une interface.
ITypeInfo2
ITypeComp
Delphi peut importer et utiliser des bibliothques de types venant dautres applications en choisissant Projet|Importer une bibliothque de types. La plupart des classes de la VCL employes pour les applications COM supportent les interfaces essentielles utilises pour stocker et rcuprer les informations de types partir des bibliothques de types et des instances actives dun objet. La classe TTypedComObject de la VCL supporte les interfaces qui fournissent des informations de type et sutilise comme une fondation pour lenvironnement objet ActiveX.
33-18
Guide du dveloppeur
Les experts grent beaucoup des problmes intervenant dans la cration de chaque type dobjet. Ils fournissent les interfaces COM requises pour chaque type dobjet. Comme le montre la figure 33.6, avec un simple objet COM, lexpert implmente la seule interface COM obligatoire, IUnknown, qui fournit un pointeur dinterface vers lobjet.
Figure 33.6 Interface dun objet COM simple
33-19
Lexpert objet COM propose galement une implmentation de IDispatch si vous spcifiez que vous crez un objet grant un descendant de IDispatch. Comme le montre la figure 33.7, pour les objets Automation et Active Server, lexpert implmente IUnknown et IDispatch, qui fournissent le marshaling automatique.
Figure 33.7 Interfaces dun objet Automation
Comme le montre la figure 33.8, pour les objets contrles ActiveX et fiches ActiveX, lexpert implmente toutes les interfaces requises par les contrles ActiveX : IUnknown, IDispatch, IOleObject, IOleControl, etc. Pour obtenir la liste complte des interfaces, reportez-vous la page de rfrence de lobjet TActiveXControl.
Figure 33.8 Interfaces dun contrle ActiveX
33-20
Guide du dveloppeur
Le tableau suivant numre les divers experts et les interfaces quils implmentent :
Tableau 33.2 Expert
serveur COM
Experts Delphi qui implmentent des objets COM, Automation et ActiveX Interfaces implment es
IUnknown (et IDispatch si vous slectionnez une interface par dfaut qui descend de IDispatch)
serveur Automation
IUnknown, IDispatch
33-21
Experts Delphi qui implmentent des objets COM, Automation et ActiveX (suite) Interfaces implment es
IUnknown, IDispatch, IPersistStreamInit, IOleInPlaceActiveObject, IPersistStorage, IViewObject, IOleObject, IViewObject2, IOleControl, IPerPropertyBrowsing, IOleInPlaceObject, ISpecifyPropertyPages Mmes interfaces que contrle ActiveX
ActiveForm
objet transactionnel
IUnknown, IPropertyPage
Si vous voulez, vous pouvez ajouter dautres objets COM (ou refaire une implmentation existante). Pour ajouter un nouvel objet, il est plus simple dutiliser lexpert une seconde fois. En effet, lexpert met en place lassociation entre la bibliothque de types et une classe dimplmentation, ainsi les
33-22
Guide du dveloppeur
modifications effectues dans lditeur de bibliothques de types sont automatiquement appliques lunit dimplmentation.
Chaque expert gnre une unit dimplmentation qui implmente votre objet serveur COM. Lobjet serveur COM (lobjet implmentation) descend de lune des classe DAX :
Tableau 33.3 Expert
serveur COM
Classes de base DAX utilises par les classes dimplmentation gnres Classe de base DAX
TTypedCOMObject
Gestion h rit e
Gestion des interfaces IUnknown ISupportErrorInfo. Gestion de lagrgation, des exceptions OLE, de la convention dappel safecall et des conventions sur les interfaces doubles. Gestion de la lecture des informations des bibliothques de types. Tout ce qui est fourni par TTypedCOMObject, plus : Gestion de linterface IDispatch. Gestion de lauto-marshaling.
TAutoObject
33-23
Classes de base DAX utilises par les classes dimplmentation gnres (suite) Classe de base DAX
TActiveXControl
Gestion h rit e
Tout ce qui est fourni par TAutoObject, plus : Gestion de lincorporation dans un conteneur. Gestion de lactivation in-situ. Gestion des proprits et des pages de proprits. La capacit de dlguer un contrle fentre associ quil cre. Tout ce qui est fourni par TAutoObject, sauf quil fonctionne avec un descendant TActiveForm au lieu dune autre classe de contrle fentr. Tout ce qui est fourni par TAutoObject, plus : Gestion de linterface IObjectControl. Gestion des interfaces IUnknown et ISupportErrorInfo. Gestion de lagrgation, des exceptions OLE, de la convention dappel safecall et des conventions sur les interfaces doubles. Gestion de linterface IPropertyPage.
contrle ActiveX
ActiveForm
TActiveFormControl
Une hirarchie dobjets fabricant de classe correspond aux classes de la figure 33.9 et gre la cration de ces objets COM. Lexpert ajoute du code la section initialisation de votre unit dimplmentation pour instancier le fabricant de classe appropri votre classe dimplmentation. Les experts gnrent galement une bibliothque de types et son unit associe, qui porte un nom de la forme Projet1_TLB. Lunit Project1_TLB contient les dfinitions dont votre application a besoin pour utiliser les types et les interfaces dfinis dans la bibliothque de types. Pour davantage dinformations sur le contenu de ce fichier, voir Code gnr par limportation des informations dune bibliothque de types la page 35-5. Vous pouvez modifier linterface gnre par lexpert en utilisant lditeur de bibliothques de types. Si vous le faites, la classe dimplmentation est automatiquement actualise pour reflter vos modifications. Il vous suffit juste de remplir le corps des mthodes gnres pour complter limplmentation.
33-24
Guide du dveloppeur
34
Chapitre 34
Chapitre
Ce chapitre dcrit comment crer et modifier des bibliothques de types en utilisant lditeur de bibliothques de types Delphi. Les bibliothques de types sont des fichiers incluant des informations sur les types de donnes, les interfaces, les fonctions membre et les classes dobjet exposs par un objet COM. Les bibliothques de types permettent didentifier le type des objets et des interfaces disponibles sur un serveur. Pour une prsentation dtaille du rle et de lutilisation des bibliothques de types, voir Bibliothques de types la page 33-16 Une bibliothque de types peut contenir les lments suivants : Des informations sur les types de donnes personnaliss, dont les alias, les numrations, les structures et les unions. Les descriptions dun ou de plusieurs lments COM, par exemple une interface, une dispinterface ou une CoClasse. Ces descriptions sont appeles informations de types. Les descriptions des constantes et mthodes dfinies dans les units externes. Des rfrences aux descriptions de type situes dans dautres bibliothques de types. Quand vous incluez une bibliothque de types dans une application COM ou une bibliothque ActiveX, vous mettez la disposition dautres applications et outils de programmation des informations sur les objets de votre application via les outils et les interfaces de la bibliothque de types. Avec les outils de dveloppement traditionnels, vous crez des bibliothques de types en crivant des scripts utilisant le langage IDL (Interface Definition Language) ou ODL (Object Description Language), puis en excutant ce script via un compilateur. Lditeur de bibliothques de types automatise ce processus, simplifiant ainsi la cration ou la modification de vos bibliothques de types.
34-1
Quand vous crez un serveur COM de type quelconque (contrle ActiveX, objet Automation, module de donnes distant, etc.) en utilisant les experts Delphi, lexpert gnre automatiquement une bibliothque de types (mme si dans le cas de lexpert objet COM, cela est optionnel). Lessentiel de votre travail de personnalisation de lobjet gnr commence dans la bibliothque de types. Cest l o vous dfinissez les proprits et mthodes quelle expose ses clients : vous modifiez linterface de la CoClasse gnre par lexpert en utilisant lditeur de bibliothques de types. Lditeur de bibliothques de types actualise automatiquement lunit dimplmentation de votre objet afin quil soit juste ncessaire de remplir le corps des mthodes gnres. Vous pouvez aussi utiliser lditeur de bibliothques de types Delphi dans le dveloppement dapplications CORBA (Common Object Request Broker Architecture). Avec les outils CORBA traditionnels, vous devez dfinir les interfaces dobjets en dehors de votre application, laide du langage CORBA IDL (Interface Definition Language). Vous excutez ensuite un utilitaire qui gnre du code stub-et-squelette partir de cette dfinition. Toutefois, Delphi gnre le stub, le squelette et le code IDL automatiquement. Vous pouvez facilement modifier votre interface laide de lditeur de bibliothques de typesDelphi se chargeant de mettre automatiquement jour les fichiers source correspondants.
Lditeur de bibliothques de types est galement utilis pour dfinir des interfaces CORBA dans des projets utilisant lobjet CORBA ou lexpert module de donnes CORBA.
34-2
Guide du dveloppeur
Lditeur de bibliothques de types produit deux types de fichiers reprsentant le contenu dune bibliothque de types :
Tableau 34.1 Fichier
Fichier .TLB
Unit _TLB
34-3
Ces lments sont illustrs dans le tableau suivant qui prsente lditeur de bibliothques de types affichant les informations de type pour un objet COM nomm cyc.
Figure 34.1 Lditeur de bibliothques de types
Barre doutils
La barre doutils de lditeur de bibliothques de types, situe en haut, contient des boutons sur lesquels vous cliquez pour ajouter de nouveaux objets la bibliothque de types. Le premier groupe de boutons vous permet dajouter des lments la bibliothque de types. Quand vous cliquez sur un bouton de la barre doutils, licne de cet lment apparat dans le volet liste des objets. Vous pouvez alors personnaliser ses attributs dans le volet de droite. Selon le type dicne slectionne, diffrentes pages dinformations apparaissent droite. Le tableau suivant numre les lments quil est possible dajouter une bibliothque de types :
Ic ne Signification
Une description dinterface. Une description de dispinterface. (ne sutilise pas pour la dfinition dinterface CORBA) Une CoClasse.
34-4
Guide du dveloppeur
Ic ne
Signification
Une num ration. Un alias. Un enregistrement. Une union. Un module.
Quand vous slectionnez un des lments lists ci-dessus, dans le volet liste des objets, le second groupe de boutons affiche les membres autoriss pour cet lment. Par exemple, quand vous slectionnez Interface, les icnes de mthode et de proprit deviennent disponibles dans le second groupe car vous pouvez ajouter des proprits et des mthodes une dfinition dinterface. Quand vous slectionnez une numration, le second groupe de boutons naffiche que le membre constante car cest le seule membre utilisable pour spcifier les informations dun type numration. Le tableau suivant numre les membres quil est possible dajouter aux lments du volet liste des objets :
Ic ne Signification
Une m thode de linterface, de la dispinterface ou un point dentre dun module. Une proprit dune interface ou dune dispinterface. Une proprit en criture seule (disponible dans la liste droulante du bouton proprit). Une proprit en lecture-criture (disponible dans la liste droulante du bouton proprit). Une proprit en lecture seule (disponible dans la liste droulante du bouton proprit). Un champ dun enregistrement ou dune union. Une constante dune numration ou dun module.
Dans le troisime groupe de boutons, vous pouvez actualiser, recenser ou exporter la bibliothque de types (lenregistrer dans un fichier), comme dcrit
34-5
dans la section Enregistrement et recensement des informations dune bibliothque de types la page 34-28.
Descendant du nud bibliothque de types, vous trouvez les lments de la bibliothque de types :
Figure 34.2 Le volet liste des objets
Quand vous slectionnez lun de ces lments (y compris la bibliothque de types), les pages dinformations de types droite sont actualises pour nafficher que les informations pertinentes pour cet lment. Vous pouvez utiliser ces pages pour modifier la dfinition et les proprits de llment slectionn. Vous pouvez manipuler les lments du volet liste des objets en cliquant avec le bouton droit de la souris afin dafficher le menu contextuel du volet liste des objets. Ce menu propose des commandes qui vous permettent dutiliser le presse-papiers Windows pour dplacer ou copier des lments, dajouter de nouveaux lments ou de personnaliser laspect de lditeur de bibliothques de types.
Barre dtat
Lors de la modification ou de lenregistrement dune bibliothque de types, les erreurs de syntaxe, les erreurs de traduction et les avertissements sont affichs dans le volet barre dtat. Si, par exemple, vous spcifiez un type non g r par lditeur de bibliothques de types, vous obtiendrez une erreur de syntaxe. Pour une liste complte des types grs par lditeur de bibliothques de types, voir Types autoriss la page 34-13.
34-6
Guide du dveloppeur
Le tableau suivant indique les pages affiches selon llment slectionn dans le volet liste des objets :
El ment de type dinformation
Bibliothque de type
Contenu de la page
Nom, version et GUID de la bibliothque de types ainsi que des informations liant la bibliothque de types laide. Liste des autres bibliothques de types contenant des dfinitions dont celle-ci dpend. Indicateurs dterminant comment dautres applications peuvent utiliser la bibliothque de types. Toutes les dfinitions et dclarations dfinissant la bibliothque de types mme (voir lexplication ci-dessous). Nom, version et GUID de linterface, le nom de linterface dont elle descend et des informations liant linterface laide. Indicateurs spcifiant si linterface est cache, double, compatible Automation et/ou extensible. Les dfinitions et dclarations de linterface (voir lexplication ci-dessous) Nom, version et GUID de la dispinterface, le nom de linterface dont elle descend et des informations liant linterface laide. Indicateurs spcifiant si la dispinterface est cache, double et/ou extensible. Les dfinitions et dclarations de la dispinterface (voir lexplication ci-dessous). Nom, version et GUID de la CoClasse et des informations la liant laide. Une liste des interfaces que la CoClasse implmente ainsi que leurs attributs. Les attributs des objets transactionnels (modle de transaction, appel de synchronisation, activation juste temps, groupement dobjets, etc. Contient galement les attributs des objets vnement COM+. Indicateurs spcifiant divers attributs de la CoClasse, y compris la manire dont les clients peuvent crer et utiliser des instances, si elle est visible pour les utilisateurs dans un navigateur, si cest un contrle ActiveX, et si elle peut tre agrge (comme partie dun composite). Les dfinitions et dclarations de la CoClasse (voir lexplication ci-dessous). Nom, version et GUID de lnumration et des informations la liant laide. Les dfinitions et dclarations du type num r (voir lexplication ci-dessous). Nom, version et GUID du type que lalias reprsente et des informations le liant laide. Les dfinitions et dclarations de lalias (voir lexplication cidessous)
Interface
Dispinterface
Attributs
Indicateurs
34-7
Contenu de la page
Nom, version et GUID de lenregistrement et des informations le liant laide. Les dfinitions et dclarations de lenregistrement (voir lexplication ci-dessous) Nom, version et GUID de lunion et des information la liant laide. Les dfinitions et dclarations de lunion (voir lexplication ci-dessous). Nom, version, GUID et DLL associe du module, et des informations le liant laide. Les dfinitions et dclarations du module (voir lexplication ci-dessous). Nom, identificateur de rpartition ou point dentre de DLL et des informations liant la mthode laide. Type de valeur renvoye par la mthode et une liste de tous les paramtres avec leur type et tous les modificateurs. Indicateurs spcifiant comment les clients peuvent visualiser et utiliser la m thode, si cest la mthode par dfaut de linterface et si elle est remplaable. Les dfinitions et dclarations de la mthode (voir lexplication ci-dessous). Nom, identificateur de rpartition, type de mthode daccs la proprit (lecture ou criture) et des informations la liant laide. Type de valeur renvoye par la mthode daccs et une liste de tous les paramtres avec leur type et tous les modificateurs. Indicateurs spcifiant comment les clients peuvent visualiser et utiliser la proprit, si cest la proprit par dfaut de linterface, si elle est remplaable, si elle peut tre lie, etc. Les dfinitions et dclarations de la mthode daccs la proprit (voir lexplication ci-dessous). Nom, valeur et type (pour les constantes de module) et des informations liant la constante laide. Indicateurs spcifiant comment les clients peuvent visualiser et utiliser la constante, si elle reprsente une valeur par dfaut, si la constante peut tre lie, etc. Les dfinitions et dclarations de la constante (voir lexplication ci-dessous). Nom, type et des informations liant le champ laide Indicateurs spcifiant comment les clients peuvent visualiser et utiliser le champ, sil reprsente une valeur par dfaut, si le champ peut tre li, etc. Les dfinitions et dclarations du champ (voir lexplication cidessous).
Enregistrement Attributs Texte Union Attributs Texte Module Attributs Texte Mthode Attributs Paramtres Indicateurs
Paramtres
Indicateurs
Texte
34-8
Guide du dveloppeur
Remarque
Pour davantage dinformations sur les diverses options dfinissables dans les pages dinformations de type, voir laide en ligne de lditeur de bibliothques de types. Vous pouvez utiliser chacune des pages dinformations de type pour visualiser ou modifier les valeurs quelles affichent. La plupart des pages organisent les informations dans un ensemble de contrles afin que vous puissiez saisir des valeurs ou les slectionner sans avoir connatre la syntaxe des dclarations correspondantes. Cela vite beaucoup derreurs de saisie quand vous sp cifiez une valeur comprise dans un ensemble dtermin. Cependant, vous pouvez trouver plus efficace de saisir directement la dclaration. Pour ce faire, utilisez la page Texte. Tous les lments des bibliothques de types disposent dune page Texte qui affiche la syntaxe de llment. Cette syntaxe utilise un sous-ensemble du langage Microsoft IDL (Interface Definition) ou Pascal Objet. Les modifications effectues dans les autres pages de llment sont refltes ici. Si vous ajoutez du code directement dans la page Texte, les modifications sont refltes dans les autres pages de lditeur de bibliothques de types. Lditeur de bibliothques de types gnre des erreurs de syntaxe si vous ajoutez des identificateurs qui ne sont pas grs par lditeur ; lditeur ne gre actuellement que les identificateurs associs la gestion de bibliothques (et pas ceux associs la gestion RPC ou les constructions utilises par le compilateur Microsoft IDL pour la gnration de code C++ ou la gestion du marshalling).
34-9
rfrence un fichier daide ou une DLL dont le nom est spcifi dans la page Attributs de la bibliothque de types. Ces informations sont toujours facultatives.
Interfaces
Linterface dcrit les mthodes (et les proprits exprimes comme fonctions get/ set) dun objet auquel il faut daccder via une table de fonction virtuelle (VTable). Si une interface est dfinie comme double, ce qui est le cas par dfaut, une dispinterface est galement implique et peut tre atteinte via lautomation OLE. Par dfaut, la bibliothque de types marque toutes les interfaces ajoutes comme double. Il est possible dattribuer des membres aux interfaces : des mthodes et des proprits. Elles apparaissent dans le volet liste des objets comme enfant du nud interface. Les proprits des interfaces sont reprsentes par les mthodes get et set utilises pour lire et crire les donnes sous-jacentes de la proprit. Elles sont reprsentes dans la vue arborescente par des icnes spciales qui indiquent leur fonction.
Remarque
Si une proprit est spcifie comme Ecriture par rfrence, cela signifie quelle est transmise comme pointeur et non comme valeur. Certaines applications, comme Visual Basic, utilisent si possible lcriture par rfrence pour optimiser les performances. Pour passer une proprit uniquement par rfrence plutt que par valeur, utilisez le type de proprit Par rfrence seulement. Pour transmettre la proprit par adresse et par valeur, slectionnez Lecture | Ecriture | Ecriture par rfrence. Pour activer ce menu, slectionnez dans la barre doutils la flche en regard de licne de la proprit. Une fois les proprits et mthodes ajoutes en utilisant les boutons de la barre doutils ou le menu contextuel du volet liste des objets, vous pouvez dcrire leur syntaxe et leurs attributs en slectionnant la proprit ou la mthode et en utilisant les pages dinformations de type. La page Attributs vous permet dattribuer un nom la proprit ou mthode et un identificateur de rpartition (afin de pouvoir lappeler en utilisant IDispatch). Pour les proprits, vous pouvez galement attribuer un type. La signature de fonction est cre en utilisant la page Paramtres qui vous permet dajouter, de supprimer ou dorganiser les paramtres, de dfinir leur type et les modificateurs et de spcifier le type de retour de la fonction.
Remarque
Les membres des interfaces qui veulent dclencher des exceptions doivent renvoyer un HRESULT et spcifier un paramtre de valeur renvoye (PARAM_RETVAL) pour la valeur rellement renvoye. Dclarez ces mthodes en utilisant la convention dappel safecall. Si vous attribuez des proprits et des mthodes une interface, elles sont implicitement attribues sa CoClasse associe. Cest pour cela que lditeur de bibliothques de types ne vous permet pas dajouter directement des mthodes ou des proprits une CoClasse.
34-10
Guide du dveloppeur
Dispinterfaces
Les interfaces sont plus frquemment utilises que les dispinterfaces pour dcrire les proprits et mthodes dun objet. Les dispinterfaces sont accessibles uniquement au travers dune liaison dynamique alors que les interfaces peuvent aussi utiliser une liaison statique grce une vtable. Vous pouvez ajouter des proprits et mthodes aux dispinterfaces comme pour les interfaces. Cependant, quand vous crez une proprit pour une dispinterface, vous ne pouvez spcifier le type de fonction ou le type des paramtres.
CoClasses
Une CoClasse dcrit un objet COM unique qui implmente une ou plusieurs interfaces. Quand vous dfinissez une CoClasse, vous devez spcifier linterface implmente qui est celle par dfaut pour lobjet et, de manire facultative, la dispinterface qui est la source par dfaut des vnements. Il nest pas possible dajouter directement des proprits ou mthodes une CoClasse dans lditeur de bibliothques de types. Les proprits et mthodes sont exposes aux clients par les interfaces, qui sont associes la CoClasse avec la page Implmente.
Dfinitions de types
Les numrations, les alias, les enregistrements et les unions dclarent des types qui peuvent ensuite tre utiliss ailleurs dans la bibliothque de types. Les numrations sont constitues dune liste de constantes numriques. Ces constantes sont gnralement des valeurs entires au format dcimal ou hexadcimal. Par dfaut, la valeur de base est zro. Vous pouvez ajouter des constantes une numration en la slectionnant dans le volet liste des objets, puis en choisissant le bouton Constante de la barre doutils ou en slectionnant la commande Nouveau|Const dans le menu contextuel du volet liste des objets.
Remarque
Il est fortement conseill de spcifier une chane daide pour les numrations. Voici un exemple dentre dun type numration pour un bouton de souris qui inclut une chane daide pour chacun des lments de lnumration :
mbLeft = 0 [helpstring mbLeft]; mbRight = 1 [helpstring mbRight]; mbMiddle = 3 [helpstring mbMiddle];
Un alias dfinit un alias (une dfinition de type) pour un type. Un alias permet de dfinir des types sutilisant dans dautres types, par exemple des enregistrements ou des unions. Associez lalias au type sous-jacent en spcifiant lattribut Type dans la page Attributs. Un enregistrement est constitu de la liste des membres de la structure, ou champs. Une union est un enregistrement ayant seulement une partie de type variant. Comme un enregistrement, une union est constitue de la liste des membres de la structure, ou champs. Mais, la diffrence des membres dun enregistrement, tous les membres dune union occupent le mme emplacement physique, il nest donc possible de stocker quune seule valeur logique.
34-11
Ajoutez les champs un enregistrement ou une union en le slectionnant dans le volet liste des objets puis en choisissant le bouton Champ de la barre doutils ou en utilisant le menu contextuel du volet liste des objets. Chaque champ dispose dun nom et dun type que vous pouvez spcifier en slectionnant le champ et en attribuant les valeurs dans la page Attributs. Les enregistrements et les unions peuvent tre dfinis avec un repre optionnel. Les membres peuvent tre de nimporte quel type prdfini. Vous pouvez aussi spcifier un type en utilisant un alias avant de dfinir lenregistrement.
Modules
Un module dfinit un groupe de fonctions, gnralement un ensemble de points dentre de DLL. Vous dfinissez un module en : Spcifiant la DLL quil reprsente dans la page Attributs. Ajoutant des mthodes et des constantes en utilisant la barre doutils ou le menu contextuel du volet liste des objets. Vous devez ensuite spcifier les attributs de chaque mthode ou constante en la slectionnant dans le volet liste des objets, puis en dfinissant les valeurs dans la page Attributs. Pour les mthodes de module, vous devez spcifier dans la page Attributs un nom et un point dentre dans la DLL. Dclarez les paramtres de la fonction et le type de valeur renvoy dans la page Paramtres. Pour les constantes de module, utilisez la page Attributs pour spcifier le nom, le type et la valeur.
Remarque
Lditeur de bibliothques de types ne gnre aucune dclaration ou implmentation associe un module. La DLL spcifie doit tre cre dans un projet spar.
34-12
Guide du dveloppeur
Vous pouvez effectuer les oprations suivantes dans une bibliothque de types : Cration dune nouvelle bibliothque de types Ouverture dune bibliothque de types existante Ajout dune interface une bibliothque de types Modification dune interface Ajout de proprits et de mthodes une bibliothque de types Ajout dune CoClasse une bibliothque de types Ajout dune interface une CoClasse Ajout dune numration une bibliothque de types Ajout dun alias une bibliothque de types Ajout dun enregistrement ou dune union une bibliothque de types Ajout dun module une bibliothque de types Enregistrement et recensement des informations dune bibliothque de types
Types autoriss
Dans lditeur de bibliothques de types, vous utilisez des identificateurs de types diffrents, selon que vous travaillez en IDL ou en Pascal Objet. Spcifiez le langage que vous voulez utiliser dans la bote de dialogue Options denvironnement. Les types suivants sont autoriss dans une bibliothque de types pour le dveloppement COM. La colonne Compatible Automation sp cifie si le type peut tre utilis par une interface dont lindicateur Automation ou Dispinterface est activ. COM utilise automatiquement le marshalling pour les types suivants via la bibliothque de types.
Type Pascal
Smallint Integer Single Double Currency TDateTime WideString IDispatch SCODE WordBool OleVariant IUnknown Shortint Byte Word LongWord
Type IDL
short long single double CURRENCY DATE BSTR IDispatch SCODE VARIANT_BOOL VARIANT IUnknown byte unsigned char unsigned short unsigned long
Type variant
VT_I2 VT_I4 VT_R4 VT_R8 VT_CY VT_DATE VT_BSTR VT_DISPATCH VT_ERROR VT_BOOL VT_VARIANT VT_UNKNOWN VT_I1 VT_UI1 VT_UI2 VT_UI4
Compatible Automation
Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Oui Non Oui Oui* Oui*
Description
entier sign sur 2 octets entier sign sur 4 octets Rel sur 4 octets Rel sur 8 octets Montaire Date Chane binaire Pointeur sur une interface IDispatch Code derreur OLE Vrai = -1, faux = 0 Variant OLE Pointeur sur une interface IUnknown Entier sign sur 1 octet Entier non sign sur 1 octet Entier non sign sur 2 octets Entier non sign sur 4 octets
34-13
Type Pascal
Int64 Largeuint SYSINT SYSUINT HResult Pointer SafeArray PChar PWideChar
Type IDL
__int64 uint64 int unsigned int HRESULT SAFEARRAY LPSTR LPWSTR
Type variant
VT_I8 VT_UI8 VT_INT VT_UINT VT_HRESULT VT_PTR -> VT_VOID VT_SAFEARRAY VT_LPSTR VT_LPWSTR
Compatible Automation
Non Non Oui* Oui* Non Non Non Non Non
Description
Entier sign sur 8 octets Entier non sign sur 8 octets Entier dpendant du systme (Win32=Integer) Entier non sign dpendant du systme Code derreur 32 bits Pointeur non typ Tableau protg OLE Pointeur sur un Char Pointeur sur un WideChar
* Word, LongWord, SYSINT et SYSUINT sont compatibles Automation dans la plupart des applications, mais ils peuvent ne pas ltre dans des anciennes applications.
Remarque
Le type Byte (VT_UI1) est compatible avec lAutomation, mais il nest pas autoris dans un Variant ou un OleVariant car de nombreux serveurs Automation ne grent pas correctement cette valeur. Outre ces types, toute interface ou type dfini dans la bibliothque ou dans les bibliothques rfrences peut sutiliser dans une dfinition de bibliothque de types. Lditeur de bibliothques de types stocke les informations de type dans le fichier (.TLB) de bibliothque de types gnre sous forme binaire. Si un paramtre est de type Pointer, lditeur de bibliothques de types le convertit gnralement en paramtre variable. Quand la bibliothque de types est enregistre, les indicateurs IDL des ElemDesc associs aux paramtres variable sont marqus IDL_FIN ou IDL_FOUT. Souvent, les indicateurs IDL ElemDesc ne sont pas marqu s par IDL_FIN ni par IDL_FOUT lorsque le type est prcd dun pointeur. De mme, sil sagit de dispinterfaces, les indicateurs IDL ne sont gnralement pas utiliss. Dans ces situations, on peut voir ct de lidentificateur de variable un commentaire comme {IDL_None} ou {IDL_In}. Ces commentaires sont utiliss lors de lenregistrement dune bibliothque de types, pour marquer correctement les indicateurs IDL.
Les SafeArray
COM requiert que les tableaux soient transmis via un type de donnes spcial appel SafeArray. Vous pouvez crer et dtruire les SafeArrays en appelant des fonctions COM particulires, et tous les lments dun SafeArray doivent tre de types compatibles automation-valides. Le compilateur Delphi dispose dinformations intgres sur les SafeArrays COM et appellera automatiquement lAPI COM pour crer, copier et dtruire des SafeArrays.
34-14
Guide du dveloppeur
Dans lditeur de bibliothques de types, un SafeArray doit spcifier son type de composant. Par exemple, la ligne suivante de la page Texte dclare une mthode avec un paramtre SafeArray avec un lment de type Integer :
procedure HighLightLines(Lines: SafeArray of Integer);R Remarque
Mme si vous devez spcifier le type de llment lors de la dclaration dun type SafeArray dans lditeur de bibliothques de types, la dclaration du fichier unit _TLB gnr nindique pas le type de llment.
Si vous travaillez sur un objet CORBA, vous ne devez utiliser aucune de ces syntaxes mais employer la place lIDL CORBA. Pour slectionner le langage utilis, il vous suffit de modifier un paramtre de la bote de dialogue Options denvironnement. Choisissez Outils|Options denvironnement, et spcifiez Pascal ou IDL comme langage de lditeur dans la page Bibliothques de types de la bote de dialogue.
Remarque
Le choix de la syntaxe Pascal Objet ou IDL affecte galement les choix disponibles dans la page Attributs des paramtres. Comme cest gnralement le cas pour les applications Pascal Objet, les identificateurs des bibliothques de types ne distinguent pas les majuscules des minuscules. Ils peuvent avoir jusqu 255 caractres et doivent commencer par une lettre ou un caractre de soulignement (_).
34-15
Le tableau suivant est la liste des noms dattributs et des valeurs correspondantes.
Tableau 34.3
aggregatable appobject bindable control custom default defaultbind defaultcollection defaultvtbl dispid displaybind dllname dual helpfile helpstringdll helpcontext helpstring helpstringcontext hidden immediatebind lcid licensed nonbrowsable nonextensible oleautomation predeclid propget
Nom dattribut
Sapplique
typeinfo typeinfo dune CoClasse membres, sauf membres dune CoClasse bibliothque de types, typeinfo tout membres dune CoClasse membres, sauf membres dune CoClasse membres, sauf membres dune CoClasse membres dune CoClasse membres, sauf membres dune CoClasse membres, sauf membres dune CoClasse typeinfo dun module typeinfo dune interface bibliothque de types bibliothque de types tout sauf membres et param tres dune CoClasse tout sauf membres et param tres dune CoClasse tout sauf membres et param tres dune CoClasse tout sauf des paramtres membres, sauf membres dune CoClasse bibliothque de types bibliothque de types, typeinfo dune CoClasse membres, sauf membres dune CoClasse typeinfo dune interface typeinfo dune interface typeinfo membres, sauf membres dune CoClasse
34-16
Guide du dveloppeur
Tableau 34.3
propput propputref public readonly replaceable requestedit restricted source uidefault
Nom dattribut
Sapplique
membres, sauf membres dune CoClasse membres, sauf membres dune CoClasse typeinfo dun alias membres, sauf membres dune CoClasse tout sauf membres et param tres dune CoClasse membres, sauf membres dune CoClasse tout sauf des paramtres tous les membres membres, sauf membres dune CoClasse membres, sauf membres dune CoClasse bibliothque de types, typeinfo (obligatoire) membres, sauf membres dune CoClasse bibliothque de types, typeinfo
Par exemple, le texte suivant est la dclaration dune interface avec deux mthodes et une proprit :
Interface1 = interface (IDispatch) [uuid {7B5687A1-F4E9-11D1-92A8-00C04F8C8FC4}, version 1.0] function Calculate(optional seed:Integer=0): Integer; procedure Reset; procedure PutRange(Range: Integer) [propput, dispid $00000005]; stdcall; function GetRange: Integer;[propget, dispid $00000005]; stdcall; end;
34-17
long Calculate([in, optional, defaultvalue(0)] long seed); void Reset(void); [propput, id(0x00000005)] void _stdcall PutRange([in] long Value); [propput, id(0x00000005)] void _stdcall getRange([out, retval] long *Value); };
Par exemple, le texte suivant est la dclaration dune dispinterface avec les mmes mthodes et la mme proprit que pour linterface prcdente :
MyDispObj = dispinterface [uuid {5FD36EEF-70E5-11D1-AA62-00C04FB16F42}, version 1.0, helpstring dispatch interface for MyObj] function Calculate(seed:Integer): Integer [dispid 1]; procedure Reset [dispid 2]; property Range: Integer [dispid 3]; end;
Par exemple, le texte suivant est la dclaration dune coclasse pour linterface IMyInt et la dispinterface DmyInt :
myapp = coclass(IMyInt [source], DMyInt); [uuid {2MD36ABF-90E3-11D1-AA75-02C04FB73F42}, version 1.0, helpstring A class, appobject]
34-18
Guide du dveloppeur
Par exemple, le texte suivant est la dclaration dun type numr avec trois valeurs :
location = ([uuid {2MD36ABF-90E3-11D1-AA75-02C04FB73F42}, helpstring emplacement de la cabine] Inside = 1 [helpstring Dans le pavillon]; Outside = 2 [helpstring A lextrieur du pavillon]; Offsite = 3 [helpstring Loin du pavillon];);
Par exemple, le texte suivant est la dclaration dun DWORD comme alias dun entier :
DWORD = Integer [uuid {2MD36ABF-90E3-11D1-AA75-02C04FB73F42}];
34-19
34-20
Guide du dveloppeur
Par exemple, le texte suivant est la dclaration des informations de type dun module :
MyModule = module [uuid {2MD36ABF-90E3-11D1-AA75-02C04FB73F42}, dllname circle.dll] PI: Double = 3.14159; function area(radius: Double): Double [ entry 1 ]; stdcall; function circumference(radius: Double): Double [ entry 2 ]; stdcall; end;
1 Choisissez Fichier|Nouveau|Autre afin douvrir la bote de dialogue Nouveaux lments. 2 Choisissez la page ActiveX. 3 Slectionnez licne Bibliothque de types. 4 Choisissez OK.
34-21
5 Entrez le nom de la bibliothque de types. Poursuivez en ajoutant les lments de la bibliothque de types.
1 Choisissez Fichier|Ouvrir dans le menu principal de lEDI. 2 Dans la bote de dialogue Ouvrir, initialisez la liste Type Bibliothques de types. 3 Slectionnez la bibliothque de types souhaite et choisissez Ouvrir.
Pour ouvrir une bibliothque de types associe au projet en cours,
Si vous utilisez lexpert objet CORBA, vous pouvez galement utiliser Voir| Bibliothque de types pour modifier les interfaces dobjet CORBA. Ce que vous voyez alors nest pas proprement dit une bibliothque de types, mais vous lutilisez de la mme manire. Vous pouvez maintenant ajouter des interfaces, CoClasses et dautres lments la bibliothque de types (numrations, proprits ou mthodes, etc.).
Remarque
Les modifications effectues aux informations de bibliothque de types laide de lditeur de bibliothque de types peuvent se reflter automatiquement dans la classe dimplmentation associe. Si vous prfrez au pralable revoir les modifications, vrifiez que la bote de dialogue est active. Elle est active par dfaut et ce paramtrage peut tre modifi avec loption daffichage des mises jour avant le rafrachissement prsente sur la page Outils|Options denvironnement|Bibliothque de types. Pour plus dinformations, voir Bote de dialogue Appliquer les mises jour la page 34-28. Quand vous crivez des applications client, il nest pas ncessaire douvrir la bibliothque de types. Vous avez juste besoin de lunit Projet_TLB cre par lditeur de bibliothques de types et pas de la bibliothque de types mme. Il est possible dajouter directement ce fichier dans un projet client ou, si la bibliothque de types est recense sur votre systme, vous pouvez utiliser la bote de dialogue Importation de bibliothque de types (Projet|Importation de bibliothque de types).
Astuce
34-22
Guide du dveloppeur
Si vous utilisez la bibliothque de types pour ajouter une interface CORBA, la plupart des informations de la page Attributs sont inapplicables. Vous navez pas non plus besoin de la page Indicateurs. Si linterface est associe une CoClasse gnre par un expert, vous pouvez demander lditeur de bibliothques de types dappliquer les modifications au fichier implmentation en utilisant le bouton Rafrachir limplmentation de la barre doutils.Si la bote de dialogue Appliquer les mises jour est active, lditeur de bibliothques de types vous prvient avant de mettre jour les sources lorsque vous enregistrez la bibliothque de types et vous avertit de problmes ventuels. Par exemple, si vous renommez une interface dvnement
34-23
par erreur, vous obtenez dans votre fichier source un avertissement du type suivant :
En raison de la prsence de variables dinstance dans votre fichier dimplmentation, Delphi na pas pu mettre jour le fichier pour reflter la modification du nom de linterface dvnement. Bien que Delphi ait mis jour la bibliothque de types, vous devez mettre jour le fichier dimplmentation manuellement.
1 Slectionnez linterface et choisissez licne Proprit ou Mthode dans la barre doutils. Si vous ajoutez une proprit, vous pouvez cliquer directement dans licne Proprit pour crer une proprit en lecture/criture (avec des fonctions get et set), ou cliquez sur la flche vers le bas pour afficher un menu des types de proprits.
Les membres mthode daccs la proprit ou le membre mthode sont ajouts au volet liste des objets et vous pouvez en saisir le nom.
Si vous utilisez IDL, vous pouvez ajouter les mmes dclarations de la manire suivante :
[ uuid(5FD36EEF-70E5-11D1-AA62-00C04FB16F42), version(1.0), dual, oleautomation
34-24
Guide du dveloppeur
] interface Interface1: IDispatch { // Ajoutez tout ce qui se trouve entre les accolades [propget, id(0x00000002)] HRESULT _stdcall AutoSelect([out, retval] long Value ); [propget, id(0x00000003)] HRESULT _stdcall AutoSize([out, retval] VARIANT_BOOL Value ); [propput, id(0x00000003)] HRESULT _stdcall AutoSize([in] VARIANT_BOOL Value ); };
Une fois des membres ajouts une interface en utilisant la page Texte de linterface, les membres apparaissent comme lments distincts dans le volet liste des objets. Chaque membre dispose de ses propres pages Attributs, Indicateurs et Paramtres. Vous pouvez modifier chaque nouvelle proprit ou mthode en la slectionnant dans le volet liste des objets et en utilisant ses pages ou en effectuant les modifications directement dans la page Texte. Si linterface est associe une CoClasse gnre par un expert, vous pouvez demander lditeur de bibliothques de types dappliquer les modifications au fichier implmentation en utilisant le bouton Rafrachir de la barre doutils. Lditeur de bibliothques de types ajoute les nouvelles mthodes la classe dimplmentation afin de reflter les nouveaux membres. Vous pouvez ensuite rechercher les nouvelles mthodes dans le code source de lunit dimplmentation et remplir leurs corps afin de complter limplmentation. Si la bote de dialogue Appliquer les mises jour est active, lditeur de bibliothques de types vous prvient avant de mettre jour les sources lorsque vous enregistrez la bibliothque de types et vous avertit de problmes ventuels.
Si vous ajoutez une CoClasse une bibliothque de types en utilisant la barre doutils au lieu de lexpert, vous devez gnrer vous-mme limplmentation pour la CoClasse et lactualiser manuellement chaque fois que vous modifiez un lment de lune des interfaces de la CoClasse. Il nest pas possible dajouter directement des membres une CoClasse. Cest implicitement que vous ajoutez des membres quand vous ajoutez une interface la CoClasse.
34-25
34-26
Guide du dveloppeur
3 Ayant slectionn lenregistrement ou lunion dans le volet liste des objets, choisissez le bouton Champ dans la barre doutils. Spcifiez le nom et le type du champ en utilisant la page Attributs. 4 Rptez ltape 3 pour chaque champ ncessaire.
Une fois lenregistrement ou lunion dfini, le nouveau type peut tre utilis par la bibliothque de types ou par toute bibliothque de types qui y fait rfrence dans sa page Utilise. Vous pouvez, par exemple, utiliser lenregistrement ou lunion comme type dune proprit ou dun paramtre.
2 Saisissez le nom du module 3 Dans la page Attributs, spcifiez le nom de la DLL dont le module reprsente les points dentre. 4 Ajoutez des mthodes de la DLL spcifie ltape 3 en choisissant le bouton Mthode dans la barre doutils puis en utilisant la page Attributs pour dcrire la mthode. 5 Ajoutez les constantes que le module doit dfinir en choisissant le bouton Constante de la barre doutils. Pour chaque constante, spcifiez le nom, le type et une valeur.
34-27
La bibliothque de types est stocke dans un fichier binaire distinct (.TLB), mais elle est galement lie au serveur (.EXE, DLL ou .OCX). Si vous utilisez lditeur de bibliothques de types pour des interfaces CORBA, lunit Projet_TLB.pas dfinit les objets stub et squelette ncessaires lapplication CORBA. Lditeur de bibliothques de types vous propose plusieurs options pour stocker les informations de la bibliothque de types. Loption utilise dpend de ltape en cours de limplmentation de la bibliothque de types : Enregistrer pour enregistrer le fichier .TLB et lunit Projet_TLB sur disque. Rafrachir pour actualiser uniquement en mmoire les units de la bibliothque de types. Recenser pour ajouter une entre au registre Windows de votre systme pour la bibliothque de types. Cela est effectu automatiquement lors du recensement du serveur auquel le fichier .TLB est associ. Exporter pour enregistrer un fichier .IDL contenant les dfinitions de types et dinterfaces avec la syntaxe IDL. Toutes les mthodes dcrites ci-dessus effectuent une vrification de la syntaxe. Quand vous rafrachissez, recensez ou enregistrez la bibliothque de types, Delphi actualise automatiquement lunit dimplmentation de toutes les CoClasses cres en utilisant un expert. Vous pouvez, de manire facultative, vrifier les modifications avant leur application, si loption Appliquer les modifications de lditeur de bibliothques de types est active.
34-28
Guide du dveloppeur
exemple, si vous renommez un vnement par erreur, vous obtenez dans votre fichier source un avertissement du type suivant :
En raison de la prsence de variables dinstance dans votre fichier dimplmentation, Delphi na pas pu mettre jour le fichier pour reflter la modification du nom de linterface dvnement. Bien que Delphi ait mis jour la bibliothque de types, vous devez mettre jour le fichier dimplmentation manuellement.
Si vous ignorez cet avertissement et le commentaire TODO, le code nest pas compil.
Pour enregistrer la bibliothque de types, choisissez Fichier|Enregistrer dans le menu principal de Delphi.
Si vous avez renomm ou supprim des lments de la bibliothque de types, le rafrachissement de limplmentation peut crer des entres en double. Dans ce cas, vous devez dplacer le code pour corriger lentre et supprimer les doublons. De mme, si vous supprimez des lments de la bibliothque de types, le rafrachissement de limplmentation ne les retire pas des CoClasses (partant du principe que vous voulez juste les rendre invisibles aux clients). Vous devez supprimer ces lments manuellement dans lunit dimplmentation quand ils ne sont plus ncessaires.
34-29
bibliothque de types, elle nest pas associe un objet serveur. Dans ce cas, vous pouvez la recenser directement en utilisant la barre doutils. Le recensement dune bibliothque de types effectue les actions suivantes : Vrification de la syntaxe. Ajout aux registres Windows dune entre pour la bibliothque de types. Pour recenser la bibliothque de types, choisissez licne Recenser de la barre doutils de lditeur de bibliothques de types.
Il peut y avoir plusieurs ressources bibliothque de types dans une bibliothque ActiveX. Les dveloppeurs dapplications utilisent un compilateur
34-30
Guide du dveloppeur
de ressource pour ajouter le fichier .TLB leurs propres bibliothques ActiveX. Un fichier binaire autonome. Le fichier .TLB gnr par lditeur de bibliothques de types est un fichier binaire.
34-31
34-32
Guide du dveloppeur
35
Chapitre 35
Chapitre
Les clients COM sont des applications qui utilisent un objet COM implment par une autre application ou bibliothque. Les types les plus courants sont les applications qui contrlent des serveurs Automation (ce sont les contrleurs Automation) et les applications qui accueillent un contrle ActiveX (ce sont les conteneurs ActiveX). Au premier abord, ces deux types de clients COM semblent trs diffrents : un contrleur Automation standard lance un serveur EXE externe et met des commandes que le serveur traite pour lui. Le serveur Automation est gnralement non visuel et hors processus. Dun autre ct, le client ActiveX standard accueille un contrle visuel en lutilisant comme vous pouvez utiliser les contrles de la palette des composants. Les serveurs ActiveX sont toujours des serveurs en processus. Cependant, la ralisation de ces deux types de clients COM est tonnamment similaire : lapplication client obtient une interface pour lobjet serveur et en utilise les proprits et mthodes. Delphi simplifie beaucoup cela en vous permettant denvelopper la CoClasse serveur dans un composant du client que vous pouvez mme installer dans la palette des composants. Des exemples de tels composants enveloppe apparaissent dans deux pages de la palette des composants : des enveloppes ActiveX exemple apparaissent dans la page ActiveX et des objets Automation exemple apparaissent dans la page Serveurs. Quand vous crivez un client COM, vous devez comprendre linterface que le serveur expose aux clients, exactement comme vous devez comprendre les proprits et mthodes dun composant de la palette des composants pour pouvoir lutiliser dans votre application. Cette interface (ou cet ensemble dinterfaces) est dtermine par lapplication serveur et se trouve gnralement publie dans une bibliothque de types. Pour des informations spcifiques sur les interfaces publies par une application serveur spcifique, vous devez consulter la documentation de cette application. Mme si vous ne choisissez pas denvelopper un objet serveur et de linstaller dans la palette des composants, vous devez rendre sa dfinition dinterface
35-1
accessible votre application. Pour ce faire, vous pouvez importer les informations de la bibliothque de types du serveur.
Remarque
Vous pouvez galement interroger directement les informations de type en utilisant lAPI COM, mais Delphi ne propose pas de gestion particulire de ce processus. Certaines anciennes technologies COM comme OLE ne proposent pas les informations de type dans une bibliothque de types. Elles reposent la place sur un ensemble standard dinterfaces prdfinies. Elles sont prsentes dans Cration de clients pour les serveurs nayant pas une bibliothque de types la page 35-17.
35-2
Guide du dveloppeur
Outre lajout des dfinitions de types lunit NomBibTypes_TLB, la bote de dialogue peut galement crer des classes enveloppe VCL pour toutes les CoClasses dfinies dans la bibliothque de types. Quand vous utilisez la bote de dialogue Importation de bibliothque de types, ces classes enveloppe sont facultatives. Quand vous utilisez la bote de dialogue Importation dActiveX, elles sont toujours gnres pour toutes les CoClasses reprsentant des contrles. Les classes enveloppe gnres reprsentent les CoClasses de votre application et exposent les proprits et mthodes de ses interfaces. Si une CoClasse gre les interfaces de cration dvnements (IConnectionPointContainer et IConnectionPoint), la classe enveloppe VCL cre un collecteur dvnements afin que vous puissiez affecter des gestionnaires dvnements aux vnements aussi facilement que pour les autres composants. Si vous demandez dans la bote de dialogue dinstaller les classes VCL g nres dans la palette des composants, vous pouvez utiliser linspecteur dobjets pour affecter des valeurs aux proprits et aux gestionnaires dvnements.
Remarque
La bote de dialogue Importation de bibliothque de types ne cre par de classe enveloppe pour les objets vnement COM+. Pour crire un client rpondant aux vnements gnrs par un objet vnement COM+, vous devez crer le collecteur dvnements par code. Ce processus est dcrit dans Gestion des vnements COM+ la page 35-16. Pour davantage de dtails sur le code gnr quand vous importez une bibliothque de types, voir Code gnr par limportation des informations dune bibliothque de types la page 35-5.
1 Choisissez Projet|Importer une bibliothque de types. 2 Slectionnez la bibliothque de types dans la liste.
La bote de dialogue rpertorie toutes les bibliothques recenses sur ce systme. Si la bibliothque de types nest pas dans la liste, choisissez le bouton Ajouter, trouvez et slectionnez le fichier de la bibliothque de types et choisissez OK et rptez ltape 2. Remarquez que la bibliothque de types peut tre un fichier bibliothque de types autonome (.tlb, .olb) ou un serveur fournissant une bibliothque de types (.dll, .ocx, .exe).
3 Si vous voulez gnrer un composant VCL qui encapsule une CoClasse de la bibliothque de types, cochez la case Gnrer le Wrapper de composant. Si vous ne gnrez pas le composant, vous pouvez toujours utiliser la CoClasse en utilisant les dfinitions de lunit NomBibTypes_TLB. Cependant vous avez alors crire vos propres appels pour crer lobjet serveur et, si ncessaire, configurer un collecteur dvnements.
La bote de dialogue Importation de bibliothque de types nimporte que les CoClasses ayant lindicateur CanCreate activ et nayant pas les indicateurs
35-3
Hidden, Restricted ou PreDeclID activs. Ces indicateurs peuvent tre redfinis au moyen de lutilitaire en ligne de commande tlibimp.exe.
4 Si vous ne voulez pas installer le composant gnr dans la palette des composants, choisissez Crer lunit. Cela gnre lunit NomBibTypes_TLB et, si vous avez coch loption Gnrer le Wrapper de composant ltape 3, y ajoute les dclarations du composant enveloppe. Cela entrane la sortie de la bote de dialogue Importation de bibliothque de types. 5 Si vous voulez installer dans la palette des composants le composant enveloppe gnr, slectionnez la page de la palette dans laquelle vous voulez placer le composant et choisissez Installer. Cela gnre lunit NomBibTypes_TLB, comme le bouton Crer lunit, puis cela affiche la bote de dialogue Installation de composant qui vous permet de spcifier le paquet (existant ou nouveau) dans lequel placer le composant. Ce bouton est gris si aucun composant ne peut tre cr pour la bibliothque de types.
Quand vous sortez de la bote de dialogue Importation de bibliothque de types, lunit NomBibTypes_TLB apparat dans le rpertoire spcifi par loption Rpertoire unit. Ce fichier contient les dclarations pour les lments dfinis dans la bibliothque de types, ainsi que pour les composants enveloppe gnrs si vous avez coch loption Gnrer le Wrapper de composant. De plus, si vous avez install le composant enveloppe gnr, lobjet serveur dfini par la bibliothque de types a t ajout la palette des composants. Vous pouvez utiliser linspecteur dobjets pour dfinir les proprits du serveur ou crire un gestionnaire dvnement. Si vous ajoutez le composant dans une fiche ou un module de donnes, vous pouvez cliquer dessus la conception avec le bouton droit de la souris pour voir sa page de proprits (sil en a une).
Remarque
La page Serveurs de la palette de composants contient un certain nombre dexemples de serveurs Automation qui ont t imports de cette manire.
3 Si vous ne voulez pas installer le contrle ActiveX dans la palette des composants, choisissez Crer lunit. Cela gnre lunit NomBibTypes_TLB et y ajoute la dclaration de ses envelopppes de composants. Cela entrane la sortie de la bote de dialogue Importation dActiveX.
35-4
Guide du dveloppeur
4 Si vous voulez installer le contrle dans la palette des composants, slectionnez la page de la palette dans laquelle vous voulez placer le composant et choisissez Installer. Cela gnre lunit NomBibTypes_TLB, comme le bouton Crer lunit, puis cela affiche la bote de dialogue Installation de composant qui vous permet de spcifier le paquet (existant ou nouveau) dans lequel placer le composant
Quand vous sortez de la bote de dialogue Importation dActiveX, lunit NomBibTypes_TLB apparat dans le rpertoire spcifi par loption Rpertoire unit. Ce fichier contient les dclarations pour les lments dfinis dans la bibliothque de types, ainsi que pour le composant enveloppe gnr pour le contrle ActiveX.
Remarque
A la diffrence de la bote de dialogue Importation de bibliothque de types o cest facultatif, la bote de dialogue Importation dActiveX gnre toujours un composant enveloppe. En effet, comme cest un contrle visuel, un contrle ActiveX a besoin de lassistance supplmentaire du composant enveloppe pour pouvoir sadapter aux fiches VCL. Si vous installez le composant enveloppe gnr, il y a un contrle ActiveX dans la palette des composants. Vous pouvez utiliser linspecteur dobjets pour dfinir ses proprits ou crire des gestionnaires dvnements. Si vous ajoutez le contrle dans une fiche ou un module de donnes, vous pouvez cliquer dessus la conception avec le bouton droit de la souris pour voir sa page de proprits (sil en a une).
Remarque
La page ActiveX de la palette des composants contient un certain nombre dexemples de contrles ActiveX imports de cette manire.
35-5
Des dclarations pour les interfaces et dispinterfaces de la bibliothque de types. Des dclarations pour une classe crateur pour chaque CoClasse dont linterface par dfaut gre les liaisons par Vtable. La classe crateur a deux mthodes de classe, Create et CreateRemote, qui peuvent sutiliser pour instancier la CoClasse localement (Create) ou distance (CreateRemote). Ces mthodes renvoient linterface par dfaut de la CoClasse. Ces dclarations fournissent ce qu il faut pour crer des instances de la CoClasse et accder son interface. Il vous faut ajouter le fichier NomBibTypes_TLB.pas gnr la clause uses de lunit dans laquelle vous voulez effectuer le lien avec une CoClasse et appeler ses interfaces.
Remarque
Cette portion de lunit NomBibTypes_TLB est galement gnre quand vous utilisez lditeur de bibliothques de types ou lutilitaire en ligne de commande TLIBIMP. Si vous voulez utiliser un contrle ActiveX, vous avez galement besoin de la classe enveloppe VCL gnre en plus des dclarations dcrites ci-dessus. Lenveloppe VCL gre les problmes de gestion de fentre du contrle. Vous pouvez galement avoir dautres classes enveloppe VCL gnres pour dautres CoClasses avec la bote de dialogue Importation de bibliothque de types. Ces enveloppes VCL simplifient la cration dobjets serveur et lappel de leurs mthodes. Elles sont particulirement recommandes si vous voulez que votre application client rponde aux vnements. Les dclarations pour les enveloppes VCL gnres apparaissent en bas de la section interface. Les composants enveloppe des contrles ActiveX sont des descendants de TOleControl. Les composants enveloppe pour les objets Automation descendent de TOleServer. Le composant enveloppe gnr ajoute les proprits, mthodes et vnements exposs par linterface de la CoClasse. Vous pouvez utiliser ce composant comme vous utilisez tous les autres composants VCL.
Attention
Vous ne devez pas modifier lunit gnre NomBibTypes_TLB. Elle est rgnre chaque fois que la bibliothque de types est rafrachie, ce qui crase toutes les modifications. Pour des informations les plus jour, voir les commentaires placs dans lunit gnre automatiquement NomBibTypes_TLB.
Remarque
35-6
Guide du dveloppeur
Enveloppes ActiveX
Vous devez toujours utiliser un composant enveloppe pour accueillir des contrles ActiveX car le composant enveloppe intgre la fentre du contrle dans le modle VCL. Le contrle ActiveX hrite de TOleControl des proprits et mthodes qui vous permettent daccder linterface sous-jacente ou dobtenir des informations sur le contrle. Cependant, la plupart des applications nen nont pas besoin. Vous utilisez la place le contrle import comme vous utiliseriez tout autre contrle VCL. Gnralement, les contrles ActiveX proposent une page de proprits qui vous permet de dfinir leurs proprits. Les pages de proprits sont similaires aux diteurs que certains composants affichent quand vous double-cliquez dessus dans le concepteur de fiche. Pour afficher la page de proprits dun contrle ActiveX, cliquez dessus avec le bouton droit de la souris et choisissez Proprits. La manire dont vous utilisez les contrles ActiveX imports est dtermine par lapplication serveur. Cependant, les contrles ActiveX utilisent un ensemble standard de notifications quand ils reprsentent les donnes dun champ de base de donnes. Pour davantage dinformations sur la manire daccueillir des contrles ActiveX orients donnes, voir Utilisation de contrles ActiveX orients donnes la page 35-9.
35-7
Une fois la valeur de ConnectKind spcifie, il y a trois manires de connecter le composant au serveur : Une connexion explicite au serveur en appelant la mthode Connect du composant. Vous pouvez indiquer au composant de se connecter automatiquement avec le serveur au dmarrage de votre application en initialisant la proprit AutoConnect True. Vous navez pas besoin de vous connecter explicitement au serveur. Le composant cre automatiquement une connexion quand vous utilisez lune des proprits et mthodes du serveur par le biais du composant. Vous appelez les mthodes ou utilisez les proprits comme pour tout autre composant :
TServerComponent1.FaireUneChose;
Il est facile de g rer les vnements car vous pouvez utiliser linspecteur dobjets pour crire des gestionnaires dvnements. Toutefois, vous devez faire attention car les gestionnaires dvnements de votre composant ont des paramtres lgrement diffrents de ceux dfinis pour les vnements de la bibliothque de types. Plus prcisment, les types pointeurs (paramtres var et pointeur dinterface) sont changs en Variants. Vous devez explicitement transtyper les paramtres var dans le type sous-jacent avant de leur affecter une valeur. Les pointeurs dinterface peuvent tre transtyps dans le type dinterface appropri en utilisant loprateur as.Par exemple, lexemple de code suivant est le gestionnaire dvnement pour lvnement OnNewWorkBook de ExcelApplication. Le gestionnaire dvnement a un paramtre qui fournit linterface dune autre CoClasse (ExcelWorkbook). Cependant, linterface nest pas transmise comme un pointeur dinterface ExcelWorkBook, mais comme un OleVariant.
procedure TForm1.XLappNewWorkbook(Sender: TObject; var Wb:OleVariant); begin { Remarque : le OleVariant de linterface est transtyp dans le type adquat } ExcelWorkbook1.ConnectTo((iUnknown(wb) as ExcelWorkbook)); end;
Dans cet exemple, le gestionnaire dvnement affecte le classeur un composant ExcelWorkbook (ExcelWorkbook1). Cela illustre la manire de connecter un composant enveloppe une interface existante en utilisant la mthode ConnectTo. La mthode ConnectTo est ajoute au code gnr du composant enveloppe. Les serveurs qui ont un objet application exposent une mthode Quit pour cet objet afin de permettre aux clients de terminer la connexion. Gnralement Quit expose des fonctionnalits quivalentes lutilisation du menu Fichier pour la sortie de lapplication. Du code pour lappel de la mthode Quit est gnr dans la mthode Disconnect de votre composant. Il est possible dappeler la mthode Quit sans paramtre. Le composant enveloppe a galement une proprit AutoQuit. AutoQuit oblige le contrleur appeler Quit quand le composant est libr. Si vous voulez dconnecter un autre moment, ou si la mthode Quit ncessite des paramtres, vous devez lappeler explicitement. Quit apparat comme mthode publique du composant gnr.
35-8
Guide du dveloppeur
1 Dans lditeur de liaisons de donnes de contrle ActiveX, slectionnez un champ et un nom de proprit.
Nom de champ numre les champs de la base de donnes et Nom de proprit numre les proprits du contrle ActiveX qui peuvent tre lies un champ de base de donnes. Le dispID de la proprit est entre parenthses, par exemple Value(12).
Aucune proprit napparat dans la bote de dialogue si le contrle ActiveX ne contient pas de proprits orients donnes. Pour activer une liaison de donnes simple pour une proprit dun contrle ActiveX, utilisez la bibliothque de types comme indiqu dans Activation de la liaison de donnes simple avec la bibliothque de types la page 38-12. Lexemple suivant parcourt les tapes de lutilisation dun contrle ActiveX orient donnes dans le conteneur Delphi. Cet exemple utilise le contrle calendrier Microsoft disponible si Microsoft Office 97 est install sur votre systme.
1 Dans le menu principal Delphi, choisissez Composant|Importer un contrle ActiveX. 2 Slectionnez un contrle ActiveX orient donnes comme Microsoft Calendar control 8.0, changez son nom de classe en TCalendarAXControl puis choisissez Installer. 3 Dans la bote de dialogue Installation de composant, choisissez OK pour ajouter le contrle au paquet utilisateur par dfaut, cela rend le contrle accessible depuis la palette.
35-9
4 Choisissez Tout fermer puis Fichier|Nouveau| Application pour commencer une nouvelle application. 5 Dposez dans la fiche un objet TCalendarAXControl de la page ActiveX que vous venez dajouter la palette. 6 Depuis la page AccsBD, dposez dans la fiche des objets DataSource et Table. 7 Slectionnez lobjet DataSource et initialisez sa proprit DataSet Table1. 8 Slectionnez lobjet Table et effectuez les oprations suivantes :
Initialisez la proprit DatabaseName DBDEMOS Initialisez la proprit TableName EMPLOYEE.DB Initialisez la proprit Active True
9 Slectionnez lobjet TCalendarAXControl et initialisez sa proprit DataSource DataSource1. 10 Slectionnez lobjet TCalendarAXControl, cliquez avec le bouton droit de la souris et choisissez Liaisons de donnes pour ouvrir lditeur de liaisons de donnes de contrle ActiveX.
Nom de champ numre les champs de la base de donnes et Nom de proprit numre les proprits du contrle ActiveX qui peuvent tre lies un champ de base de donnes. Le dispID de la proprit est entre parenthses.
12 Depuis longlet ContrleBD, dposez un objet DBGrid dans la fiche et initialisez sa proprit DataSource DataSource1. 13 Depuis longlet ContrleBD, dposez un objet DBNavigator dans la fiche et initialisez sa proprit DataSource DataSource1. 14 Excutez lapplication. 15 Testez lapplication comme suit :
Le champ HireDate tant affich dans lobjet DBGrid, parcourez la base de donnes en utilisant le navigateur de donnes. Les dates changent dans le contrle ActiveX quand vous vous dplacez dans la base de donnes.
35-10
Guide du dveloppeur
1 Choisissez Composant|Installer des paquets. 2 Cliquez sur les composants serveur Automation exemple de Borland et choisissez Supprimer.
La page Serveurs de la palette de composants ne contient plus aucun serveur fourni avec Delphi (si aucun autre serveur na t import, la page Serveurs disparat galement).
1 Choisissez Projet|Importer une bibliothque de types. 2 Dans la bote de dialogue dimportation de bibliothque de types, 1 Slectionnez la bibliothque dobjets Microsoft Office 8.0.
Si Word (version 8) nest pas dans la liste, choisissez le bouton Ajouter, puis dans le dossier Program Files\Microsoft Office\Office, slectionnez le fichier de la bibliothque de types de Word, MSWord8.olb, choisissez Ajouter et slectionnez Word (Version 8) dans la liste.
3 Retournez Serveurs dans Page de palette, slectionnez WordApplication et placez-le sur une fiche. 4 Ecrivez un gestionnaire dvnement pour lobjet bouton, comme dcrit ltape suivante.
Etape 3 : utilisation dun objet interface VTable ou de rpartition pour contrler Microsoft Word
Vous pouvez employer un objet interface VTable ou de rpartition pour contrler Microsoft Word.
35-11
1 Slectionnez le bouton, double-cliquez sur son gestionnaire dvnement OnClick et spcifiez le code de gestion dvnement suivant :
procedure TForm1.Button1Click(Sender: TObject); var FileName: OleVariant; begin if OpenDialog1.Execute then begin FileName := OpenDialog1.FileName; WordApplication1.Documents.Open(FileName, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam); WordApplication1.ActiveDocument.PrintOut( EmptyParam,EmptyParam,EmptyParam, EmptyParam, EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam); end; end;
2 Gnrez et excutez le programme, en cliquant sur le bouton, Word vous demande le fichier imprimer.
1 Slectionnez le bouton, double-cliquez sur son gestionnaire dvnement OnQuit et spcifiez le code de gestion dvnement suivant :
procedure TForm1.Button1Click(Sender: TObject); var MyWord : _ApplicationDisp; FileName : OleVariant; begin if OpenDialog1.Execute then begin FileName := OpenDialog1.FileName;
35-12
Guide du dveloppeur
MyWord := CoWordApplication.Create as _ApplicationDisp; (MyWord.Documents as DocumentsDisp).Open(FileName,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam); (MyWord.ActiveDocument as _DocumentDisp).PrintOut(EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam); MyWord.Quit(EmptyParam,EmptyParam,EmptyParam); end; end;
2 Gnrez et excutez le programme, en cliquant sur le bouton, Word vous demande le fichier imprimer.
Connexion un serveur
Avant de pouvoir piloter un serveur Automation depuis votre application contrleur, vous devez obtenir une rfrence sur une interface qu il gre. Gnralement, vous vous connectez au serveur via son interface principale. Par exemple vous vous connectez Microsoft Word via le composant WordApplication.
35-13
Si linterface principale est une interface double, vous pouvez utiliser les objets crateur du fichier NomBibTypes_TLB.pas. Les classes de crateur portent le mme nom que la CoClasse sans le prfixe Co. Vous pouvez vous connecter un serveur situ sur la mme machine en appelant la mthode Create ou un serveur situ sur une autre machine en utilisant la mthode CreateRemote. Comme Create et CreateRemote sont des mthodes de classe, vous navez pas besoin dune instance de la classe de crateur pour les appeler.
MyInterface := CoServerClassName.Create; MyInterface := CoServerClassName.CreateRemote(Machine1);
Create et CreateRemote renvoient linterface par dfaut de la CoClasse. Si linterface par dfaut est une interface de rpartition, il ny a pas de classe crateur gnre pour la CoClasse. Vous devez la place, appeler la fonction globale CreateOleObject , en lui transmettant le GUID de la CoClasse (il y a une constante pour ce GUID dfinie en haut de lunit _TLB). CreateOleObject renvoie un pointeur IDispatch pour linterface par dfaut.
Linterface et la classe crateur sont dfinies dans lunit NomBibTypes_TLB gnre automatiquement quand vous importez une bibliothque de types. Pour des informations sur les interfaces doubles, voir Interfaces doubles la page 36-14.
1 Connectez-vous au serveur, en utilisant la fonction globale CreateOleObject. 2 Utilisez loprateur as pour transtyper linterface IDispatch renvoye par CreateOleObject en une interface de rpartition pour la CoClasse. Ce type dispinterface est dclar dans lunit NomBibTypes_TLB. 3 Contrlez le serveur Automation en appelant les mthodes de la dispinterface. Vous pouvez utiliser autrement les interfaces de rpartition en les affectant un Variant . En affectant linterface renvoye par CreateOleObject un Variant, vous pouvez tirer profit de la gestion intgre des interfaces que propose le type Variant . Appelez simplement les mthodes de linterface et cest le Variant qui
35-14
Guide du dveloppeur
gre automatiquement les appels IDispatch, la rcupration de lidentificateur de rpartition et les appels de mthode appropris. Le type Variant possde une gestion intgre permettant lappel des interfaces de rpartition, via ses mthodes
var. V: Variant; begin V:= CreateOleObject(TheServerObject); V.NomMthode; { appelle la mthode spcifie } ...
Un avantage de lutilisation de Variants est quil nest pas ncessaire dimporter la bibliothque de types car les Variants utilisent uniquement les mthodes standard de IDispatch pour appeler le serveur. La contrepartie, cest que les Variants sont plus lents car ils utilisent une liaison dynamique lexcution. Pour davantage dinformations sur les interfaces de rpartition, voir Interfaces dAutomation la page 36-13.
Quand vous disposez dune instance de votre collecteur dvnements, vous devez informer lobjet serveur de son existence afin que le serveur puisse lappeler. Pour ce faire, appelez la procdure globale InterfaceConnect en lui transmettant : Linterface du serveur qui gnre les vnements. Le GUID de linterface vnement que gre votre collecteur dvnements. Une interface IUnknown pour votre collecteur dvnements. Une variable qui reoit un Longint reprsentant la connexion entre le serveur et votre collecteur dvnements.
{MyInterface est linterface serveur que vous obtenez quand vous vous connectez au serveur } InterfaceConnect(MyInterface, DIID_TheServerEvents, MyEventSinkObject as IUnknown, cookievar);
35-15
Aprs avoir appel InterfaceConnect, votre collecteur dvnements est connect et reoit les appels du serveur quand des vnements se produisent. Vous devez terminer la connexion avant de librer le collecteur dvnements. Pour ce faire, appelez la procdure globale InterfaceDisconnect en lui transmettant les mmes paramtres, sauf linterface de votre collecteur dvnements (le paramtre final tant en entre et non plus en sortie) :
InterfaceDisconnect(MyInterface, DIID_TheServerEvents, cookievar); Remarque
Vous devez tre certain que le serveur a libr sa connexion avec votre collecteur dvnements avant de librer le collecteur. Comme vous ne savez pas comment le serveur rpond la notification de dconnexion initie par InterfaceDisconnect , cela peut entraner une condition si vous librez votre collecteur dvnements immdiatement aprs lappel. Le moyen le plus simple de vous prmunir contre cela est que votre collecteur dvnements gre son propre compteur de rfrences qui nest pas dcrment tant que le serveur na pas libr linterface du collecteur dvnements.
Vous pouvez avoir ajouter linterface de lobjet vnement dans le registre en utilisant lexpert si elle napparat pas dans la liste des interfaces que vous pouvez implmenter. Une fois lobjet abonn cr, vous devez vous abonner linterface de lobjet vnement ou individuellement aux mthodes (vnements) de cette interface. Vous pouvez souscrire trois types dabonnements : Abonnements temporaires. Comme les collecteurs dvnements habituels, les abonnements temporaires sont lis la dure de vie de linstance dobjet. Quand lobjet abonn est libr, labonnement sarrte et COM+ ne lui transmet plus les vnements.
35-16
Guide du dveloppeur
Cration de clients pour les serveurs nayant pas une bibliothque de types
Abonnements permanents. Ils sont lis la classe de lobjet et non une instance dobjet spcifique. Quand lvnement se produit, COM recherche ou dmarre un processus de lobjet abonn et appelle son gestionnaire dvnement. Les objets en processus (DLL) utilisent ce type dabonnement. Abonnements par utilisateur. Ces abonnements offrent une version plus scurise des abonnements temporaires. Lobjet abonn et lobjet serveur qui dclenchent les vnements doivent tre excuts avec le mme compte utilisateur sur la mme machine.
Remarque
Les objets qui sabonnent des vnements COM+ doivent tre installs dans une application COM+.
Cration de clients pour les serveurs nayant pas une bibliothque de types
Certaines technologies COM plus anciennes comme OLE (Object Linking and Embedding) ne fournissent pas les informations de type dans une bibliothque de types. Elles utilisent la place un jeu standard dinterfaces prdfinies. Pour crire des clients accueillant de tels objets, vous pouvez utiliser les composants TOleContainer. Ce composant apparat dans la page Systme de la palette des composants. TOleContainer se comporte comme le site daccueil dun objet Ole2. Il implmente linterface IOleClientSite et, de manire facultative, IOleDocumentSite. La communication est gre en utilisant des verbes OLE. Pour utiliser TOleContainer :
1 Placez un composant TOleContainer dans votre fiche. 2 Initialisez la proprit AllowActiveDoc True si vous voulez pouvoir accueillir un document actif. 3 Initialisez la proprit AllowInPlace pour indiquer si lobjet accueilli doit apparatre dans le TOleContainer ou dans une fentre spare. 4 Ecrivez des gestionnaires dvnements pour rpondre quand lobjet est activ, dsactiv, dplac ou redimensionn. 5 Pour lier lobjet TOleContainer la conception, cliquez avec le bouton droit de la souris et choisissez Insrer un objet. Dans la bote de dialogue Insertion dobjet, choisissez lobjet serveur accueillir. 6 Vous avez plusieurs moyens de lier lobjet TOleContainer lexcution, selon la manire dont vous voulez identifier lobjet serveur. La mthode CreateObject attend un identificateur de programme, CreateObjectFromFile attend le nom dun fichier dans lequel lobjet a t enregistr, CreateObjectFromInfo attend un record contenant des informations sur la manire de crer lobjet ou CreateLinkToFile qui attend le nom dun fichier dans lequel lobjet a t enregistr et effectue une liaison et non une incorporation.
35-17
Cration de clients pour les serveurs nayant pas une bibliothque de types
7 Une fois lobjet li, vous pouvez accder son interface en utilisant la proprit OleObjectInterface. Cependant, comme la communication avec les objets Ole2 tait base sur les verbes OLE, vous prfrerez probablement envoyer des commandes au serveur en utilisant la mthode DoVerb. 8 Quand vous voulez librer lobjet serveur, appelez la mthode DestroyObject.
35-18
Guide du dveloppeur
36
Chapitre 36
Chapitre
Delphi dispose dexperts pour vous aider crer divers objets COM. Les objets COM les plus simples sont des serveurs qui exposent des proprits et des mthodes (et ventuellement des vnements) via une interface par dfaut que leurs clients peuvent appeler.
Remarque
Automation et les serveurs COM ne sont pas disponibles dans les applications CLX. Cette technologie nest utilise que sur Windows et nest pas multiplateforme. Deux experts, en particulier, simplifient le processus de cration dobjets COM simples : L expert objet COM construit un objet COM lger dont linterface par dfaut descend de IUnknown ou qui implmente une interface dj recense dans votre systme. Cet expert offre la plus grande flexibilit dans les types dobjets COM quil est possible de crer. L expert objet Automation cre un objet Automation simple dont linterface par dfaut descend de IDispatch. IDispatch introduit un mcanisme de marshaling standard et gre la liaison tardive des appels dinterfaces.
Remarque
COM dfinit de nombreuses interfaces standard et des mcanismes pour grer des situations spcifiques. Les experts Delphi automatisent les oprations les plus courantes. Cependant, certaines tches, comme le marshaling personnalis ne sont gres par aucun expert Delphi. Pour des informations ce propos et sur dautres technologies qui ne sont pas explicitement gres par Delphi, reportezvous la documentation Microsoft Developers Network (MSDN). Le site Web Microsoft propose galement des informations jour sur la gestion COM.
36-1
1 Conception de lobjet COM. 2 Utilisation de lexpert objet COM ou de lexpert objet Automation pour crer lobjet serveur. 3 Dfinition de linterface que lobjet expose aux clients. 4 Recensement de lobjet COM. 5 Test et dbogage de lapplication.
36-2
Guide du dveloppeur
Facultativement, ajout au projet dune bibliothque de types et ajout de lobjet et de son interface la bibliothque de types. Avant de crer un objet COM, crez ou ouvrez le projet de lapplication contenant les fonctionnalits implmenter. Le projet peut tre, selon vos besoins, une application ou une bibliothque ActiveX. Pour afficher lexpert objet COM :
1 Choisissez Fichier|Nouveau|Autre pour ouvrir la bote de dialogue Nouveaux lments. 2 Slectionnez la page ActiveX. 3 Double-cliquez sur licne Objet COM.
Dans lexpert, vous devez spcifier les informations suivantes : Nom de CoClasse. Cest le nom de lobjet tel quil apparat aux clients. La classe cre pour implmenter votre objet porte ce nom prfix par un T. Si vous choisissez de ne pas implmenter une interface existante, lexpert attribue votre CoClasse une interface par dfaut portant ce nom prfix par un I. Interface implmente. Par dfaut, lexpert attribue votre objet une interface par dfaut qui descend de IUnknown. Aprs tre sorti de lexpert, vous devez utiliser lditeur de bibliothques de types pour ajouter des proprits et mthodes cette interface. Cependant, vous pouvez aussi slectionner une interface prdfinie que votre objet va implmenter. Choisissez le bouton Liste dans lexpert objet COM pour afficher lexpert de slection dinterface qui vous permet de slectionner parmi toutes les interfaces doubles ou personnalises dfinies dans une bibliothque de types recense sur votre systme. Linterface que vous slectionnez devient linterface par dfaut de votre nouvelle CoClasse. Lexpert ajoute toutes les mthodes de cette interface la classe dimplmentation gnre, ainsi il ne vous reste plus qu remplir le corps des mthodes dans lunit dimplmentation. Si vous slectionnez une interface existante, linterface nest pas ajoute la bibliothque de types de votre projet. Cela signifie que lors du dploiement de lobjet, vous devez galement dployer la bibliothque de types qui dfinit linterface. Instancie. Sauf si vous crez un serveur en processus, vous devez indiquer comment COM lance lapplication qui accueille votre objet COM. Si votre application implmente plusieurs objets COM, vous devez utiliser la mme mthode dinstanciation pour tous. Pour des informations sur les valeurs possibles, voir Types dinstanciation des objets COM la page 36-5. Modle de thread. Gnralement, le client demande votre objet de participer diffrents threads dexcution. Vous pouvez spcifier comment COM srialise ces threads quand il appelle votre objet. Le choix du modle de thread dtermine comment lobjet est recens. Cest vous dassurer la gestion de thread implique par le modle choisi. Pour des informations sur les valeurs possibles, voir Choix dun modle de thread la page 36-6. Pour des informations sur la manire de grer les threads dans votre application, voir chapitre 9, Ecriture dapplications multithreads.
36-3
Bibliothque de types. Vous pouvez dcider si vous voulez inclure une bibliothque de types pour votre objet. Cela est recommand pour deux raisons : elle vous permet dutiliser lditeur de bibliothques de types pour dfinir les interfaces, et donc actualiser lessentiel de limplmentation, et cela donne aux clients un moyen simple dobtenir des informations sur votre objet et ses interfaces. Si vous implmentez une interface existante, Delphi requiert lutilisation dune bibliothque de types par votre projet. Cest la seule faon de fournir laccs la dclaration dinterface originale. Pour des informations sur les bibliothques de types, voir Bibliothques de types la page 33-16 et chapitre 34, Utilisation des bibliothques de types. Marshaling. Si vous voulez vous confiner aux types compatibles Automation et si vous choisissez de crer une bibliothque de types, vous pouvez laisser COM grer pour vous le marshaling quand vous ne gnrez pas un serveur en processus. En indiquant linterface de votre objet comme tant OleAutomation dans la bibliothque de types, vous permettez COM de dfinir pour vous les proxys et stubs et de grer le passage de paramtres entre les frontires de processus. Pour davantage dinformations, voir Le mcanisme du marshaling la page 33-8. Vous ne pouvez spcifier que linterface est compatible Automation que si vous crez une nouvelle interface. Si vous slectionnez une interface existante, ses attributs sont dj spcifis dans sa bibliothque de types. Si linterface de votre objet nest pas marque comme OleAutomation, vous devez soit crer un serveur en processus ou crire votre propre code de marshaling. Vous pouvez, si vous le souhaitez, ajouter une description de votre objet COM. Cette description apparat pour lobjet dans la bibliothques de types si vous en crez une.
1 Choisissez Fichier|Nouveau |Autre. 2 Slectionnez la page ActiveX. 3 Double-cliquez sur licne Objet Automation.
36-4
Guide du dveloppeur
Dans lexpert, vous devez spcifier les informations suivantes : Nom de CoClasse. Cest le nom de lobjet tel quil apparat aux clients. La classe cre pour implmenter votre objet porte ce un nom prfix par un T. Si vous choisissez de ne pas implmenter une interface existante, lexpert attribue votre CoClasse une interface par dfaut portant ce nom prfix par un I. Instancie. Sauf si vous crez un serveur en processus, vous devez indiquer comment COM lance lapplication qui accueille votre objet COM. Si votre application implmente plusieurs objets COM, vous devez utiliser la mme mthode dinstanciation pour tous. Pour des informations sur les valeurs possibles, voir Types dinstanciation des objets COM la page 36-5. Modle de thread. Gnralement, le client demande votre objet de participer diffrents threads dexcution. Vous pouvez spcifier comment COM srialise ces threads quand il appelle votre objet. Le choix du modle de thread dtermine comment lobjet est recens. Cest vous dassurer la gestion de thread implique par le modle choisi. Pour des informations sur les valeurs possibles, voir Choix dun modle de thread la page 36-6. Pour des informations sur la manire de grer les threads dans votre application, voir chapitre 9, Ecriture dapplications multithreads. Gnrer le code de support dvnement Vous devez indiquer si vous voulez que votre objet gnre des vnements pour les clients pouvant y rpondre. Lexpert peut fournir la gestion des interfaces ncessaires pour gnrer des vnements et la distribution des appels aux gestionnaires dvnements des clients. Pour des informations sur le fonctionnement des vnements et la manire de les implmenter, voir Exposition dvnements aux clients la page 36-11. Vous pouvez, si vous le souhaitez, ajouter une description de votre objet COM. Cette description apparat pour lobjet dans la bibliothques de types. Lobjet Automation implmente une interface double qui gre la liaison prcoce ( la compilation) via la VTable et la liaison tardive ( lexcution) via linterface IDispatch. Pour davantage dinformations, voir Interfaces doubles la page 36-14.
36-5
Remarque
Le mode dinstanciation est ignor lorsque votre objet COM est uniquement utilis en tant que serveur en processus. Lorsque votre application COM cre un nouvel objet COM, il peut avoir un des types dinstanciation suivants :
Instanciation
Interne
Signification
Lobjet ne peut tre cr que de manire interne. Une application externe ne peut pas crer dinstance de lobjet directement. Une application externe ne peut pas crer directement une instance de lobjet mme si votre application peut le crer et en transmettre une interface aux clients. Permet aux clients de ne crer quune seule instance de lobjet pour chaque excutable (application), ainsi la cration de plusieurs instances entrane le lancement de plusieurs instances de lapplication. Chaque client dispose de sa propre instance ddie de lapplication serveur. Cette option est souvent utilise pour les applications MDI (interface documents multiples). Spcifie que plusieurs client peuvent crer des instances de lobjet dans le mme espace de processus. Chaque fois quun client demande un service, une instance spare du serveur est cre : cest--dire quil peut y avoir plusieurs instances dans un seul excutable.
Instance unique
Instances multiples
Modle de thread
36-6
Guide du dveloppeur
Tableau 36.1
Modle de thread
Libre (galement appel apartment threads multiples)
Les deux
Identique au modle Libre mais les appels sortants (par exemple, les callbacks) sont assurs de sexcuter dans le mme thread.
Neutre
Plusieurs clients peuvent appeler lobjet dans diffrents threads en mme temps, mais COM sassure que deux appels nentrent pas en conflit.
Remarque
Les variables locales sont toujours fiables (sauf celles des callbacks) indpendamment du modle de thread. En effet, les variables locales sont stockes dans la pile et chaque thread dispose de sa propre pile. Les variables locales des callbacks peuvent ntre pas fiables si vous utilisez le modle libre. Le modle de thread que vous choisissez dans lexpert dtermine comment lobjet est publi dans le registre. Vous devez tre certain que limplmentation de lobjet est conforme au modle de thread choisi. Pour des informations gnrales sur lcriture de code adapt aux threads, voir chapitre 9, Ecriture dapplications multithreads. Pour les serveurs en processus, linitialisation du modle de thread dans lexpert dfinit la cl du modle de thread dans lentre de registre CLSID. Les serveurs hors processus sont recenss comme EXE, et Delphi initialise COM pour le modle de thread le plus lev ncessaire. Par exemple, si un EXE contient un objet thread libre, il est initialis pour les threads libres, ce qui signifie quil peut fournir la gestion attendue pour tous les objets thread libre ou apartment contenus dans lEXE. Pour redfinir manuellement le comportement de thread dun EXE, utilisez la variableCoInitFlags dcrite dans laide en ligne.
36-7
Pour supporter le modle de thread libre, vous devez considrer la faon dont chaque mthode accdera aux donnes dinstance. Si la mthode est crite pour des donnes dinstance, vous devez utiliser les sections critiques, ou tout autre forme de srialisation, pour protger les donnes dinstance. En outre, la srialisation des appels critiques est moins lourde que lexcution du code de marshaling de COM. Remarquez que si les donnes dinstance sont accessibles en lecture seulement, la srialisation nest pas ncessaire. Les serveurs en processus thread libre peuvent amliorer leurs performances en se comportant comme objet extrieur dun agrgat avec le marshaler thread libre. Le marshaler thread libre propose un raccourci pour la gestion standard COM du thread quand une DLL thread libre est appele par un hte (un client) qui nutilise pas de thread libre. Pour effectuer lagrgation avec le marshaler thread libre, vous devez : Appeler CoCreateFreeThreadedMarshaler, en lui transmettant linterface IUnknown de votre objet qui doit utiliser le marshaler thread libre rsultant :
CoCreateFreeThreadedMarshaler(self as IUnknown, FMarshaler);
Cette ligne affecte linterface du marshaler thread libre un membre de classe, FMarshaler. En utilisant lditeur de bibliothques de types, ajoutez linterface IMarshal lensemble des interfaces que votre CoClasse implmente. Dans la mthode QueryInterface de votre objet, dlguez tous les appels de IDD_IMarshal au marshaler thread libre (stock dans FMarshaler ci-dessus).
Attention
Le marshaler thread libre viole les rgles normales du marshaling COM pour permettre une meilleure efficacit. Il doit tre utilis avec prudence. En particulier, il ne doit tre agrg quavec des objets thread libre dans des serveurs en processus et ne doit tre instanci que par lobjet qui lutilise (et pas par un autre thread).
36-8
Guide du dveloppeur
36-9
types dfinissent les proprits, mthodes et vnements que votre objet expose aux clients.
Remarque
Si vous slectionnez une interface existante dans lexpert objet COM, vous navez pas besoin dajouter des proprits ou des mthodes. La dfinition de linterface est importe depuis la bibliothque de types dans laquelle linterface est dfinie. Il vous suffit alors de trouver les mthodes de linterface importe dans lunit dimplmentation et de remplir leur corps.
2 Pour exposer une proprit en lecture/criture, cliquez sur le bouton Proprit de la barre doutils ; vous pouvez aussi cliquer sur la flche ct de ce bouton dans la barre doutils, puis sur le type de proprit exposer. 3 Dans la page Attributs, spcifiez le nom et le type de la proprit. 4 Dans la barre doutils, choisissez le bouton Rafrachir.
Une dfinition et les squelettes dimplmentation des mthodes daccs la proprit sont insrs dans lunit dimplmentation de lobjet.
5 Dans lunit dimplmentation, recherchez les mthodes daccs de la proprit. Elles ont un nom de la forme Get_NomProprit et Set_NomProprit. Ajoutez du code qui rcupre ou dfinit la valeur de la proprit de votre objet. Ce code peut simplement appeler une fonction existante de lapplication, accder une donne membre ajoute la dfinition de lobjet ou implmenter autrement la proprit.
36-10
Guide du dveloppeur
2 Choisissez le bouton Mthode. 3 Dans la page Attributs, spcifiez le nom de la mthode. 4 Dans la page Paramtres, spcifiez le type de valeur renvoye par la mthode et ajoutez les paramtres appropris. 5 Dans la barre doutils, choisissez le bouton Rafrachir. 6 Une dfinition et le squelette de limplmentation de la mthode sont insrs dans lunit dimplmentation de lobjet. 7 Dans lunit dimplmentation, trouvez la mthode qui vient dtre insre. La mthode est entirement vide. Remplissez le corps de la mthode pour effectuer lopration que reprsente la mthode.
Lexpert objet COM ne gnre pas de code de gestion des vnements. Si vous voulez que votre objet gnre des vnements classiques, utilisez lexpert objet Automation. Pour que votre objet gnre des vnements, vous devez effectuer les oprations suivantes :
36-11
Lexpert cre un objet qui contient une interface Events en plus de linterface par dfaut. Cette interface Events a un nom de la forme INomCoClasseEvents. Cest une interface en sortie (source) : cela signifie que cette interface ne doit pas tre implmente par votre objet mais par les clients, elle est appele par votre objet (vous pouvez le constater en slectionnant la CoClasse, allez sur la page Implmente, vous constaterez que la colonne Source indique True pour linterface Events). Outre linterface Events, lexpert ajoute linterface IConnectionPointContainer la dclaration de votre classe dimplmentation et plusieurs membres de classe pour grer les vnements. Parmi ces nouveaux membres de classe, les plus importants sont FConnectionPoint et FConnectionPoints. Ils implmentent les interfaces IConnectionPoint et IConnectionPointContainer en utilisant des classes VCL prdfinies. FConnectionPoint est gre par une autre mthode que lexpert ajoute, EventSinkChanged.
2 Dans lditeur de bibliothques de types, slectionnez linterface en sortie Events de votre objet (elle a un nom de la forme INomCoClasseEvents) 3 Cliquez sur le bouton Mthode de la barre doutils de lditeur de bibliothques de types. Chaque mthode ajoute linterface Events reprsente un gestionnaire dvnement que le client doit implmenter. 4 Dans la page Attributs, spcifiez le nom du gestionnaire dvnement, par exemple MonEvenement. 5 Dans la barre doutils, choisissez le bouton Rafrachir.
Limplmentation de votre objet contient maintenant tout ce quil faut pour accepter les rcepteurs dvnements des clients et grer une liste des interfaces appeler quand lvnement se produit. Pour appeler ces interfaces, vous pouvez crer une mthode pour gnrer chaque vnement dans les clients.
6 Dans lditeur de code, ajoutez une mthode votre objet pour dclencher chaque vnement. Par exemple :
unit ev; interface uses ComObj, AxCtrls, ActiveX, Project1_TLB; type TMyAutoObject = class (TAutoObject,IConnectionPointContainer, IMyAutoObject) private . . . public procedure Initialize; override; procedure Fire_MonEvenement; { Ajoutez une mthode pour dclencher lvnement}
36-12
Guide du dveloppeur
Interfaces dAutomation
7 Codez la mthode ajoute ltape prcdente afin quelle parcourt tous les rcepteurs dvnements grs dans le membre FConnectionPoint de votre objet :
procedure TMyAutoObject.Fire_MonEvenement; var I: Integer; EventSinkList: TList; EventSink: IMyAutoObjectEvents; begin if FConnectionPoint <> nil then begin EventSinkList :=FConnectionPoint.SinkList; {obtenir la liste des rcepteurs client } for I := 0 to EventSinkList.Count - 1 do begin EventSink := IUnknown(FEvents[I]) as IMyAutoObjectEvents; EventSink.MyEvent; end; end; end;
8 A chaque fois que vous avez besoin de dclencher lvnement pour que les clients soient informs de son occurrence, appelez la mthode qui distribue lvnement tous les rcepteurs dvnements :
if EventOccurs then Fire_MonEvenement; { Appelez la mthode cre pour dclencher des vnements.}
Interfaces dAutomation
Lexpert objet Automation implmente par dfaut une interface double ce qui signifie que lobjet Automation gre : La liaison tardive lexcution, via son interface IDispatch. Elle est implmente comme une interface de rpartition ou dispinterface.
36-13
Interfaces dAutomation
La liaison prcoce la compilation, ce qui seffectue directement en appelant lune des fonctions membre de la table de fonction virtuelle (VTable). Cest ce que lon appelle une interface personnalise.
Remarque
Les interfaces gnres par lexpert objet COM qui ne descendent pas de IDispatch ne grent que les appels de la VTable.
Interfaces doubles
Une interface double est la fois une interface personnalise et une dispinterface. Elle est implmente en tant quinterface VTable COM qui drive de IDispatch. Pour les contrleurs qui accdent lobjet uniquement lexcution, la dispinterface est disponible. Pour les objets qui peuvent tirer profit de la liaison la compilation, cest linterface VTable, la plus efficace, qui est utilise. Les interfaces doubles offrent les avantages combins des interfaces VTable et des dispinterfaces : Pour les interfaces VTable, le compilateur fait une vrification de type et fournit des messages derreurs plus informatifs. Pour les contrleurs Automation qui ne peuvent pas obtenir dinformation de type, la dispinterface fournit laccs lobjet lexcution. Pour les serveurs en processus, vous bnficiez dun accs rapide via les interfaces VTable. Pour les serveurs hors processus, COM effectue le marshaling des donnes la fois pour les interfaces VTable et pour les dispinterfaces. COM fournit une implmentation proxy/stub gnrique qui peut raliser le marshaling de linterface en fonction des informations contenues dans une bibliothque de types. Pour davantage dinformations sur le marshaling, voir Marshaling des donnes la page 36-16. Le diagramme page suivante dcrit linterface IMyInterface dun objet grant une interface double nomme IMyInterface. Les trois premires entres de la VTable dune interface double font rfrence linterface IUnknown, les quatre suivantes font rfrence linterface IDispatch, les autres sont des entres COM pour laccs direct aux membres de linterface personnalise.
36-14
Guide du dveloppeur
Interfaces dAutomation
Interfaces de rpartition
Les contrleurs Automation sont des clients qui utilisent linterface COM IDispatch pour accder aux objets du serveur COM. Le contrleur doit dabord crer lobjet, puis demander linterface IUnknown de lobjet un pointeur sur son interface IDispatch. IDispatch garde en interne la trace des mthodes et des proprits par le biais dun identificateur de rpartition (dispID), qui est un numro didentification propre chaque membre interface. Grce IDispatch, un contrleur rcupre les informations de type de lobjet pour linterface de rpartition, puis associe les noms des membres interface aux dispID spcifiques. Ces dispID sont accessibles lexcution et les contrleurs y accdent en appelant la mthode GetIDsOfNames de IDispatch. Lorsquil connat le dispID, le contrleur peut appeler la mthode Invoke de IDispatch pour excuter le code requis (proprit ou mthode), en regroupant les paramtres de la proprit ou de la mthode dans lun des paramtres de la mthode Invoke. Invoke a une signature fixe dfinie lors de la compilation, qui lui permet daccepter des arguments varis lors de lappel dune mthode dinterface. Limplmentation de lobjet automation de Invoke doit alors dgrouper les paramtres, appeler la proprit ou la mthode et grer les ventuelles erreurs. Lorsque la proprit ou la mthode revient, lobjet retransmet la valeur renvoye au contrleur. Cette procdure est appele liaison diffre car le contrleur se lie la proprit ou la mthode lors de lexcution de lapplication plutt que lors de sa compilation.
36-15
Remarque
Lors de limportation dune bibliothque de types, Delphi requiert des dispID lors de la gnration du code, permettant de cette faon aux classes enveloppe gnres dappeler Invoke sans appeler GetIDsOfNames. Cela peut augmenter de manire significative les performances dexcution des contrleurs.
Interfaces personnalises
Les interfaces personnalises sont des interfaces dfinies par lutilisateur qui permettent aux clients dappeler les mthodes de linterface en fonction de leur ordre dans la VTable et du type des arguments. La VTable contient les adresses de toutes les proprits et mthodes qui sont membres de lobjet, y compris les fonctions membre des interfaces quil supporte. Si lobjet ne supporte pas IDispatch, les entres correspondant aux membres des interfaces personnalises de lobjet suivent immdiatement celles des membres de IUnknown. Si lobjet possde une bibliothque de types, vous pouvez accder linterface personnalise via sa disposition VTable, que vous pouvez obtenir laide de lditeur de bibliothques de types. Si lobjet possde une bibliothque de types et gre IDispatch, un client peut aussi obtenir les dispID de linterface IDispatch et se lier directement un dplacement de la VTable. Limportateur de la bibliothque de types de Delphi (TLIBIMP) extrait les dispIDs limportation, ce qui vite aux clients qui utilisent les enveloppes de dispinterfaces dappeler GetIDsOfNames; ces informations figurent dj dans le fichier _TLB. Toutefois, les clients doivent quand mme appeler Invoke.
La premire mthode, lutilisation de IDispatch est uniquement disponible sur les serveurs Automation. La seconde mthode est automatiquement disponible sur tous les objets crs par les experts et utilisant une bibliothque de types.
36-16
Guide du dveloppeur
36-17
Les membres dune interface duale qui ont besoin de renvoyer dautres valeurs doivent spcifier ces paramtres en tant que var ou out, en indiquant un paramtre de sortie pour renvoyer la valeur de la fonction.
Remarque
Une faon doutrepasser les restrictions des types Automation est dimplmenter une interface IDispatch distincte et une interface personnalise. Vous pouvez ainsi utiliser tous les types darguments. Cela signifie que les clients COM ont la possibilit dutiliser linterface personnalise, laquelle les contrleurs Automation peuvent encore accder. Mais, dans ce cas, il faut implmenter manuellement le code de marshaling.
Marshaling personnalis
Gnralement, vous utiliserez le marshaling automatique dans les serveurs hors processus et distants parce que cest le plus simple : COM fait le travail votre place. Cependant, vous pouvez dcider de fournir un marshaling personnalis si vous pensez que ses performances seront suprieures. Si sous implmentez votre propre marshaling personnalis, vous devez grer linterface IMarshal. Pour davantage dinformations sur cette approche, voir la documentation Microsoft.
Pour retirer lobjet COM de votre systme, vous devez commencer par annuler son recensement.
36-18
Guide du dveloppeur
Pour annuler le recensement dun serveur hors processus : Excutez le serveur avec loption de ligne de commande /unregserver. Vous pouvez galement utiliser la commande tregsvr depuis la ligne de commande ou excuter regsvr32.exe depuis le systme dexploitation.
Remarque
Si le serveur COM doit fonctionner dans COM+, vous devez linstaller dans une application COM+ au lieu de le recenser (linstallation de lobjet dans une application COM+ se charge automatiquement du recensement). Pour des informations sur la manire dinstaller un objet dans une application COM+, voir Installation dobjets transactionnels la page 39-24.
1 Si ncessaire, activez les informations de dbogage en utilisant la page Compilateur de la bote de dialogue Projet|Options. Activez aussi Dbogage intgr dans le dialogue Outils|Options du dbogueur. 2 Pour un serveur en processus, choisissez Excuter|Paramtres, entrez le nom du contrleur Automation dans la zone Application hte, puis choisissez OK. 3 Choisissez Excuter|Excuter. 4 Dfinissez des points darrts dans le serveur Automation. 5 Utilisez le contrleur Automation pour interagir avec le serveur Automation.
Le serveur Automation fait une pause quand les points darrts sont rencontrs.
Remarque
Comme autre approche, si vous crivez aussi le contrleur Automation, vous pouvez dboguer dans un serveur en processus en activant le support interprocessus COM. Utilisez la page Gnral de la bote de dialogue obtenue par Outils|Options du dbogueur pour activer le support inter-processus.
36-19
36-20
Guide du dveloppeur
37
Chapitre 37
Chapitre
Si vous utilisez lenvironnement Microsoft Internet Information Server (IIS) pour proposer vos pages Web, vous pouvez utiliser ASP (Active Server Pages) pour crer des applications client-serveur Web dynamiques. ASP vous permet dcrire un script qui est appel chaque fois que le serveur charge la page Web. Ce script peut, son tour, appeler des objets Automation pour obtenir des informations quil peut inclure dans une page HTML gnre. Vous pouvez, par exemple, crire un serveur Automation Delphi pour se connecter une base de donnes et utiliser ce contrle pour accder aux donnes qui sont ainsi actualises chaque fois que le serveur charge la page Web. Pour le client, ASP apparat comme un document standard HTML qui peut tre visualis par les utilisateurs de toute plate-forme disposant dun navigateur Web. Les applications ASP sont similaires aux applications crites en utilisant la technologie courtier Web Delphi. Pour davantage dinformations sur la technologie courtier Web, voir chapitre 27, Cration dapplications Internet. Cependant ASP est diffrent car il spare la conception de linterface utilisateur de limplmentation des rgles de gestion et de la logique complexe dune application. La conception de linterface utilisateur est gre par la page Active Server. Cest essentiellement un document HTML, mais elle peut contenir des scripts incorpors qui appellent des objets ASP pour fournir au document le contenu qui reflte les rgles de gestion ou la logique de lapplication. La logique de lapplication est encapsule par des objets Active Server qui exposent des mthodes simples la page Active Server en lui fournissant le contenu dont elle a besoin.
Remarque
Mme si ASP prsente lavantage de sparer la conception de linterface utilisateur de la logique de lapplication, grande chelle ses performances sont limites. Pour des sites Web devant satisfaire un trs grand nombre de clients, il est recommand dutiliser la place une approche exploitant la technologie courtier Web.
37-1
Les scripts des pages Active Server et les objets Automation incorpors dans une page peuvent utiliser les lments intrinsques ASP (des objets prdfinis qui fournissent des informations sur lapplication en cours, les messages HTTP du navigateur, etc). Ce chapitre dcrit comment crer un objet Active Server en utilisant lexpert objet Active Server Delphi. Ce contrle Automation spcial peut ensuite tre appel par une page Active Server et lui fournir son contenu. Voici les tapes de la cration dun objet Active Server : Cration dun objet Active Server pour lapplication. Dfinition de linterface dun objet Active Server. Recensement dun objet Active Server. Test et dbogage dune application ASP.
1 Choisissez Fichier|Nouveau|Autre. 2 Slectionnez longlet ActiveX. 3 Double-cliquez sur licne Objet Active Server.
Dans lexpert, spcifiez le nom du nouvel objet Active Server et spcifiez les modles et de thread qu il faut grer. Ces paramtres dterminent comment lobjet peut tre appel. Vous devez crire limplmentation de telle manire quelle soit conforme au modle (par exemple, en vitant les conflits de thread). Les modles dinstanciation et de thread impliquent les mmes choix que pour les autres objets COM. Pour davantage dinformations, voir Types dinstanciation des objets COM la page 36-5 et Choix dun modle de thread la page 36-6. Ce qui rend unique lobjet Active Server est sa capacit accder aux informations relatives lapplication ASP et aux messages HTTP changs entre la page Active Server et les navigateurs client Web. Laccs ces informations se fait via les lments intrinsques ASP.
37-2
Guide du dveloppeur
Vous pouvez, dans lexpert, spcifier comment votre objet y accde en spcifiant loption Type dActive Server : Si vous utilisez IIS 3 ou IIS 4, vous pouvez utiliser Mthodes dvnement de niveau page. Avec ce modle, votre objet implmente les mthodes OnStartPage et OnEndPage appeles au chargement/dchargement de la page Active Server. Quand lobjet est charg, il obtient automatiquement une interface IScriptingContext quil utilise pour accder aux lments intrinsques ASP. Ces interfaces sont leur tour refltes sous la forme de proprits hrites de la classe de base (TASPObject). Si vous utilisez IIS5 ou plus, utilisez le type Contexte dobjet. Avec ce modle, votre objet obtient une interface IObjectContext quil utilise pour accder aux lments intrinsques ASP. L encore, ces interfaces sont leur tour refltes sous la forme de proprits hrites de la classe de base (TASPMTSObject). Lavantage de cette approche tient ce que lobjet accde tous les autres services proposs par IObjectContext. Pour accder linterface IObjectContext, appelez simplement GetObjectContext (dfinie dans lunit mtx) de la manire suivante :
ObjectContext := GetObjectContext;
Pour davantage dinformations sur les services accessibles via IObjectContext, voir chapitre 39, Cration dobjets MTS ou COM+. Vous pouvez demander lexpert de gnrer une page .ASP simple pour accueillir le nouvel objet Active Server. La page gnre contient un script minimaliste (crit en VBScript) qui cre votre objet Active Server partir de son ProgID et indique o vous pouvez appeler ses mthodes. Ce script appelle Server.CreateObject pour dmarrer votre objet Active Server.
Remarque
Mme si le script de test gnr utilise VBScript, une page Active Server peut galement contenir du code Jscript. Lorsque vous sortez de lexpert, une nouvelle unit est ajoute au projet en cours ; elle contient la dfinition de lobjet Active Server. De plus, lexpert ajoute un projet de bibliothque de types et ouvre lditeur de bibliothque de types. Vous pouvez alors exposer les proprits et mthodes de linterface via la bibliothque de type comme indiqu dans Dfinition de linterface dun objet COM la page 36-9. Quand vous crivez limplmentation des proprits et mthodes de votre objet, vous pouvez tirer profit des lments intrinsques ASP (dcrit ci-dessous) pour obtenir des informations sur lapplication ASP et les messages HTTP quelle utilise pour communiquer avec les navigateurs. Comme tout autre objet Automation, lobjet Active Server implmente une interface double, qui gre aussi bien la liaison prcoce ( la compilation) via la VTable et la liaison tardive ( lexcution) via linterface IDispatch. Pour davantage dinformations sur les interfaces doubles, voir Interfaces doubles la page 36-14.
37-3
Application
On accde lobjet Application via une interface IApplicationObject. Il reprsente toute lapplication ASP, dfinie comme tant lensemble de tous les fichiers .asp dun mme rpertoire virtuel et de ses sous-rpertoires. Lobjet Application peut tre partag par plusieurs clients, il propose donc une gestion du verrouillage que vous devez utiliser pour empcher des conflits de threads. IApplicationObject propose les membres suivants :
Tableau 37.1 Membres de linterface IApplicationObject Signification
Enumre tous les objets ajouts lapplication en utilisant les commandes de script. Cette interface a deux mthodes Remove et RemoveAll que vous pouvez utiliser pour supprimer un objet de la liste ou bien tous les objets. Enumre tous les objets ajouts lapplication avec la balise <OBJECT>. Empche dautres clients de verrouiller lobjet Application jusqu lappel de Unlock. Tous les clients doivent appeler Lock avant daccder la mmoire partage (par exemple, les proprits). Libre le verrou plac en utilisant la mthode Lock. Se produit la sortie de lapplication, aprs lvnement Session_OnEnd. Les seuls lments intrinsques alors disponibles sont Application et Server. Ce gestionnaire dvnement doit tre crit en VBScript ou en JScript. Se produit avant la cration dune nouvelle session (avant Session_OnStart). Les seuls lments intrinsques alors disponibles sont Application et Server. Ce gestionnaire dvnement doit tre crit en VBScript ou en JScript.
Evnement Application_OnStart
37-4
Guide du dveloppeur
Request
On accde lobjet Request via une interface IRequest . Il donne des informations sur le message de requte HTTP qui a entran louverture de la page Active Server. IRequest propose les membres suivants :
Tableau 37.2 Membres de linterface IRequest Signification
Indique la valeur de tous les champs du certificat client qui a t envoy avec le message HTTP. Indique la valeur de tous les en-ttes de cookie du message HTTP. Indique la valeur des lments de fiche dans le corps HTTP. Il est possible dy accder par nom. Indique la valeur de toutes les variables de la chane de requte de len-tte HTTP. Indique la valeur de diverses variables denvironnement. Ces variables reprsentent la plupart des variables courantes dun en-tte HTTP. Indique le nombre doctets dans le corps de la requte. Cest la limite suprieure du nombre doctets renvoys par la mthode BinaryRead. Rcupre le contenu dun message Post. Appelez la mthode en spcifiant le nombre maximum doctets lire. Le contenu rsultant est renvoy dans un tableau Variant doctets. Aprs avoir appel BinaryRead vous ne pouvez plus utiliser la proprit Form.
Proprit TotalBytes
Mthode BinaryRead
Response
On accde lobjet Response via une interface IResponse. Il vous permet de spcifier des informations sur le message de rponse HTTP renvoy au navigateur client. IResponse propose les membres suivants :
Tableau 37.3 Membres de linterface IResponse Signification
Dtermine la valeur des tous les en-ttes de cookie du message HTTP. Indique si la sortie de la page est place dans un tampon. Si cest le cas, le serveur nenvoie la rponse au client quaprs avoir trait tous les scripts serveur de la page en cours. Dtermine si des serveurs proxy peuvent placer dans un cache la sortie de la rponse. Ajoute le nom du jeu de caractres len-tte de type de contenu.
37-5
Tableau 37.3
Session
On accde lobjet Session via une interface ISessionObject. Il vous permet de stocker des variables qui subsistent durant toute linteraction dun client avec lapplication ASP. Ces variables ne sont donc pas libres quand le client passe dune page une autre dans lapplication ASP mais uniquement quand le client sort de lapplication. ISessionObject propose les membres suivants :
Tableau 37.4 Membres de linterface ISessionObject Signification
Enumre tous les objets ajouts la session en utilisant la balise <OBJECT>. Vous pouvez accder toute variable de la liste par son nom ou appeler les mthodes Remove ou RemoveAll de lobjet Contents pour supprimer des valeurs. Enumre tous les objets ajouts la session avec la balise <OBJECT>.
Proprit StaticObjects
37-6
Guide du dveloppeur
Tableau 37.4
Evnement Session_OnStart
Server
On accde lobjet Server via une interface IServer. Il propose divers utilitaires pour crire votre application ASP. IServer propose les membres suivants :
Tableau 37.5 Membres de linterface IServer Signification
Identique la proprit Timeout de lobjet Session. Instancie lobjet Active Server spcifi. Excute le script dun fichier .asp spcifi. Renvoie un objet ASPError qui dcrit la condition derreur. Code une chane en vue de son utilisation dans un en-tte HTML, en remplaant les caractres rservs par les constantes symboliques appropries. Associe un rpertoire virtuel spcifi (un rpertoire absolu dans le serveur en cours ou un chemin relatif la page en cours) un chemin daccs physique. Envoie toutes les informations dtat en cours une autre page Active Server pour traitement. Applique les rgles de codage dune URL, y compris les caractres dchappement, la chane spcifie
Mthode MapPath
37-7
De plus, comme les composants hors processus crent souvent des processus de serveur individuels pour chaque instance dobjet, ils sont plus lents que les applications CGI. Ils ne supportent pas aussi bien les redploiements que les composants DLL. Si les performances et le redploiement sont des priorits, il est fortement conseill dutiliser des composants en processus. Cependant les sites Intranet qui ont un trafic faible ou modr peuvent utiliser un composant hors processus sans affecter les performances globales du site. Pour des informations gnrales sur les serveurs en et hors processus, voir Serveurs en processus, hors processus et distants la page 33-7.
Si vous voulez retirer lobjet ASP de votre systme, vous devez commencer par annuler son recensement, puis retirer ses entres dans le registre Windows.
37-8
Guide du dveloppeur
1 Activez, si ncessaire, les informations de dbogage en utilisant la page Compilateur de la bote de dialogue Projet|Options. Activez galement le dbogage intgr dans la bote de dialogue Outils|Options du dbogueur. 2 Choisissez Excuter|Paramtres, entrez le nom de votre serveur Web dans la zone Application hte et choisissez OK. 3 Choisissez Excuter|Excuter. 4 Dfinissez des points darrt dans limplmentation de lobjet Active Server. 5 Utilisez le navigateur Web pour interagir avec lobjet ASP.
Le dbogueur sarrte quand les points darrt sont atteints.
37-9
37-10
Guide du dveloppeur
38
Chapitre 38
Chapitre
Un contrle ActiveX est un composant logiciel qui peut sintgrer toute application hte acceptant les contrles ActiveX (comme C++Builder, Delphi, Visual Basic, Internet Explorer et, avec un complment, Netscape Navigator) et en tendre les fonctionnalits. Les contrles ActiveX implmentent un ensemble particulier dinterfaces qui permettent cette intgration. Ainsi, Delphi est fourni avec plusieurs contrles ActiveX : graphes, tableurs ou graphiques. Vous pouvez ajouter ces contrles la palette des composants de lEDI et les utiliser comme tout composant VCL standard en les dposant dans des fichiers et en dfinissant leurs proprits avec linspecteur dobjets. Vous pouvez galement dployer sur le Web un contrle ActiveX, en le rfrenant dans des documents HTML et en le visualisant dans un navigateur Web grant ActiveX. Delphi propose des experts qui permettent de crer deux types de contrles ActiveX : Des contrles ActiveX qui encapsulent des classes VCL. En encapsulant une classe VCL, vous pouvez convertir les composants existants en contrles ActiveX ou en crer de nouveaux, les tester localement puis les convertir en contrles ActiveX. Gnralement, les contrles ActiveX sont conus pour sintgrer dans une application plus importante. Des fiches actives. Les fiches actives (ActiveForms) vous permettent dutiliser le concepteur de fiche pour crer un contrle plus labor qui se comporte comme une bote de dialogue ou mme comme une application complte. Vous dveloppez une fiche active de la mme manire qu une application Delphi normale. Les fiches actives sont gnralement conues en vue dun dploiement sur le Web. Ce chapitre est une prsentation gnrale de la faon de crer un contrle ActiveX dans lenvironnement Delphi. Vous ny trouverez pas les dtails complets de lcriture des contrles ActiveX sans utiliser dexperts. Pour cela,
38-1
consultez la documentation Microsoft Developers Network (MSDN) ou recherchez sur le site Web de Microsoft des informations sur ActiveX.
1 Concevez et crez le contrle VCL personnalis qui sera la base de votre contrle ActiveX. 2 Utilisez lexpert contrle ActiveXpour crer un contrle ActiveX partir du contrle VCL cr ltape 1. 3 Utilisez lexpert de page proprits ActiveXpour crer une ou plusieurs pages de proprits pour le contrle (facultatif). 4 Associez une page de proprits un contrle ActiveX (facultatif). 5 Recensez le contrle ActiveX. 6 Testez le contrle ActiveX avec toutes les applications cible possibles. 7 Dployez le contrle ActiveX sur le Web (facultatif).
Pour crer une nouvelle fiche active, effectuez les tapes suivantes :
1 Utilisez lexpert ActiveForm pour crer une fiche active, qui apparat comme une fiche vide dans lEDI et lenveloppe ActiveX associe cette fiche. 2 Utilisez le concepteur de fiche pour ajouter des composants votre fiche active et implmenter son comportement comme vous lutiliseriez pour une fiche ordinaire. 3 Suivez les tapes 3-7 prcdentes pour donner la fiche active une page de proprits, la recenser et la dployer sur le Web.
38-2
Guide du dveloppeur
Contrle VCL
Dans Delphi, limplmentation sous-jacente un contrle ActiveX est un contrle VCL. Quand vous crez un contrle ActiveX, vous devez commencer par concevoir ou choisir le contrle VCL partir duquel vous aller construire votre contrle ActiveX. Le contrle VCL sous-jacent doit tre un descendant de TWinControl car il doit disposer dune fentre qui peut tre accueillie par lapplication hte. Quand vous crez une fiche active, cet objet est un descendant de TActiveForm.
Remarque
Lexpert contrle ActiveX numre les descendants TWinControl dans lesquels vous pouvez choisir pour crer un contrle ActiveX. Nanmoins, cette liste ne propose pas tous les descendants TWinControl. Certains contrles sont rpertoris comme incompatibles avec ActiveX (en utilisant la procdure RegisterNonActiveX) et napparaissent pas dans cette liste.
Enveloppe ActiveX
Le vritable objet COM est un objet ActiveX qui encaspule le contrle VCL. Pour les fiches actives, cette classe est toujours TActiveFormControl. Pour les autres contrles ActiveX, elle a un nom de la forme TVCLClassX, o TVCLClass est le nom de la classe du contrle VCL. Ainsi, par exemple, lenveloppe ActiveX de TButton se nommerait TButtonX . La classe enveloppe est un descendant de TActiveXControl, qui gre les interfaces ActiveX. Lenveloppe ActiveX en hrite, ce qui lui permet de retransmettre les messages Windows au contrle VCL et daccueillir sa fentre dans lapplication hte. Lenveloppe ActiveX expose les proprits et mthodes du contrle VCL aux clients en utilisant son interface par dfaut. Lexpert implmente automatiquement la plupart des proprits et mthodes de classe enveloppe et dlgue les appels de mthode au contrle VCL sous-jacent. Lexpert fournit galement la classe enveloppe les mthodes qui dclenchent les vnements du contrle VCL dans les clients et affecte ces mthodes aux gestionnaires dvnements du contrle VCL.
Bibliothque de types
Lexpert contrle ActiveX gnre automatiquement une bibliothque de types qui contient les dfinitions de type pour la classe enveloppe, son interface par dfaut et toutes les dfinitions de type ncessaires. Ces informations de type permettent au contrle dinformer les applications htes de ses services. Vous pouvez visualiser et modifier ces informations en utilisant lditeur de bibliothques de
38-3
types. Mme si ces informations sont stockes dans un fichier bibliothque binaire spar (dextension .TLB), elles sont galement compiles automatiquement sous forme de ressources dans la DLL du contrle ActiveX.
Page de proprits
Vous pouvez ventuellement attribuer votre contrle ActiveX une page de proprits. La page de proprits permet lutilisateur de lapplication hte (le client) de visualiser et de modifier les proprits du contrle. Vous pouvez regrouper plusieurs proprits dans une page ou utiliser une page pour proposer une interface de type bote de dialogue une proprit. Pour davantage dinformations sur la manire de crer des pages de proprits, voir Cration dune page de proprits pour un contrle ActiveX la page 38-13.
38-4
Guide du dveloppeur
Avant dutiliser lexpert contrle ActiveX, vous devez choisir le contrle VCL qui fournit limplmentation sous-jacente du contrle ActiveX gnr. Pour afficher lexpert contrle ActiveX :
1 Choisissez Fichier|Nouveau pour ouvrir la bote de dialogue Nouveaux lments. 2 Slectionnez longlet ActiveX. 3 Double-cliquez sur licne Contrle ActiveX.
Dans lexpert, slectionnez le nom du contrle VCL encapsul par le nouveau contrle ActiveX. La bote de dialogue numre tous les contrles disponibles, cest--dire les descendants TWinControl qui ne sont pas recenss comme incompatibles avec ActiveX en utilisant la procdure RegisterNonActiveX.
Astuce
Si vous ne voyez pas le contrle souhait dans la liste droulante, vrifiez si vous lavez install dans lEDI ou ajoutez son unit votre projet. Une fois le contrle slectionn, lexpert gnre automatiquement un nom pour la coclasse, lunit dimplmentation de lenveloppe ActiveX et le projet de bibliothque ActiveX. Si un projet de bibliothque ActiveX est dj ouvert et quil ne contient pas dobjet vnement COM+, ce projet est automatiquement utilis. Vous pouvez modifier ces noms dans lexpert sauf si vous avez dj un projet de bibliothque ActiveX ouvert, auquel cas le nom du projet nest pas modifiable. Lexpert utilise toujours le modle de thread Apartment. Cela ne pose pas de problme si votre projet ActiveX ne contient quun seul contrle. Cependant, si vous ajoutez dautres objets votre projet, cest vous dassurer la gestion des threads. Lexpert vous permet galement de configurer diverses options du contrle ActiveX : Licence de conception : Vous pouvez faire recenser votre contrle pour vous assurer que les utilisateurs du contrle ne peuvent pas louvrir en conception ou lexcution, sauf sils disposent dune cl de licence pour le contrle. Informations de version : Vous pouvez inclure dans le contrle ActiveX des informations de version, comme le copyright ou une description du fichier. Ces informations peuvent tre visualises par un navigateur. Certains clients htes comme Visual Basic 4.0 exigent des informations de version pour accueillir le contrle ActiveX. Spcifiez les informations de version en choisissant Projet|Options et en slectionnant la page Informations de version. Bote A propos : Vous pouvez demander lexpert de gnrer une fiche spare qui implmente une bote de dialogue A propos pour le contrle. Les utilisateurs de lapplication hte peuvent afficher cette bote de dialogue A propos dans un environnement de dveloppement. Par dfaut, la bote de dialogue A propos contient le nom du contrle ActiveX, une image, les informations de copyright et un bouton OK. Vous pouvez modifier cette fiche que lexpert ajoute votre projet.
38-5
Quand vous sortez de lexpert, il gnre les lments suivants : Un fichier projet de bibliothque ActiveX qui contient le code ncessaire pour dmarrer un contrle ActiveX. Gnralement, vous ne modifierez pas ce fichier. Une bibliothque de types qui dfinit une CoClasse pour le contrle, linterface quelle expose aux clients et les dfinitions de types qui leurs sont ncessaires. Pour davantage dinformations sur la bibliothque de types, voir chapitre 34, Utilisation des bibliothques de types. Une unit dimplmentation ActiveX qui dfinit et implmente le contrle ActiveX, un descendant de TActiveXControl. Ce contrle ActiveX est une implmentation entirement fonctionnelle qui ne ncessite aucun travail de votre part. Vous pouvez cependant modifier cette classe si vous voulez personnaliser les proprits, mthodes et vnements que le contrle ActiveX expose aux clients. Une unit et une fiche de bote de dialogue A propos, si vous lavez demand. Un fichier .LIC, si vous avez demand une licence.
1 Choisissez Fichier|Nouveau pour ouvrir la bote de dialogue Nouveaux lments. 2 Slectionnez longlet ActiveX. 3 Double-cliquez sur licne ActiveForm.
Lexpert ActiveForm ressemble lexpert contrle ActiveX mais vous ne spcifiez pas le nom de la classe VCL encapsuler. En effet, les fiches actives sont toujours bases sur TActiveForm. Comme dans lexpert contrle ActiveX, vous pouvez changer les noms par dfaut de la CoClasse, de lunit dimplmentation et du projet de bibliothque ActiveX. De mme lexpert vous permet dindiquer si vous voulez que votre
38-6
Guide du dveloppeur
fiche active ncessite une licence, si elle doit contenir des informations de version et si vous voulez une fiche A propos. Quand vous sortez de lexpert, il gnre : Un fichier projet de bibliothque ActiveX qui contient le code ncessaire pour dmarrer un contrle ActiveX. Gnralement, vous ne modifierez pas ce fichier. Une bibliothque de types qui dfinit une CoClasse pour le contrle, linterface quelle expose aux clients et les dfinitions de types qui leurs sont ncessaires. Pour davantage dinformations sur la bibliothque de types, voir chapitre 34, Utilisation des bibliothques de types. Une fiche qui drive de TActiveForm. Cette fiche apparat dans le concepteur de fiche, ce qui vous permet de concevoir visuellement comment la fiche active apparatra aux clients. Son implmentation apparat dans lunit dimplmentation gnre. Dans la section initialisation de lunit dimplmentation, un fabricant de classe est cr, et il configure TActiveFormControl comme lenveloppe ActiveX de cette fiche. Une unit et une fiche de bote de dialogue A propos, si vous lavez demand. Un fichier .LIC, si vous avez demand une licence. Arriv l, vous pouvez ajouter des contrles la fiche et la concevoir votre guise. Une fois le projet ActiveForm conu et compil dans une bibliothque ActiveX (dextension OCX), vous pouvez dployer le projet sur votre serveur Web et Delphi cre une page HTML test contenant une rfrence la fiche active.
38-7
Les licences dexcution pour Internet Explorer ncessitent un niveau supplmentaire dindirection, car lutilisateur peut visualiser le code source HTML de toutes les pages Web et un contrle ActiveX est copi sur son ordinateur avant quil ne soit affich. Pour crer des licences dexcution pour les contrles utiliss sous Internet Explorer, vous devez dabord gnrer un fichier paquet de licence (fichier LPK) et lincorporer dans la page HTML qui contient le contrle. Le fichier LPK est essentiellement un tableau de CLSID et de cls de licence.
Remarque
Pour gnrer le fichier LPK, utilisez lutilitaire LPK_TOOL.EXE, que vous pouvez tlcharger partir du site Web de Microsoft (www.microsoft.com). Pour incorporer le fichier LPK dans une page Web, utilisez les objets HTML, <OBJECT> et <PARAM>, comme suit :
<OBJECT CLASSID="clsid:6980CB99-f75D-84cf-B254-55CA55A69452"> <PARAM NAME="LPKPath" VALUE="ctrllic.lpk"> </OBJECT>
Le CLSID identifie lobjet en tant que paquet de licence et PARAM spcifie lemplacement relatif du fichier paquet de licence par rapport la page HTML. Lorsque Internet Explorer essaie dafficher la page Web contenant le contrle, il analyse le fichier LPK, extrait la cl de licence et, si celle-ci correspond la licence du contrle (renvoye par GetLicenseString), il restitue le contrle dans la page. Si plusieurs fichiers LPK sont inclus dans une page Web, Internet Explorer ne prend en compte que le premier. Pour plus dinformations, effectuez des recherches sur la dfinition de licences de contrles ActiveX sur le site Web de Microsoft.
38-8
Guide du dveloppeur
ajoutez des vnements, ils doivent tre ajouts linterface Events et non linterface par dfaut du contrle ActiveX.
Remarque
Vous pouvez ajouter des proprits non publies linterface de votre contrle ActiveX. De telles proprits peuvent tre dfinies lexcution et apparaissent dans lenvironnement de dveloppement, mais les modifications effectues ne sont pas persistantes. Donc, si lutilisateur du contrle modifie la valeur de la proprit la conception, les modifications ne sont pas prises en compte dans le contrle lexcution. Si la source est un objet VCL alors que la proprit nest pas dj publie, vous pouvez rendre la proprit persistente en crant un descendant de lobjet VCL et en publiant la proprit dans le descendant. Vous ntes pas oblig dexposer toutes les proprits, mthodes et vnements du contrle VCL aux applications htes. Vous pouvez utiliser lditeur de bibliothques de types pour les retirer des interfaces que lexpert a gnr. Quand vous retirez des proprits et mthodes dune interface en utilisant lditeur de bibliothques de types, lditeur ne les retire pas de la classe dimplmentation correspondante. Editez la classe enveloppe ActiveX dans lunit dimplmentation pour les en retirer une fois que vous avez modifi linterface dans lditeur de bibliothques de types.
Attention Astuce
Toutes les modifications effectues dans la bibliothque de types sont perdues si vous rgnrez le contrle ActiveX depuis le contrle ou la fiche VCL dorigine. Il est judicieux de tester les mthodes que lexpert ajoute votre classe enveloppe ActiveX. Cela vous donne lopportunit de vrifier o lexpert a omis des proprits orientes donnes ou des mthodes incompatibles avec lAutomation ; mais cela vous donne galement loccasion de dtecter les mthodes pour lesquelles lexpert na pas pu gnrer une implmentation. Ces mthodes apparaissent dans limplmentation avec un commentaire indiquant le problme.
38-9
actualis par lditeur de bibliothques de types) est augmente dune ou deux nouvelles mthodes (une mthode get et/ou une mthode set). Vous devez implmenter comme si vous aviez ajout une mthode linterface, la classe enveloppe est augmente dune mthode correspondante que vous devez implmenter. Lajout de proprits linterface de la classe enveloppe revient donc ajouter des mthodes : le squelette de nouvelles implmentations de mthodes complter est ajout la dfinition de la classe enveloppe.
Remarque
Pour davantage dinformations sur ce qui apparat dans le fichier unit _TLB gnr, voir Code gnr par limportation des informations dune bibliothque de types la page 35-5. Par exemple, soit une proprit Caption de type TCaption dans lobjet VCL sousjacent. Pour ajouter cette proprit linterface de lobjet, entrez ce qui suit quand vous ajoutez une proprit linterface via lditeur de bibliothques de types :
property Caption: TCaption read Get_Caption write Set_Caption;
De plus, il ajoute les squelettes de mthodes dimplmentation suivants que vous devez complter :
function TButtonX.Get_Caption: WideString; begin end; procedure TButtonX.Set_Caption(Value: WideString); begin end;
Gnralement, vous pouvez implmenter ces mthodes par simple dlgation au contrle VCL associ auquel vous avez accs en utilisant le membre FDelphiControl de la classe enveloppe :
function TButtonX.Get_Caption: WideString; begin Result := WideString(FDelphiControl.Caption); end; procedure TButtonX.Set_Caption(const Value: WideString); begin FDelphiControl.Caption := TCaption(Value); end;
Dans certains cas, vous avez besoin dajouter du code pour convertir les types de donnes COM en types natifs Pascal Objet. Lexemple prcdent le fait en utilisant le transtypage.
Remarque
Comme les mthodes dune interface Automation sont dclares safecall, vous navez pas besoin dimplmenter le code dexception COM pour ces mthodes. Le compilateur Delphi gre cela pour vous en gnrant autour du corps des mthodes safecall le code permettant de capturer les exceptions Delphi et de les convertir en structures dinformation et en codes de retour des erreurs COM.
38-10
Guide du dveloppeur
Ajout dvnement
Le contrle ActiveX peut dclencher des vnements dans son conteneur de la mme manire quun objet automation dclenche des vnements dans ses clients. Ce mcanisme est dcrit dans Exposition dvnements aux clients la page 36-11. Si le contrle VCL que vous utilisez comme base pour votre contrle ActiveX a des vnements publis, lexpert ajoute automatiquement le traitement de la liste dvnements client la classe enveloppe ActiveX et dfinit la dispinterface de sortie que les clients doivent implmenter pour rpondre aux vnements. Pour ajouter un vnement dans lditeur de bibliothques de types, slectionnez linterface dvnement et cliquez sur licne de mthode. Ajoutez ensuite manuellement la liste de paramtres que vous voulez inclure par le biais de la page des paramtres. Dclarez ensuite une mthode dans la classe dimplmentation qui soit de mme type que le gestionnaire de lvnement dans le contrle VCL sous-jacent. Cela nest pas gnr automatiquement car Delphi ne sait pas quel gestionnaire dvnement vous utilisez :
procedure KeyPressEvent(Sender: TObject; var Key: Char);
Implmentez cette mthode pour utiliser le rcepteur dvnements de lapplication hte stock dans le membre FEvents de la classe enveloppe :
procedure TButtonX.KeyPressEvent(Sender: TObject; var Key: Char); var TempKey: Smallint; begin TempKey := Smallint(Key); {transtypage dans un type compatible OleAutomation } if FEvents <> nil then FEvents.OnKeyPress(TempKey) Key := Char(TempKey); end; Remarque
Si vous dclenchez des vnements dans un contrle ActiveX, vous navez pas besoin de parcourir une liste de rcepteurs dvnements car le contrle na quune seule application hte. Le processus est plus simple quavec la plupart des serveurs Automation. Enfin, vous devez attribuer ce gestionnaire dvnement au contrle VCL sousjacent afin quil soit appel quand lvnement se produit. Vous effectuez cette affectation dans la mthode InitializeControl :
procedure TButtonX.InitializeControl; begin FDelphiControl := Control as TButton; FDelphiControl.OnClick := ClickEvent; FDelphiControl.OnKeyPress := KeyPressEvent; end;
38-11
Cest lapplication conteneur accueillant votre contrle ActiveX qui est responsable de la connexion avec la base de donnes des proprits spcifies comme orients donnes dans la bibliothque de types. Pour des informations sur lcriture dun tel conteneur avec Delphi, voir Utilisation de contrles ActiveX orients donnes la page 35-9. Utilisez la bibliothque de types pour activer la liaison de donnes simple,
1 Dans la barre doutils, cliquez sur la proprit lier. 2 Choisissez la page Indicateurs. 3 Slectionnez les attributs de liaison suivants :
Attributs de liaison
Bindable
Description
Indique que la proprit supporte la liaison de donnes. Si elle est marque bindable, la proprit notifie son conteneur quand sa valeur a t modifie. Indique que la proprit supporte la notification OnRequestEdit. Cela permet au contrle de demander au conteneur si sa valeur peut tre modifie par lutilisateur. Indique que le conteneur peut montrer aux utilisateurs que cette proprit est bindable. Indique la proprit bindable qui reprsente le mieux lobjet. Les proprits qui ont cet attribut de liaison par dfaut doivent avoir aussi lattribut bindable. On ne peut pas spcifier plusieurs proprits de ce type dans une dispinterface. Chacune des proprits bindable dune fiche peut bnficier de ce comportement. Quand ce bit est dfini, toutes les modifications sont notifies. Les bits Bindable et Request Edit doivent tre dfinis pour que cet attribut prenne effet.
Request Edit
Immediate Bindable
4 Cliquez sur le bouton Rafrachir de la barre doutils pour actualiser la bibliothque de types.
38-12
Guide du dveloppeur
Pour pouvoir tester un contrle dont la liaison de donnes est active, vous devez dabord le recenser. Par exemple, pour lier un contrle TEdit aux donnes dun contrle ActiveX, crez le contrle ActiveX partir dun TEdit, puis modifiez les indicateurs de la proprit Text en Bindable, Display Bindable, Default Bindable et Immediate Bindable. Une fois le contrle recens et import, il peut tre utilis pour afficher les donnes.
1 Cration dune nouvelle page de proprits. 2 Ajout de contrles la page de proprits. 3 Association des contrles de la page de proprits aux proprits dun contrle ActiveX. 4 Connexion de la page de proprits au contrle ActiveX.
Remarque
Quand des proprits sont ajoutes un contrle ActiveX ou une fiche ActiveForm, vous devez publier les proprits dont vous voulez quelles persistent. Si ces proprits ne sont pas publies dans le contrle VCL sousjacent, vous devez crer un descendant personnalis du contrle VCL qui redclare les proprits comme publies, et utiliser lexpert contrle ActiveX pour crer le contrle ActiveX partir de cette classe drive.
1 Choisissez Fichier|Nouveau. 2 Slectionnez longlet ActiveX. 3 Double-cliquez sur licne Page proprits.
Lexpert cre une nouvelle fiche et lunit dimplmentation de la page de proprits. La fiche est un descendant de TPropertyPage qui vous permet dassocier la fiche avec le contrle ActiveX dont il modifie les proprits.
38-13
La bote liste permet lutilisateur de slectionner parmi une liste de modles exemple. Les contrles de saisie permettent lutilisateur de tester le masque avant de lappliquer au contrle ActiveX.
38-14
Guide du dveloppeur
Remarque
Il est galement possible dcrire une page de proprits qui reprsente plusieurs contrles ActiveX. Dans ce cas, nutilisez pas la proprit OleObject. Vous devez, la place, parcourir la liste des interfaces qui est gre par la proprit OleObjects.
Actualisation de lobjet
Ajoutez du code la mthode UpdateObject pour mettre jour la proprit quand lutilisateur modifie les contrles de la page de proprits. Vous devez ajouter du code la mthode UpdateObject afin de dfinir la nouvelle valeur des proprits du contrle ActiveX. Utilisez la proprit OleObject pour accder au contrle ActiveX. Par exemple, le code suivant affecte la proprit EditMask dun contrle ActiveX en utilisant la valeur du contrle bote de saisie (InputMask) de la page de proprits :
procedure TPropertyPage1.UpdateObject; begin {Mettre jour OleObject partir de votre contrle } OleObject.EditMask := InputMask.Text; end;
1 Ajoutez DefinePropertyPage, avec la constante GUID de la page de proprits comme paramtre, limplmentation de la mthode DefinePropertyPages dans limplmentation des contrles de lunit. Par exemple,
procedure TButtonX.DefinePropertyPages(DefinePropertyPage: TDefinePropertyPage); begin DefinePropertyPage(Class_PropertyPage1); end;
La constante GUID, Class_PropertyPage1, de la page de proprits peut tre trouve dans lunit des pages de proprits. Le GUID est dfini dans lunit dimplmentation de la page de proprits ; il est gnr automatiquement par lexpert Page proprits.
2 Ajoutez lunit de la page de proprits la clause uses de lunit dimplmentation des contrles.
38-15
Remarque
Avant de retirer un contrle ActiveX de votre systme, vous devez annuler son recensement. Pour annuler le recensement dun contrle ActiveX : Choisissez Excuter|D recenser le serveur ActiveX. Comme alternative, vous pouvez utiliser tregsvr sur la ligne de commande ou excuter le regsvr32.exe du systme dexploitation.
1 Slectionnez Projet|Options de dploiement Web. 2 Dans la page Projet, dfinissez dans la zone Rpertoire destination lemplacement de la DLL du contrle ActiveX (sous la forme dun chemin sur le serveur Web). Cela peut tre un chemin daccs local ou un chemin daccs UNC, par exemple, C:\INETPUB\wwwroot. 3 Dfinissez dans URL destination, lemplacement sur le serveur Web (sous la forme dune URL) de la DLL du contrle ActiveX (sans le nom de fichier), par exemple, http://mymachine.inprise.com/. Voir la documentation de votre serveur Web pour davantage dinformations sur la manire de procder. 4 Dfinissez dans Rpertoire HTML lemplacement (sous la forme dun chemin daccs) o doit tre plac le fichier HTML contenant une rfrence au
38-16
Guide du dveloppeur
contrle ActiveX, par exemple, C:\INETPUB\wwwroot. Ce chemin daccs peut tre un chemin daccs standard ou un chemin daccs UNC.
5 Dfinissez les options de dploiement Web souhaites, comme dcrit dans Paramtrage des options la page 38-17. 6 Choisissez OK. 7 Choisissez Projet|Dploiement Web.
Cela cre la base du code de dploiement contenant le contrle ActiveX dans une bibliothque ActiveX (ayant lextension OCX). Selon les options que vous avez spcifies, cette base du code de dploiement peut aussi contenir un fichier cabinet (ayant lextension CAB) ou dinformation (ayant lextension INF). La bibliothque ActiveX est place dans le rpertoire destination spcifi ltape 2. Le fichier HTML porte le mme nom que le projet mais avec lextension .HTM. Il est cr dans le rpertoire HTML spcifi ltape 4. Le fichier HTML contient une URL faisant rfrence la bibliothque ActiveX lemplacement spcifi ltape 3.
Remarque
Si vous voulez placer ces fichiers sur votre serveur Web, utilisez un utilitaire externe comme ftp.
8 Appelez votre navigateur Web grant ActiveX et visualisez la page HTML ainsi cre.
Quand cette page HTML est visualise dans le navigateur Web, la fiche ou le contrle est affich et excut comme application incorpore dans le navigateur. Cest--dire que la bibliothque sexcute dans le mme processus que lapplication navigateur.
38-17
considrablement les temps de tlchargement (jusqu 70%). Lors de linstallation, le navigateur dcompresse les fichiers stocks dans une archive et les copie sur le systme de lutilisateur. Les fichiers que vous dployez peuvent tre des archives .CAB compresses. Chaque fichier dploy peut tre un fichier compress CAB. Vous pouvez spcifier que la bibliothque ActiveX utilise la compression de fichier CAB dans longlet Projet de la bote de dialogue Options de dploiement Web. Informations de version : Vous pouvez demander inclure les informations de version dans le contrle ActiveX. Ces informations sont dfinies dans la page Informations de version de la bote de dialogue Options du projet. Parmi ces informations, il y a le numro de version qui peut tre actualis automatiquement chaque fois que vous dployez votre contrle ActiveX. Si vous incluez dautres paquets ou fichiers, leurs ressources dinformations de version peuvent galement tre ajoutes au fichier INF. Si vous choisissez dajouter des fichiers supplmentaires ou si vous utilisez la compression de fichier CAB, la bibliothque ActiveX rsultant peut prendre la forme dun fichier OCX, dun fichier CAB contenant un fichier OCX ou dun fichier INF. Le tableau suivant rsume le rsultat obtenu avec les diffrentes combinaisons.
Paquets et/ou fichiers suppl mentaires
Non Non Oui Oui
Rsultat
Un fichier bibliothque ActiveX (OCX). Un fichier CAB contenant un fichier bibliothque ActiveX. Un fichier INF, un fichier bibliothque ActiveX et tous les paquets et/ou fichiers supplmentaires. Un fichier INF, un fichier CAB contenant un fichier bibliothque ActiveX et un fichier CAB pour chacun des fichiers et paquets supplmentaires.
38-18
Guide du dveloppeur
39
Chapitre 39
Chapitre
Delphi utilise le terme objet transactionnel pour dsigner des objets qui utilisent les services de transaction, la scurit et la gestion des ressources proposs par Microsoft Transaction Server (MTS) (pour les versions de Windows antrieures Windows 2000) ou par COM+ (pour Windows 2000 ou plus). Ces objets sont conus pour fonctionner dans un environnement distribu important. Ils ne sont pas disponibles dans les applications multiplate-formes cause de leur dpendance par rapport la technologie spcifique Windows. Delphi propose un expert qui cre des objets transactionnels afin que vous puissiez tirer profit des avantages des attributs COM+ ou de lenvironnement MTS. Ces possibilits rendent particulirement simple la cration et limplmentation de clients et de serveurs COM, en particulier les serveurs distants.
Remarque
Pour les applications de bases de donnes, Delphi propose galement un module de donnes transactionnel. Pour davantage dinformations, voir chapitre 25, Cration dapplications multiniveaux. Les objets transactionnels procurent un certain nombre de services de base, tels que : Gestion des ressources systme, y compris processus, threads et connexions aux bases de donnes, afin que votre application serveur puisse grer de nombreux utilisateurs simultans. Initialisation et contrle des transactions automatiques afin que votre application soit fiable. Cration, excution et suppression des composants serveur si ncessaire. Utilisation de la scurit en fonction des rles afin que seuls les utilisateurs autoriss puissent accder votre application. Gestion des vnements afin que les clients puissent rpondre des conditions se produisant sur le serveur (COM+ uniquement).
39-1
En fournissant ces services fondamentaux, MTS ou COM+ vous laisse vous concentrer sur ce qui est spcifique votre propre application distribue. La technologie utilise (MTS ou COM+) dpend du serveur sur lequel vous excutez votre application. Pour les clients, la diffrence entre les deux (ou mme le fait que lobjet serveur utilise lun de ces services) est transparente, sauf si le client manipule explicitement des services transactionnels via une interface spciale.
Si vous utilisez MTS, vos objets transactionnels doivent implmenter IObjectControl. Avec COM+, IObjectControl nest pas obligatoire, mais reste fortement conseille. Lexpert Objet transactionel fournit un objet qui drive de IObjectControl. Le client dun objet transactionnel est appel un client de base. Pour un client de base, un objet transactionnel nest pas diffrent dun autre objet COM. Avec MTS, lobjet transactionnel doit tre gnr dans une bibliothque (DLL) installe dans lenvironnement dexcution MTS (lexcutable MTS, mtxex.exe). Cela signifie que lobjet serveur est excut dans lespace de processus dexcution MTS. Lexcutable MTS peut tre excut dans le mme processus que le client de base, dans un processus distinct de la mme machine ou comme processus serveur distant sur une machine distincte. Avec COM+, lapplication serveur na pas besoin dtre un serveur en processus. Comme les diffrents services ne sont pas intgrs dans les bibliothques COM, il ny a pas besoin dun processus MTS spar pour intercepter les appels adresss au serveur. Cest COM (ou plus exactement COM+) qui se charge de la gestion des ressources, des transactions, etc. Nanmoins, lapplication serveur doit toujours tre installe, mais cette fois dans une application COM+.
39-2
Guide du dveloppeur
La connexion entre le client de base et lobjet transactionnel est gre par un proxy ct client et par un stub ct serveur, comme pour tous les serveurs hors processus. Les informations sur la connexion sont gres par le proxy. La connexion entre le client de base et le proxy reste ouverte aussi longtemps que le client demande la connexion au serveur. De ce fait, le client crot quil bnficie dun accs continu au serveur. En ralit, le proxy peut dsactiver et ractiver lobjet, conservant des ressources pour que les autres clients puissent utiliser la connexion. Pour plus dinformations sur lactivation et la dsactivation, voir Activation juste--temps la page 39-4.
39-3
Il existe une autre faon daccder lobjet de contexte : utiliser les mthodes de lobjet TMtsAutoObject :
if IsCallerInRole (Manager) ...
Vous pouvez utiliser lune ou lautre des mthodes prcdentes. Cependant, il existe un lger avantage utiliser les mthodes TMtsAutoObject plutt qu faire rfrence la proprit ObjectContext lorsque vous testez votre application. Pour la prsentation de ces diffrences, voir D bogage et test des objets transactionnels la page 39-23.
Activation juste--temps
La capacit dun objet tre dsactiv et ractiv alors que des clients continuent lui faire rfrence est nomme activation juste--temps. Vu du client, il existe une seule instance de lobjet partir du moment o le client la cre et jusquau
39-4
Guide du dveloppeur
moment o il la libre. En ralit, il se peut que lobjet ait t dsactiv et ractiv de nombreuses fois. Les objets pouvant tre ainsi dsactivs, les clients peuvent continuer de faire rfrence un objet pendant un temps indtermin sans affecter les ressources du systme. Lorsquun objet devient dsactiv, toutes les ressources de lobjet sont libres. Ainsi quand un objet est dsactiv, sa connexion la base de donnes est libre et utilisable par dautres clients. Un objet transactionnel est cr ltat dsactiv et ne devient actif qu la rception dune requte dun client. Quand lobjet transactionnel est cr, un objet de contexte est galement cr. Cet objet de contexte existe pendant lintgralit de la dure de vie de lobjet transactionnel correspondant, pendant un ou plusieurs cycles de ractivation. Lobjet de contexte, accessible via linterface IObjectContext permet de conserver une trace de lobjet quand il est dsactiv ou pendant les transactions de coordination. Les objets transactionnels sont dsactivs ds que cela peut se faire sans risque. Cest la dsactivation ds-que-possible. Un objet transactionnel est dsactiv lorsquun des vnements suivants se produit : Lobjet demande la dsactivation avec SetComplete ou SetAbort : Un objet appelle la mthode SetComplete de IObjectContext lorsquil a termin son travail avec succs et qu il na pas besoin de sauver ltat interne de lobjet pour un prochain appel du client. Un objet appelle SetAbort pour indiquer quil ne peut terminer son travail avec succs et que ltat de lobjet na pas besoin dtre sauv, cest--dire que lobjet reprend ltat quil avait avant la transaction. Souvent, les objets sont conus sans tat, ce qui signifie que les objets sont dsactivs aprs le retour de toutes les mthodes. Une transaction est valide ou annule : Lorsqu une transaction sur un objet est valide ou annule, lobjet est dsactiv. Parmi ces objets dsactivs, les seuls qui continuent exister sont ceux qui des clients hors transaction sont en train de faire rfrence. Les prochains appels ces objets les ractivent et les font sexcuter dans la prochaine transaction. Le dernier client libre lobjet : Bien s r, lorsquun client libre lobjet, il est dsactiv et lobjet de contexte galement.
Remarque
Quand vous installez un objet transactionnel sous COM+ depuis lEDI, vous pouvez spcifier si lobjet utilise lactivation juste--temps en utilisant la page COM+ de lditeur de bibliothques de types. Slectionnez lobjet (CoClasse) dans lditeur de bibliothques de types, allez sur la page COM+ et cochez ou non la case Activation Just In Time. Sinon, un administrateur systme peut spcifier cet attribut en utilisant le gestionnaire de composants COM+ ou lExplorateur MTS (ladministrateur systme peut galement redfinir tous les paramtres que vous avez spcifis en utilisant lditeur de bibliothques de types).
39-5
connexion une base de donnes qui nest plus utilise par un objet serveur peut tre rutilise par un autre client. Cest ce que lon appelle le regroupement des ressources. Les ressources regroupes sont gres par un fournisseur de ressources. Un fournisseur de ressources place les ressources dans un cache, afin que les objets transactionnels installs ensemble puissent les partager. Le fournisseur de ressources gre galement les informations dtat partages non permanentes. Ainsi, les fournisseurs de ressources fonctionnent de la mme manire que les gestionnaires de ressources (comme SQL Server) mais sans garantir la permanence. Pour crire vos objets transactionnels, vous pouvez utiliser deux types de fournisseurs de ressources dj dfinis : Les fournisseurs de ressources base de donnes Le gestionnaire de proprits partages Avant que dautres objets puissent utiliser des ressources regroupes, vous devez explicitement les librer.
Il ny a pas de fournisseur de ressources prdfini si vous utilisez les composants InterbaseExpress pour accder vos donnes. Pour les modules de donnes transactionnels distants, les connexions sont automatiquement intgres dans des objets transactions et le fournisseur de ressources peut automatiquement rcuprer et rutiliser les connexions.
39-6
Guide du dveloppeur
39-7
Pour obtenir la valeur dune proprit, utilisez la mthode PropertyByName de lobjet Group, comme ci-dessous. Vous pouvez galement utiliser la mthode PropertyByPosition .
unit Unit1; interface uses MtsObj, Mtx, ComObj, Project2_TLB; type Tfoobar = class(TMtsAutoObject, Ifoobar) private Group: ISharedPropertyGroup; protected procedure OnActivate; override; procedure OnDeactivate; override; procedure IncCounter; end; implementation uses ComServ; { Tfoobar } procedure Tfoobar.OnActivate; var Exists: WordBool; Counter: ISharedProperty; begin Group := CreateSharedPropertyGroup(MyGroup); Counter := Group.CreateProperty(Counter, Exists); end; procedure Tfoobar.IncCounter; var Counter: ISharedProperty; begin Counter := Group.PropertyByName[Counter]; Counter.Value := Counter.Value + 1; end; procedure Tfoobar.OnDeactivate; begin Group := nil; end; initialization TAutoObjectFactory.Create(ComServer, Tfoobar, Class_foobar, ciMultiInstance, tmApartment); end.
39-8
Guide du dveloppeur
transactionnels et les objets de contexte) ainsi que la mmoire occupe par toutes les instances du composant (libration du composant). La seule fois o vous omettrez ces appels, cest lorsque vous voudrez maintenir ltat entre les appels client. Pour plus dinformations, voir Objets avec tat et sans tat la page 39-12.
Regroupement dobjets
Tout comme vous pouvez regrouper des ressources, vous pouvez avec COM+ regrouper des objets. Quand un objet est dsactiv, COM+ appelle la mthode CanBePooled de linterface, qui indique que lobjet peut tre regroup afin dtre rutilis. Si CanBePooled renvoie True, au lieu dtre dtruit quand il est dsactiv, lobjet est dplac dans le groupe dobjets. Il y reste pour une dure limite durant laquelle il est disponible si un client en fait la demande. Cest seulement quand le groupe dobjets est vide quune nouvelle instance de lobjet est cre. Les objets qui renvoient False ou qui ne grent pas linterface IObjectControl sont dtruits quand il sont dsactivs. Le regroupement dobjets nest pas disponible avec MTS. MTS appelle CanBePooled comme indiqu, mais le regroupement nest pas effectu. Si votre objet est utilis uniquement avec COM+ et si vous voulez utiliser le regroupement dobjets, dfinissez la proprit Pooled True. Mme si la mthode CanBePooled dun objet renvoie True, il peut tre configur afin que COM+ ne le place pas dans le regroupement dobjets. Si vous installez lobjet transactionnel dans COM+ depuis lEDI, vous pouvez spcifier si COM+ doit essayer de regrouper lobjet en utilisant la page COM+ de lditeur de bibliothques de types. Slectionnez lobjet (la coclasse) dans lditeur de bibliothques de types, allez sur la page COM+ et cochez ou non la case Pooling dobjets. Par ailleurs, un administrateur systme peut spcifier cet attribut en utilisant le gestionnaire de composant COM+. De la mme faon, vous pouvez configurer la dure durant laquelle un objet dsactiv reste dans le regroupement dobjets avant dtre libr. Pour ce faire, utilisez le paramtre Dlai maxi de cration dans la page COM+ de lditeur de bibliothques de types. Ici encore, ladministrateur systme peut spcifier cet attribut en utilisant le gestionnaire de composants COM+.
39-9
Les transactions garantissent ce qui suit : Toutes les mises jour dune mme transaction sont soit valides, soit annules et ramenes leur tat prcdent. Cest ce que lon appelle atomicit . Une transaction est une transformation correcte de ltat dun systme, en maintenant les invariants de cet tat. Cest ce que lon appelle consistance. Les transactions simultanes ne voient pas les rsultats partiels et non valids les unes des autres afin de ne pas crer dincohrences dans ltat de lapplication. Cest ce que nous appelons isolation. Les gestionnaires de ressources utilisent des protocoles de synchronisation bass sur les transactions pour isoler les travaux non valids des transactions actives. Les mises jour valides des ressources gres (comme les enregistrements dune base de donnes) survivent aux pannes, y compris les pannes de communication, les pannes de processus et les pannes systme des serveurs. Cest ce que nous appelons durabilit. Louverture dune transaction vous permet de rcuprer ltat durable aprs des pannes survenues sur les supports disque. Lobjet de contexte associ lobjet indique sil sexcute dans une transaction et, si cest le cas, lidentit de la transaction. Quand un objet fait partie dune transaction, les services proposs par les gestionnaires de ressources et les fournisseurs de ressources sexcutent galement dans la transaction. Les fournisseurs de ressources utilisent lobjet de contexte pour proposer des services base de transaction. Par exemple, quand un objet excut dans une transaction alloue une connexion de base de donnes en utilisant le fournisseur de ressources ADO ou BDE, la connexion est automatiquement intgre dans la transaction. Toutes les modifications de bases de donnes effectues en utilisant cette connexion font galement partie de la transaction et sont donc soit valides ou annules avec la transaction. Le travail de plusieurs objets peut tre ralis lintrieur dune seule transaction. Permettre un objet de rsider dans sa propre transaction ou de faire partie dun groupe dobjets plus large appartenant une seule transaction est lun des avantages les plus importants de MTS et COM+. Cela permet dutiliser un objet de diffrentes manires ; ainsi le concepteur dapplications peut rutiliser le code dans dautres applications sans rcrire la logique de lapplication. En fait, les dveloppeurs peuvent dterminer comment les objets sont utiliss dans les transactions au moment de linstallation de lobjet transactionnel. Ils peuvent modifier le comportement de transaction simplement en ajoutant un objet un paquet MTS diffrent ou une autre application COM+. Pour davantage dinformations sur linstallation des objets transactionnels, voir Installation dobjets transactionnels la page 39-24.
Attributs transactionnels
Chaque objet transactionnel a un attribut transactionnel stock dans le catalogue MTS ou recens dans COM+.
39-10
Guide du dveloppeur
Delphi permet de dfinir lattribut transactionnel la conception en utilisant lexpert objet transactionnel ou lditeur de bibliothques de types. Chaque attribut transactionnel peut tre dfini par une des valeurs suivantes : Requiert une transaction Les objets doivent sexcuter dans la porte dune transaction. Lorsquun nouvel objet est cr, son contexte hrite de la transaction du contexte du client. Si le client na pas de contexte transactionnel, un nouveau contexte transactionnel est automatiquement cr pour lobjet. Les objets doivent sexcuter dans leurs propres transactions. Lorsquun nouvel objet est cr, une nouvelle transaction est cre automatiquement pour lobjet, que son client ait ou non une transaction. Un objet ne sexcute jamais dans la porte de la transaction de son client. Au contraire, le systme cre toujours des transactions indpendantes pour les nouveaux objets. Les objets peuvent sexcuter dans la porte des transactions de leur client. Lorsquun nouvel objet est cr, son contexte hrite de la transaction du contexte du client. Cela permet plusieurs objets dtre rassembls dans une mme transaction. Si le client na pas de transaction, le nouveau contexte est galement cr sans transaction. Les objets ne sexcutent pas dans la porte des transactions. Lorsquun nouvel objet est cr, son objet de contexte est cr sans transaction, que son client ait ou non une transaction. Cette option est disponible uniquement avec COM+. La signification de cette option change selon que lobjet est install dans MTS ou dans COM+. Avec MTS, cette option a le mme effet que Transactions ignores pour COM+. Dans COM+, non seulement lobjet de contexte est cr dans transaction, mais cette valeur empche lactivation de lobjet si le client a dj une transaction.
Transactions ignores
1 Choisissez Voir|Bibliothque de types pour ouvrir lditeur de bibliothques de types. 2 Slectionnez la classe correspondant lobjet transactionnel. 3 Cliquez dans la page COM+ et choisissez lattribut transactionnel souhait.
39-11
Attention
Quand vous spcifiez lattribut transactionnel, Delphi insre un GUID spcial pour lattribut spcifi comme donne personnalise dans la bibliothque de types. Cette valeur nest pas reconnue en dehors de Delphi. Elle na deffet que si vous installez lobjet transactionnel depuis lEDI. Sinon, un administrateur systme doit dfinir cette valeur en utilisant lexplorateur MTS ou le gestionnaire de composants COM+. Si lobjet transactionnel est dj install, vous devez tout dabord le dsinstaller puis le rinstaller quand vous modifiez lattribut transactionnel. Pour ce faire, utilisez Excuter|Installer les objets MTS ou Excuter|Installer les objets COM+.
Remarque
SetAbort
39-12
Guide du dveloppeur
EnableCommit
DisableCommit
39-13
pour crer le contexte transactionnel. Cette mthode renvoie une interface vers cet objet. Cet exemple insre lappel au contexte transactionnel dans un appel de OleCheck, ncessaire car les mthodes de IObjectContext sont exposes directement par Windows et ne sont donc pas dclares safecall.
procedure TForm1.MoveMoneyClick(Sender: TObject); begin Transfer(CLASS_AccountA, CLASS_AccountB, 100); end; procedure TForm1.Transfer(DebitAccountId, CreditAccountId: TGuid; Amount: Currency); var TransactionContextEx: ITransactionContextEx; CreditAccountIntf, DebitAccountIntf: IAccount; begin TransactionContextEx := CreateTransactionContextEx; try OleCheck(TransactionContextEx.CreateInstance(DebitAccountId, IAccount, DebitAccountIntf)); OleCheck(TransactionContextEx.CreateInstance(CreditAccountId, IAccount, CreditAccountIntf)); DebitAccountIntf.Debit(Amount); CreditAccountIntf.Credit(Amount); except TransactionContextEx.Abort; raise; end; TransactionContextEx.Commit; end;
39-14
Guide du dveloppeur
2 Cliquez avec le bouton droit de la souris et choisissez Properties, puis longlet Options.
Longlet Options est utilis pour dfinir la proprit Transaction timout (dlai de transaction) pour le systme.
3 Changez la valeur de la proprit timeout 0 pour dsactiver les dlais de transaction. 4 Choisissez OK pour enregistrer la configuration.
Pour davantage dinformations sur le dbogage des applications MTS, voir D bogage et test des objets transactionnels la page 39-23.
39-15
Si vous voulez contrler laccs des blocs de code et non des objets entiers, vous pouvez proposer une scurit plus affine en utilisant la mthode IsCallerInRole de IObjectContext. Cette mthode ne fonctionne que si la scurit est active, ce qui peut tre test en appelant la mthode IsSecurityEnabled de IObjectContext. Ces mthodes sont automatiquement ajoutes comme mthodes de votre objet transactionnel. Par exemple :
if IsSecurityEnabled then { Tester si la scurit est active } begin if IsCallerInRole(Mdecin) then { Tester le rle de lappelant } begin { Excuter lappel normalement. } end else { Si ce nest pas un mdecin, effectuer lopration approprie en ce cas. } end end else { La scurit nest pas active, effectuer lopration approprie } end; Remarque
Pour les applications ncessitant une scurit renforce, les objets contexte implmentent linterface ISecurityProperty dont les mthodes permettent dobtenir lidentificateur de scurit Windows (SID) de lappelant direct et crateur de lobjet ainsi que le SID des clients utilisant lobjet.
1 Utilisez lexpert objet transactionnel pour crer lobjet transactionnel. 2 Ajoutez les mthodes et proprits linterface de lobjet en utilisant lditeur de bibliothques de types. Pour des informations sur lajout de proprits et de mthodes en utilisant lditeur de bibliothques de types, voir chapitre 34, Utilisation des bibliothques de types. 3 Quand vous implmentez les mthodes de lobjet, vous pouvez utiliser linterface IObjectContext pour grer les transactions, la persistance de ltat et la scurit. De plus, si vous transmettez des rfrences dobjet, vous devez bien faire attention ce quelles soient correctement gres (voir Transfert de rfrences dobjets la page 21). 4 Dbogez et testez lobjet transactionnel. 5 Installez lobjet transactionnel dans un paquet MTS ou une application COM+. 6 Administrez vos objets en utilisant lexplorateur MTS ou le gestionnaire de composants COM+.
39-16
Guide du dveloppeur
1 Choisissez Fichier|Nouveau|Autre. 2 Slectionnez longlet libell Multi-niveaux. 3 Cliquez deux fois sur licne Objet transactionnel.
Dans lexpert, vous devez spcifier : Le modle de thread afin dindiquer comment les applications client peuvent appeler linterface de votre objet. Le modle de thread dtermine comment lobjet sera recens. Vous devez tre certain que limplmentation de votre objet est conforme au modle slectionn. Pour plus dinformations sur les modles de threads, voir Choix dun modle de thread pour un objet transactionnel la page 39-18. Un modle de transaction. Si votre objet notifie les clients des vnements. La gestion des vnements est propose uniquement pour les vnements classiques, pas pour les vnements COM+. Lorsque vous suivez cette procdure, une nouvelle unit est ajoute au projet en cours, elle contient la dfinition de lobjet transactionnel. De plus, lexpert ajoute une bibliothque de types au projet et louvre dans lditeur de bibliothques de types. Vous pouvez alors exposer les proprits et les mthodes de linterface par le biais de la bibliothque de types. Vous exposez linterface comme vous exposeriez nimporte quel objet Automation comme dcrit dans Dfinition de linterface dun objet COM la page 36-9. Lobjet transactionnel implmente une interface double, qui supporte la fois la liaison prcoce ( la compilation), via la vtable, et la liaison tardive ( lexcution), via linterface IDispatch. Lobjet transactionnel gnr implmente les mthodes de linterface IObjectControl, Activate, Deactivate et CanBePooled. Il nest pas absolument ncessaire dutiliser lexpert objet transactionnel. Vous pouvez convertir tout objet Automation en un objet transactionnel COM+ (et tout objet Automation en processus, en un objet transactionnel MTS) en utilisant la page COM+ de lditeur de bibliothques de types, puis en installant lobjet dans un paquet MTS ou une application COM+. Cependant, lexpert objet transactionnel propose certains avantages : Il implmente automatiquement linterface IObjectControl, et ajoute les vnements OnActivate et OnDeactivate aux objets afin que vous puissiez crer des gestionnaires dvnements qui rpondent lactivation ou la dsactivation de lobjet.
39-17
Il gnre automatiquement une proprit ObjectContext pour simplifier laccs de lobjet aux mthodes de IObjectContext afin de contrler lactivation et les transactions.
Modle de thread
Apporte une nette amlioration des accs simultans par rapport au modle de thread unique. Deux objets peuvent sexcuter simultanment du moment quils appartiennent des activits diffrentes. Semblable lapartment COM, mais les objets peuvent tre distribus dans plusieurs processus.
Remarque
Ces modles de threads sont semblables ceux dfinis par les objets COM. Cependant, comme MTS et COM+ fournissent une meilleure gestion des threads, la signification de chaque modle de thread diffre. Dautre part, le modle libre ne sapplique pas aux objets transactionnels cause de la gestion intgre des activits.
39-18
Guide du dveloppeur
Activits
Outre le modle de thread, les objets transactionnels supporte les accs simultans via les activits. Les activits sont enregistres dans le contexte de lobjet et lassociation entre un objet et une activit ne peut tre modifie. Une activit comprend lobjet transactionnel cr par le client de base, ainsi que tous les objets transactionnels crs par cet objet et ses descendants. Ces objets peuvent tre distribus dans un ou plusieurs processus sexcutant sur un ou plusieurs ordinateurs. Par exemple, une application destine des mdecins peut possder un objet transactionnel ajoutant des mises jour et supprimant des enregistrements dans plusieurs bases de donnes mdicales, chacune reprsente par un objet diffrent. Cet objet dajout peut utiliser galement dautres objets, comme un objet de rception qui enregistre la transaction. Il en rsulte plusieurs objets transactionnels qui sont, soit directement, soit indirectement, sous le contrle du client de base. Ces objets appartiennent tous la mme activit. MTS et COM+ suivent le flux dexcution dans chaque activit, en empchant quun phnomne de paralllisme naltre malencontreusement ltat de lapplication. Le rsultat de cette fonctionnalit est lunicit du thread logique dexcution pour toute une srie dobjets potentiellement distribuables. Grce ce thread logique unique, les applications sont nettement plus faciles crire. Lorsquun objet transactionnel est cr partir dun contexte existant, en utilisant soit un objet contexte transactionnel ou un objet contexte, le nouvel objet devient membre de la mme activit. Autrement dit, le nouveau contexte hrite de lidentificateur dactivit du contexte utilis pour le crer. Il ne peut y avoir quun seul thread logique dexcution pour une mme activit. Ce comportement est semblable celui dun modle de thread apartment COM, mais les objets peuvent tre distribus dans plusieurs processus. Lorsquun client de base fait appel une activit, toutes les autres demandes de travail dans cette activit (par exemple, celles provenant dun autre thread client) sont bloques jusqu ce que le thread dexcution initial revienne vers le client. Avec MTS, chaque objet transactionnel appartient une activit. Avec COM+, vous pouvez configurer la manire dont lobjet participe aux activits en initialisant la synchronisation dappel. Les options suivantes sont disponibles :
Tableau 39.3 Option
Dsactive
Non gre
39-19
Obligatoire
COM+ affecte toujours lobjet une activit, en crant une activit si ncessaire. Cette option doit tre utilise si lattribut transactionnel est Support ou Requiert. COM+ affecte toujours lobjet une nouvelle activit distincte de celle de lappelant.
Nouveau Obligatoire
Les objets transactionnels installs dans COM+ peuvent continuer utiliser lancien systme de gestion des vnements. Nanmoins, laisser COM+ grer le processus offre une plus grande flexibilit. Ainsi, quand COM+ gre les vnements, le client peut tre un serveur en processus qui est dmarr par COM+ quand lvnement se produit. Quand un objet COM+ gnre des vnements, il ne le fait pas directement. Il utilise pour cela un objet vnement associ qui a t spcifiquement cr pour gnrer des vnements. Lobjet COM+ appelle son objet vnement quand il veut dclencher un vnement. Quand cela se produit, COM+ appelle tous les clients qui ont manifest leur intrt pour cet objet vnement particulier.
1 Choisissez Fichier|Nouveau. 2 Slectionnez longlet libell ActiveX. 3 Double-cliquez sur licne Objet vnement COM+.
39-20
Guide du dveloppeur
Dans lexpert vnement, spcifiez le nom de lobjet vnement, le nom de linterface qui dfinit les gestionnaires dvnements et, de manire facultative, une brve description des vnements. Quand vous sortez, lexpert cre un projet contenant une bibliothque de types qui dfinit votre objet vnement et son interface. Utilisez lditeur de bibliothques de types pour dfinir les mthodes de cette interface. Ces mthodes sont les gestionnaires dvnements que les clients implmentent pour rpondre aux vnements. Le projet objet vnement inclut le fichier projet unit _ATL pour importer les modles de classes ATL et lunit _TLB pour dfinir les informations de la bibliothque de types. Il ne contient aucune unit dimplmentation car les objets vnement COM+ nont pas dimplmentation. Limplmentation de linterface est la charge du client. Quand lobjet serveur appelle un objet vnement COM+, COM+ intercepte lappel et le distribue aux clients recenss. Comme les objets vnement COM+ nont pas besoin dobjet implmentation, une fois que vous avez dfini linterface de lobjet dans lditeur de bibliothques de types, il vous suffit de compiler le projet et de linstaller dans COM+ COM+ impose certaines restrictions sur les interfaces des objets vnement. Linterface dfinie dans lditeur de bibliothques de types pour lobjet vnement doit respecter les rgles suivantes : Linterface de lobjet vnement doit driver de IDispatch. Les noms de mthode doivent tre uniques pour toutes les interfaces de lobjet vnement. Les mthodes de linterface de lobjet vnement doivent toutes renvoyer une valeur HRESULT. Le modificateur de toutes les paramtres de mthode doit tre blank.
Les objets dclenchant des vnements COM+ doivent tre, comment les objets vnement mmes, installs dans une application COM+.
Les informations sur le transfert de rfrences dobjets sappliquent uniquement MTS, et pas COM+. Ce mcanisme est requis sous MTS car il est ncessaire de garantir que tous les pointeurs sur des objets sexcutant sous MTS sont routs
39-21
par le biais dintercepteurs. Puisque les intercepteurs sont construits dans COM+, vous navez pas besoin de transmettre des rfrences dobjets. Dans MTS, vous pouvez passer des rfrences un objet (par exemple, pour les utiliser en tant que callback) uniquement par un des moyens suivants : Avec le retour dune interface de cration dun objet, comme CoCreateInstance (ou son quivalent), ITransactionContext.CreateInstance ou IObjectContext.CreateInstance. Avec un appel QueryInterface. Avec une mthode ayant appel SafeRef pour obtenir la rfrence de lobjet. Une rfrence un objet obtenue par un des moyens prcdents est appele rfrence scurise. Les mthodes invoques en utilisant des rfrences scurises sexcuteront toujours dans le contexte convenable. Les appels qui utilisent des rfrences scurises doivent toujours tre transmis lenvironnement dexcution MTS afin quil gre les options de contexte et permette aux objets transactionnels davoir des dures de vie indpendantes des rfrences client. Les rfrences scurises ne sont pas ncessaires avec COM+.
39-22
Guide du dveloppeur
Pour plus de dtails concernant SafeRef, voir la rubrique SafeRef de la documentation MTS.
Callbacks
Les objets peuvent faire des callbacks aux clients et aux autres objets transactionnels. Par exemple, vous pouvez avoir un objet qui cre un autre objet. Lobjet crateur peut transmettre lobjet cr une rfrence lui-mme ; lobjet cr peut ensuite utiliser cette rfrence pour appeler lobjet qui la cr. Si vous choisissez dutiliser les callbacks, tenez compte des restrictions suivantes : Un callback au client de base ou un autre paquet ncessite, sur le client, une scurit au niveau des accs. De plus, le client doit tre un serveur DCOM. Lintroduction de coupe-feux doit bloquer les callbacks vers le client. Le travail effectu par le callback sexcute dans lenvironnement de lobjet qui est appel. Il peut faire partie de la mme transaction, dune transaction diffrente ou daucune transaction. Dans MTS, lobjet crateur doit appeler SafeRef et transmettre la rfrence renvoye lobjet cr en vue de se rappeler lui-mme.
1 Dans lexplorateur MTS ou le gestionnaire de composants COM+, cliquez avec le bouton droit de la souris sur le paquet MTS ou lapplication COM+ dans lequel est install votre objet transactionnel et choisissez Proprits.
39-23
3 Changez le dlai en 0, ce qui arrte le serveur ds quil ny a plus de client servir. 4 Choisissez OK pour enregistrer la configuration.
Remarque
Lors des tests hors de lenvironnement MTS, vous ne devez pas faire de rfrence directe lObjectProperty de TMtsObject. TMtsObject implmente des mthodes, comme SetComplete et SetAbort, dont lappel est scuris lorsque le contexte de lobjet est nil.
1 Si votre systme gre COM+, choisissez Excuter|Installer les objets COM+. Si votre systme ne gre pas COM+ mais que MTS est install, choisissez Excuter|Installer les objets MTS. Si votre systme ne gre ni MTS ni COM+, vous ne verrez pas doption de menu proposant dinstaller les objets transactionnels. 2 Dans la bote de dialogue Installer lobjet, cochez les objets installer. 3 Si vous installez des objets MTS, choisissez le bouton Paquet pour obtenir une liste des paquets MTS dans votre systme. Si vous installez des objets COM+, choisissez le bouton Application. Indiquez le paquet MTS ou lapplication COM+ dans lequel vous installez vos objets. Vous pouvez choisir Dans nouveau paquet ou Dans nouvelle application pour crer un nouveau paquet MTS ou une nouvelle application COM+ dans lequel installer les objets. Choisissez Dans un paquet existant ou Dans une application existante pour installer les objets dans un paquet MTS ou une application COM+ qui existe dj.
39-24
Guide du dveloppeur
4 Choisissez OK pour rafrachir le catalogue, ce qui rend les objets accessibles lors de lexcution.
Les paquets MTS peuvent contenir des composants issus de plusieurs DLL, et des composants issus de la mme DLL peuvent tre installs dans diffrents paquets. Cependant, un mme composant ne peut tre distribu entre plusieurs paquets. De mme, des applications COM+ peuvent contenir des composants issus de plusieurs excutables et diffrents composants dun mme excutable peuvent tre installs dans diffrentes applications COM+.
Remarque
Vous pouvez galement installer lobjet transactionnel en utilisant le gestionnaire de composants COM+ ou lexplorateur MTS. Faites bien attention dans ce cas utiliser les mmes paramtres pour lobjet que ceux apparaissant dans la page COM+ de lditeur de bibliothques de types. Ces paramtres ne sont pas appliqus automatiquement si vous ninstallez pas lobjet depuis lEDI.
39-25
39-26
Guide du dveloppeur
V
PartieV
Partie
Les chapitres de cette partie prsentent les concepts ncessaires la conception et limplmentation de composants personnaliss dans Delphi.
40
Chapitre 40
Chapitre
Ce chapitreest une prsentation gnrale de la conception des composants et du processus dcriture des composants pour les applications Delphi. Vous devez toutefois tre familier de Delphi et de ses composants standard. VCL et CLX Composants et classes Comment crer un composant ? Contenu dun composant ? Cration dun nouveau composant Test des composants non installs
Pour des informations sur linstallation de nouveaux composants, voir Installation de paquets de composants la page 11-6.
VCL et CLX
Les composants de Delphi rsident dans deux hirarchies de classes appeles la bibliothque des composants visuels (Visual Component Library, VCL) et la bibliothque des composants multiplates-formes (Component Library for Cross Platform, CLX). La figure suivante prsente la relation qui existe entre les classes slectionnes qui composent la VCL. La hirarchie CLX est similaire celle de la VCL, mais les contrles Windows sont appels des widgets (par exemple, TWinControl est appel TWidgetControl), et il existe dautres diffrences. Pour plus de dtails sur les hirarchies de classes et les relations dhritage entre classes, voir chapitre 41, Programmation oriente objet et criture des composants. Pour obtenir un aperu des diffrences entre la VCL et la CLX, voir CLX et VCL la page 10-6 et reportez-vous la rfrence en ligne de la CLX pour plus de dtails sur les composants.
40-1
Composants et classes
La classe TComponent est lanctre partag de chaque composant de la VCL et la CLX. TComponent fournit les proprits et les vnements de base ncessaires au fonctionnement dun composant dans Delphi. Les diffrentes branches de la bibliothque offrent dautres possibilits plus spcialises.
Figure 40.1 Hirarchie des classes de la bibliothque de composants visuels
Lorsque vous crez un composant, vous lajoutez la VCL ou la CLX en drivant une nouvelle classe de lun des types de classes existant dans la hirarchie.
Composants et classes
Comme les composants sont des classes, les crateurs de composants manipulent les objets un niveau diffrent de celui des dveloppeurs dapplications. La cration de nouveaux composants ncessite de driver de nouvelles classes. Brivement, il existe deux diffrences principales entre la cration des composants et leur utilisation dans des applications. Pour la cration de composants, Vous avez accs des parties de la classe qui sont inaccessibles aux programmeurs dapplications. Vous ajoutez de nouvelles parties (des proprits, par exemple) aux composants. A cause de ces diffrences, il faut prendre en compte un plus grand nombre de conventions, et rflchir la manire dont les dveloppeurs dapplications vont utiliser les composants.
40-2
Guide du dveloppeur
Le tableau suivant prsente les diffrents types de composants et les classes que vous utiliserez comme point de dpart pour chacun deux.
Tableau 40.1 Pour
Modifier un composant existant
Crer un contrle fentr (ou widget CLX) Crer un contrle graphique Sous-classer un contrle Crer un composant non visuel
Vous pouvez aussi driver des classes qui ne sont pas des composants et ne peuvent pas tre manipules dans une fiche. Delphi inclut de nombreuses classes de ce type, telles que TRegIniFile et TFont.
40-3
TCustomListBox, qui implmente toutes les proprits des botes liste mais ne les rend pas toutes publiques. En drivant un composant partir de lune des classes abstraites telles que TCustomListBox, vous rendez publiques uniquement les proprits que vous souhaitez mettre disposition dans votre composant et vous laissez les autres protges. Le chapitre 42, Cration de proprits, explique la publication des proprits hrites. Le chapitre 48, Modification dun composant existant, et le chapitre 50, Personnalisation dune grille, montrent des exemples de modification de contrles existants.
40-4
Guide du dveloppeur
Le chapitre 49, Cration dun composant graphique, montre un exemple de cration dun contrle graphique.
40-5
Proprits
Les proprits donnent au dveloppeur dapplications lillusion de dfinir ou de lire la valeur dune variable, tout en permettant au concepteur de composants de dissimuler la structure de donnes sous-jacente ou de dfinir un traitement spcial lorsque la valeur est accde.
40-6
Guide du dveloppeur
Lutilisation des proprits prsente plusieurs avantages : Les proprits sont disponibles au moment de la conception. Le dveloppeur dapplications peut dfinir ou modifier les valeurs initiales des proprits sans crire de code. Les proprits peuvent contrler les valeurs ou les formats au moment o le dveloppeur les dfinit. La validation de la saisie pendant la conception empche de commettre des erreurs. Le composant peut construire les valeurs appropries la demande. Lerreur de programmation la plus frquente est de rfrencer une variable qui na t initialise. En reprsentant les donnes par une proprit, vous tes s r quune valeur leur est toujours disponible sur demande. Les proprits vous permettent de cacher les donnes sous une interface simple et cohrente. Vous pouvez modifier la faon dont les informations sont structures dans une proprit sans que ce changement ne soit peru par les dveloppeurs dapplications. Le chapitre 42, Cration de proprits, explique comment ajouter des proprits vos composants.
Evnements
Un vnement est une proprit spciale qui appelle du code, pendant lexcution, en rponse une saisie ou une autre opration. Les vnements permettent aux dveloppeurs dassocier des blocs de code spcifiques des actions sp cifiques, telles des manipulations de la souris ou des frappes au clavier. Le code qui sexcute lorsquun vnement survient est appel le gestionnaire de lvnement. Les vnements permettent aux dveloppeurs dapplications de spcifier des rponses diffrentes en fonction des actions possibles sans avoir crer de nouveaux composants. Le chapitre 43, Cration dvnements, explique comment implmenter des vnements standard et comment en dfinir de nouveaux.
Mthodes
Les mthodes de classes sont des fonctions et procdures qui oprent sur une classe plutt que sur des instances particulires de cette classe. Par exemple, les mthodes constructeur de composants (Create) sont toutes des mthodes de classes. Les mthodes de composants sont des procdures et fonctions qui oprent sur les instances des composants elles-mmes. Les dveloppeurs dapplications utilisent des mthodes pour que les composants effectuent des actions particulires ou renvoient des valeurs non contenues par des proprits. Comme elles ncessitent une excution de code, les mthodes ne sont disponibles quau moment de lexcution. Elles sont utiles pour plusieurs raisons : Les mthodes encapsulent la fonctionnalit dun composant dans lobjet mme o rsident les donnes.
40-7
Les mthodes peuvent cacher des procdures compliques sous une interface simple et cohrente. Un dveloppeur dapplications peut appeler la mthode AlignControls dun composant sans savoir comment elle fonctionne ni si elle diffre de la mthode AlignControls dun autre composant. Les mthodes permettent de mettre jour plusieurs proprits avec un seul appel. Le chapitre 44, Cration de mthodes, explique comment ajouter des mthodes vos composants.
40-8
Guide du dveloppeur
Recensement
Avant de pouvoir installer vos composants dans lEDI de Delphi, vous devez les recenser. Le recensement indique Delphi o placer le composant sur la palette des composants. Vous pouvez aussi personnaliser la manire dont Delphi stocke les composants dans le fichier fiche. Le recensement est dcrit dans le chapitre 47, Accessibilit des composants au moment de la conception.
1 Cration dune unit pour le nouveau composant. 2 Drivation du composant partir dun type de composant existant. 3 Ajout de proprits, mthodes et vnements. 4 Recensement de votre composant dans Delphi. 5 Cration dun fichier daide pour le composant et ses proprits, mthodes et vnements. 6 Cration dun paquet (bibliothque dynamiquement lie sp ciale) pour pouvoir installer le composant dans lEDI de Delphi.
Lorsque vous avez termin, le composant complet est constitu des fichiers suivants : Un Un Un Un Un fichier fichier fichier fichier fichier paquet (.BPL) ou un fichier collection de paquets (.DPC) paquet compil (.DCP) unit compile (.DCU) bitmap pour la palette (.DCR) daide (.HLP)
La cration dun fichier daide lattention des utilisateurs de composants est facultative.
40-9
Les chapitres du reste de la partie V expliquent tous les aspects de la construction des composants et offrent des exemples complets dcriture de plusieurs sortes de composants.
Lexpert composant excute les oprations que vous excuteriez pour crer manuellement un composant : Cration dune unit Drivation du composant. Recensement du composant. Lexpert composant ne peut pas ajouter de composant une unit existante. Cela ne peut se faire que manuellement. Pour ouvrir lexpert composant, choisissez lune de ces deux mthodes : Choisissez Composant|Nouveau composant. Choisissez Fichier|Nouveau|Autre et double-cliquez sur Composant
Figure 40.2 Lexpert composant
1 Dans Type anctre, spcifiez la classe partir de laquelle vous drivez le nouveau composant.
Remarque
Dans la liste droulante, de nombreux composants sont prsents deux fois avec des noms dunit diffrents, un pour la VCL et lautre pour la CLX. Les units sp cifiques la CLX commencent par Q (telles que QGraphics au lieu de Graphics). Veillez driver partir du bon composant.
40-10
Guide du dveloppeur
2 Dans Nom de classe, spcifiez le nom de classe de votre nouveau composant. 3 Dans Page de palette, spcifiez la page de la palette dans laquelle vous voulez installer le composant. 4 Dans Nom de fichier unit, spcifiez le nom de lunit dans laquelle vous voulez dclarer la classe du composant. 5 Si lunit nest pas dans le chemin de recherche, modifiez ce dernier.
Pour placer un composant dans un paquet nouveau ou non, cliquez sur Composant|Installer et spcifiez le paquet dans la bote de dialogue qui apparat.
Attention
Si vous drivez un composant dune classe de la VCL ou de la CLX dont le nom commence par custom (comme TCustomControl), ne tentez pas de le placer sur une fiche avant davoir surcharg toute mthode abstraite du composant initial. Delphi ne peut pas crer dinstance dune classe ayant des proprits ou des mthodes abstraites. Pour voir le code source de votre unit, cliquez sur Voir lunit (si lexpert composant est dj ferm, ouvrez le fichier unit dans lditeur de code en slectionnant Fichier|Ouvrir). Delphi cre une nouvelle unit contenant la dclaration de classe et la procdure Register, et ajoute une clause uses qui comprend toutes les units Delphi standard. Lunit ressemble cela dans le cas dune drivation partir de TCustomControl dans lunit Controls :
unit MyControl; interface uses Windows, Messages, SysUtils, Classes, Controls; type TMyControl = class(TCustomControl) private { dclarations prives } protected { dclarations protges } public { dclarations publiques } published { dclarations publies } end; procedure Register; implementation procedure Register; begin RegisterComponents(Samples, [TMyControl]); end; end.
40-11
Dans le cas dune drivation partir de TCustomControl dans lunit QControls, la seule diffrence est la clause uses qui ressemble ceci :
uses Windows, Messages, SysUtils, Classes, QControls;
Aux endroits o la CLX utilise des units distinctes, celles-ci sont remplaces par des units de mme nom prfixes par un Q ; Controls est remplac par QControls.
Lorsque vous ajoutez un composant une unit, vrifiez que cette unit ne contient que du code de composant. Lajout dun code de composant une unit qui contient, par exemple, une fiche, provoquera des erreurs dans la palette des composants. Une fois lunit, nouvelle ou existante, dfinie pour le composant, vous pouvez driver la classe composant.
Drivation du composant
Chaque composant est une classe drive de TComponent, de lun de ses descendants plus spcialiss (tels que TControl ou TGraphicControl) ou dune classe composant existante. Comment crer un composant ? la page 40-3 indique les classes driver pour obtenir les diffrentes sortes de composants. La drivation des classes est explique plus en dtail dans la section Dfinition de nouvelles classes la page 41-1.
40-12
Guide du dveloppeur
Pour driver un composant, ajoutez une dclaration de type objet la partie interface de lunit qui contiendra le composant. Une classe composant simple est un composant non visuel descendant directement de TComponent. Pour crer une classe composant simple, ajoutez la dclaration de classe suivante la partie interface de votre unit composant :
type TNewComponent = class(TComponent) end;
Pour linstant, le nouveau composant ne fait rien de plus que TComponent. Cest juste un squelette sur lequel vous allez btir votre nouveau composant.
Recensement du composant
Le recensement est une opration simple qui indique Delphi les composants ajouter la bibliothque des composants et les pages de la palette sur lesquelles ils doivent apparatre. Pour une prsentation plus dtaille du processus de recensement, voir chapitre 47, Accessibilit des composants au moment de la conception. Pour recenser un composant,
1 Ajoutez une procdure nomme Register la partie interface de lunit du composant. Register na pas de paramtres, la dclaration est donc trs simple :
procedure Register;
Si vous ajoutez un composant une unit qui contient dj des composants, elle doit dj avoir la procdure Register dclare, afin que vous nayiez pas changer la dclaration.
2 Ecrivez la procdureRegister dans la partie implmentation de lunit, en appelant RegisterComponents pour chaque composant que vous voulez recenser. RegisterComponents est une procdure qui prend deux paramtres : le nom dune page de palette de composants et un ensemble de types de composants. Si vous ajoutez un composant un recensement existant, vous pouvez soit ajouter le nouveau composant lensemble dans linstruction existante, soit ajouter une nouvelle instruction qui appelle RegisterComponents.
Pour recenser un composant appel TMyControl et le placer sur la page Exemples de la palette, vous devrez ajouter la procdure Register suivante lunit contenant la dclaration de TMyControl :
procedure Register; begin RegisterComponents(Samples, [TNewControl]); end;
Cette procdure Register place TMyControl sur la page Exemples de la palette des composants.
40-13
Une fois le composant recens, vous pouvez le compiler dans un paquet (voir chapitre 47, Accessibilit des composants au moment de la conception) et linstaller sur la palette des composants.
1 Ajoutez le nom de lunit du composant la clause uses de lunit fiche. 2 Ajoutez un champ objet la fiche pour reprsenter le composant.
Il sagit l dune des diffrences principales entre votre faon dajouter des composants et celle utilise par Delphi. Vous ajoutez le champ objet la partie publique la fin de la dclaration de type de fiche. Delphi lajouterait audessus, dans la partie de la dclaration de type quil gre. Il ne faut jamais ajouter de champs la partie gre par Delphi de la dclaration de type de fiche. Les lments de cette partie correspondent ceux stocks dans le fichier fiche. Lajout de noms de composants qui nexistent pas sur la fiche peut rendre invalide le fichier de la fiche.
3 Attachez un gestionnaire lvnement OnCreate de la fiche. 4 Construisez le composant dans le gestionnaire OnCreate de la fiche.
Lors de lappel au constructeur du composant, vous devez transmettre un paramtre spcifiant le propritaire du composant (le composant charg de la destruction du composant au moment opportun). Il faut pratiquement toujours transmettre Self comme propritaire. Dans une mthode, Self reprsente une rfrence sur lobjet contenant la mthode. Dans ce cas, dans le gestionnaire OnCreate de la fiche, Self reprsente la fiche.
40-14
Guide du dveloppeur
Attention
Si votre composant nest pas un contrle (cest--dire si TControl nest pas un de ses anctres), passez cette tape. Si vous dfinissez accidentellement la proprit Parent de la fiche ( la place de celle du composant) la valeur Self, vous pouvez provoquer un problme du systme dexploitation.
40-15
Le test de vos composants aprs linstallation vous permet de dboguer le composant qui gnre seulement des exceptions la conception lorquil est dpos sur une fiche. Testez un composant install en excutant une seconde instance de Delphi :
1 A partir de lenvironnement de dveloppement intgr de Delphi, slectionnez Projet|Options|et sur la page Rpertoires/Conditions, affectez la zone Sources de dbogage le fichier source du composant. 2 Slectionnez ensuite Outils| Options du dbogueur. Sur la page Exceptions du langage, activez les exceptions suivre. 3 Ouvrez le fichier source du composant et dfinissez des points darrt. 4 Slectionnez Excuter|Paramtres et affectez au champ Application hte le nom et lemplacement du fichier excutable de Delphi. 5 Dans la bote de dialogue Paramtres dexcution, cliquez sur le bouton Charger pour dmarrer une seconde instance de Delphi. 6 Dposez ensuite les composants tester sur la fiche, ce qui devrait provoquer larrt sur les points darrt dfinis dans le source.
40-16
Guide du dveloppeur
41
Chapitre 41
Chapitre
Si vous avez crit des applications avec Delphi, vous savez dj quune classe contient la fois du texte et du code, et que les classes sont manipulables aussi bien au moment de la conception qu lexcution. Cest ainsi que vous tes devenu utilisateur de composants. Lorsque vous crez de nouveaux composants, votre approche des classes nest pas celle du dveloppeur dapplications standard. Vous essayez de cacher les travaux internes du composant aux dveloppeurs qui vont les utiliser. En choisissant les anctres appropris vos composants, en concevant des interfaces qui exposent seulement les proprits et les mthodes dont les dveloppeurs ont besoin, en suivant les autres conseils de ce chapitre, vous pourrez crer des composants rutilisables parfaitement maniables. Avant de commencer crer des composants, vous devez comprendre les sujets suivants qui se rapportent la programmation oriente objet (OOP) : Dfinition de nouvelles classes Anctres, descendants et hirarchies des classes Contrle des accs Rpartition des mthodes Membres abstraits dune classe Classes et pointeurs
41-1
Une classe est dabord un type. Comme programmeur, vous travaillez sans arrt avec les types et les instances, mme si vous ne parlez pas en ces termes. Par exemple, vous crez des variables dun certain type, par exemple Integer. Les classes sont habituellement plus complexes que de simples types de donnes, mais elles fonctionnent de la mme faon : en affectant diffrentes valeurs aux instances dun mme type, vous effectuez diffrentes tches. Par exemple, il est courant de crer une fiche contenant deux boutons appels OK et Annuler. Chacun correspond une instance de la classe TButton, mais, en attribuant une valeur diffrente leurs proprits Caption et diffrents gestionnaires leurs vnements OnClick, vous faites se comporter diffremment les deux instances.
Modifier les valeurs par dfaut dune classe pour viter les rptitions
Dans tout programme, les rptitions superflues sont proscrire. Si vous vous surprenez rpter les mmes lignes de code, vous serez sans doute amen les placer part dans une sous-routine ou fonction, ou encore construire une bibliothque de routines utilisables par un autre programme. Le mme raisonnement sapplique aux composants. Si vous modifiez frquemment les mmes proprits ou si vous appelez les mmes mthodes, vous crerez sans doute un nouveau composant qui effectue ces tches par dfaut. Par exemple, supposons qu chaque cration dune nouvelle application, vous ajoutez une bote de dialogue accomplissant une fonction dtermine. Bien quil soit simple de recrer chaque fois cette bote de dialogue, cest superflu. Vous pouvez concevoir la bote de dialogue une fois pour toute, dfinir ses proprits puis installer le composant enveloppe associ dans la palette des composants. En faisant du dialogue un composant rutilisable, non seulement vous liminez une tche rptitive mais renforcez la standardisation et minimisez les erreurs qui peuvent tre occasionnes par chaque nouvelle cration de la bote de dialogue. Le chapitre 48, Modification dun composant existant, montre un exemple qui modifie les proprits par dfaut dun composant.
Remarque
Si vous voulez ne modifier que les proprits publies dun composant existant ou enregistrer des gestionnaires dvnement spcifiques un composant ou un groupe de composants, vous pourrez accomplir ceci plus facilement en crant un modle de composant.
41-2
Guide du dveloppeur
Une dclaration de des proprits, des dclaration comme dpart pour lajout
composant acheve comprend gnralement la dclaration vnements et des mthodes avant le end. Mais une celle ci-dessus est aussi admise et reprsente un point de de fonctionnalits votre composant.
41-3
partir de quelle classe vous le drivez de faon ce quil reoive en hritage les lments que vous souhaitez. Vous devez galement connatre toutes les fonctionnalits dont hrite votre composant de manire les exploiter sans avoir les recrer vous-mme. La classe partir de laquelle vous effectuez la drivation est lanctre immdiat. Chaque composant hrite de son anctre immdiat, et lui-mme de son anctre immdiat. Toutes les classes dont hrite un composant sont les anctres de ce composant ; le composant est un descendant de ces anctres. Lensemble des relations anctre-descendant de lapplication constitue les hirarchies des classes. Dans cette hirarchie, chaque gnration contient plus que ses anctres puisquune classe hrite de tout ce que contiennent ses anctres et ajoute de nouvelles proprits et de nouvelles mthodes, ou redfinit celles qui existent. Si vous ne spcifiez aucun anctre immdiat, Delphi drive votre composant partir de lanctre par dfaut, TObject. TObject est le dernier anctre de toutes les classes de la hirarchie dobjets. La rgle gnrale du choix de lobjet de dpart de la drivation est simple : prenez lobjet qui contient le plus possible ce que vous voulez inclure dans votre nouvel objet, mais qui ne comprend rien de ce que vous ne voulez pas dans le nouvel objet. Vous pouvez toujours ajouter des choses vos objets, mais vous ne pouvez pas en retirer.
Utilis pour
Masquer les dtails dimplmentation. Dfinition de linterface avec le concepteur des composants. Dfinition de linterface dexcution. Automatisation OLE seulement.
public automated
published
41-4
Guide du dveloppeur
Dclarez les membres en private si vous voulez quils ne soient disponibles que dans la classe o ils ont t dfinis. Dclarez-les en protected si vous voulez quils ne soient disponibles que dans cette classe et ses descendants. Souvenezvous que si un membre est disponible nimporte o dans un fichier unit, il est disponible partout dans ce fichier. Ainsi, si vous dfinissez deux classes dans la mme unit, elles pourront accder lune ou lautre des mthodes prives. Et si vous drivez une classe dans une unit diffrente de son anctre, toutes les classes de la nouvelle unit pourront accder aux mthodes protges de lanctre.
interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, HideInfo; { utilise lunit avec TSecretForm } type TTestForm = class(TForm) procedure FormCreate(Sender: TObject); end; var
41-5
TestForm: TTestForm; implementation procedure TTestForm.FormCreate(Sender: TObject); begin SecretForm.FSecretCode := 13; end; end.
{ fin de lunit}
Bien quun programme utilisant lunit HideInfo puisse utiliser des objets de type TSecretForm, il ne peut pas accder la donne membre FSecretCode dans aucun de ces objets.
Une erreur commune consiste essayer daccder aux mthodes protges dun gestionnaire dvnement. Les gestionnaires dvnements sont gnralement des mthodes de la fiche, et non du composant qui reoit lvnement. Par consquent, ils naccdent pas aux mthodes protges du composant ( moins que le composant ne soit dclar dans la mme unit que la fiche).
41-6
Guide du dveloppeur
function GetTempFahrenheit: Integer; public property TempCelsius: Integer read FTempCelsius; { les proprits sont publiques } property TempFahrenheit: Integer read GetTempFahrenheit; end; function TSampleComponent.GetTempFahrenheit: Integer; begin Result := FTempCelsius * 9 div 5 + 32; end;
41-7
Mthodes statiques
Toutes les mthodes sont statiques moins que vous ne les dclariez spcifiquement autrement. Les mthodes statiques fonctionnent comme des procdures ou des fonctions normales. Le compilateur dtermine ladresse exacte de la mthode et la lie au moment de la compilation. Le premier avantage des mthodes statiques est quelles sont rparties trs rapidement. Comme le compilateur peut dterminer ladresse exacte de la mthode, il la lie directement. Les mthodes virtuelles et dynamiques, au contraire, utilisent des moyens indirects pour donner ladresse de leurs mthodes lors de lexcution, ce qui prend davantage de temps. Une mthode statique ne change pas lorsquelle est hrite dune classe descendante. Si vous dclarez une classe comprenant une mthode statique, puis drivez une nouvelle classe partir de celle-ci, la classe drive partage exactement la mme mthode la mme adresse. Cela signifie que vous ne pouvez pas redfinir des mthodes statiques. Une mthode statique ralise toujours la mme chose quelle que soit la classe qui y est appele. Si vous dclarez une mthode dans une classe drive ayant le mme nom quune mthode statique dans la classe anctre, la nouvelle mthode remplace simplement celle hrite dans la classe drive.
Mthodes virtuelles
Les mthodes virtuelles emploient un mcanisme de rpartition plus compliqu et plus souple que les mthodes statiques. Une mthode virtuelle peut tre redfinie dans des classes descendantes, mais est toujours appele dans la classe anctre. Ladresse dune mthode virtuelle nest pas dtermine lors de la
41-8
Guide du dveloppeur
compilation ; la place, lobjet o la mthode est dfinie donne ladresse lors de lexcution. Pour quune mthode soit virtuelle, ajoutez la directive virtual aprs la dclaration de la mthode. La directive virtual cre une entre dans le tableau de mthode virtuelle, de lobjet, ou VMT, qui contient les adresses de toutes les mthodes virtuelles dun type objet. Lorsque vous drivez une nouvelle classe dune classe existante, la nouvelle classe a son propre VMT, qui comprend toutes les entres provenant du VMT de lanctre plus toutes les mthodes virtuelles supplmentaires dclares dans la nouvelle classe.
Mthodes dynamiques
Les mthodes dynamiques sont des mthodes virtuelles avec un mcanisme de rpartition lgrement diffrent. Comme les mthodes dynamiques nont pas dentres dans le tableau de mthode virtuelle de lobjet, elles peuvent rduire la taille de la mmoire consomme par les objets. Cependant les mthodes de rpartition dynamiques sont quelque peu plus lentes que les mthodes de rpartition virtuelles normales. Si une mthode est frquemment appele, ou si
41-9
son excution ncessite un temps court, vous devrez probablement la dclarer virtuelle plutt que dynamique. Les objets doivent stocker les adresses de leurs mthodes dynamiques. Mais plutt que de recevoir les entres dans le tableau de mthode virtuelle, les mthodes dynamiques sont indiques sparment. La liste des mthodes dynamiques contient des entres uniquement pour les mthodes introduites ou surcharges par une classe particulire (le tableau de mthode virtuelle, linverse, comprend toutes les mthodes virtuelles de lobjet, la fois hrites et introduites). Les mthodes dynamiques hrites sont rparties en cherchant chaque liste de mthode dynamique de lanctre, en allant en arrire dans larborescence de lhritage. Pour rendre une mthode dynamique, ajoutez la directive dynamic aprs la dclaration de mthode.
Classes et pointeurs
Chaque classe (et par consquent chaque composant) est en fait un pointeur. Le compilateur drfrence automatiquement les pointeurs de classe votre place, aussi navez-vous gnralement pas besoin de vous poser ces questions. Le statut des classes en tant que pointeurs devient important lorsque vous passez une classe comme paramtre. En gnral, vous transmettrez les classes par valeur plutt que par rfrence. Car les classes sont dj des pointeurs, cest--dire des rfrences ; transmettre une classe par rfrence serait transmettre une rfrence une rfrence.
41-10
Guide du dveloppeur
42
Chapitre 42
Chapitre
Cration de proprits
Les proprits sont la partie la plus visible des composants. Le dveloppeur dapplications a la possibilit de les voir et de les manipuler au moment de la conception et dispose dun retour immdiat au fur et mesure que ragissent les composants dans le concepteur de fiches. Les proprits conues correctement facilitent lutilisation de vos composants par dautres personnes et leur maintenance par vous-mme. Pour utiliser de faon optimale les proprits de vos composants, vous devez connatre les points suivants : Pourquoi crer des proprits ? Types de proprits Publication des proprits hrites Dfinition des proprits Cration de proprits tableau Stockage et chargement des proprits
Cration de proprits
42-1
Types de proprits
des valeurs dans linspecteur dobjets. Linspecteur dobjets valide les affectations des valeurs aux proprits ds quelles sont effectues. Les proprits peuvent masquer les dtails de limplmentation. Par exemple, des donnes stockes de faon interne sous une forme crypte peuvent apparatre non cryptes en tant que la valeur dune proprit ; bien que la valeur puisse tre un simple nombre, le composant peut rechercher cette valeur dans une base de donnes ou effectuer des calculs complexes afin de la rcuprer. Les proprits permettent dassocier des oprations complexes une simple affectation ; ce qui apparat comme laffectation dun champ correspond en fait un appel de mthode et cette dernire peut accomplir peu prs nimporte quelle tche. Les proprits peuvent tre virtuelles. Ce qui parat tre une seule proprit pour le dveloppeur dapplications peut tre implment de manire diffrente dans des composants diffrents. Un exemple simple est la proprit Top que tous les contrles possdent. Lattribution dune nouvelle valeur Top na pas pour seul effet de modifier une valeur mmorise ; elle provoque aussi le dplacement et le raffichage du contrle. Les effets de la dfinition dune proprit ne se limitent pas ncessairement un composant unique ; par exemple, donner la valeur True la proprit Down dun turbobouton a pour effet dattribuer la valeur False tous les autres turboboutons du mme groupe.
Types de proprits
Une proprit peut avoir un type quelconque. Les divers types sont affichs de manire diffrente dans linspecteur dobjets, ce qui valide laffectation des proprits effectues au moment de la conception.
Tableau 42.1
Simple
Type de proprit
Enumr
Ensemble
42-2
Guide du dveloppeur
Tableau 42.1
Objet
Affichage des proprits dans linspecteur dobjets (suite) Traitement de linspecteur d objets
Les proprits qui sont elles-mmes des classes ont souvent leur propre diteur de proprits, qui est spcifi dans la procdure de recensement du composant. Si la classe dune proprit a ses propres proprits publies (published), linspecteur dobjets permet au dveloppeur dtendre la liste (en double-cliquant) afin dinclure ces proprits et de les modifier individuellement. Les proprits doivent descendre de TPersistent. Les proprits tableau doivent disposer dun diteur de proprits spcifique. Linspecteur dobjets ne dispose daucune fonction intgre permettant de modifier les proprits de ce type. Vous pouvez spcifier un diteur de proprits lorsque vous recensez vos composants.
Type de proprit
Tableau
Lorsque vous redclarez une proprit, vous spcifiez uniquement le nom de la proprit, non le type ni les autres informations dcrites ci-dessous dans D finition des proprits. Vous pouvez aussi dclarer de nouvelles valeurs par dfaut et spcifier si la proprit est ou non stocke. Les redclarations peuvent augmenter la visibilit dune proprit, mais pas la rduire. Vous pouvez ainsi rendre une proprit protge publique, mais vous ne pouvez pas masquer une proprit publique en la redclarant protge.
Cration de proprits
42-3
42-4
Guide du dveloppeur
Les identificateurs de ces champs sont composs de la lettre F suivie du nom de la proprit. Par exemple, la donne brute de la proprit Width dfinie pour TControl est stocke dans un champ appel FWidth. Le principe qui sous-tend ces conventions est le suivant : seules les mthodes dimplmentation dune proprit doivent pouvoir accder aux donnes associes cette proprit. Si une mthode ou une autre proprit a besoin de changer ces donnes, elle doit le faire via la proprit et non directement par un accs aux donnes stockes. Cela garantit que limplmentation dune proprit hrite puisse tre modifie sans invalider les composants drivs.
Accs direct
Laccs direct est le moyen le plus simple daccder aux donnes dune proprit. Autrement dit, les parties read et write de la dclaration dune proprit spcifient que laffectation ou la lecture de la valeur de la proprit seffectue directement dans le champ de stockage interne sans appel une mthode daccs. Laccs direct est utile lorsque vous voulez rendre une proprit accessible dans linspecteur dobjets, mais que vous ne voulez pas que le changement de sa valeur dclenche un processus immdiatement. En gnral, vous dfinirez un accs direct pour la partie read dune dclaration de proprit et utiliserez une mthode daccs pour la partie write. Cela permet de mettre jour ltat du composant lorsque la valeur de la proprit change. La dclaration de type composant suivante montre une proprit qui utilise laccs direct pour les parties read et write.
type TSampleComponent = class(TComponent) private { le stockage interne est priv } FMyProperty: Boolean; { dclare la donne membre pour contenir la valeur } published { rend la proprit disponible la conception } property MyProperty: Boolean read FMyProperty write FMyProperty; end;
Mthodes daccs
Vous pouvez spcifier une mthode daccs plutt quun champ dans les parties read et write dune dclaration de proprit. Les mthodes daccs doivent tre protected, et sont habituellement dclares comme virtual ; cela autorise les composants descendants surcharger limplmentation de la proprit. Evitez de rendre publiques les mthodes daccs. Les conserver protected vous prmunit contre toute modification accidentelle dune proprit par un dveloppeur dapplications qui appellerait ces mthodes. Voici une classe qui dclare trois proprits en utilisant le spcificateur dindex, qui autorise aux trois proprits davoir les mmes mthodes daccs en lecture et en criture :
type TSampleCalendar = class(TCustomGrid)
Cration de proprits
42-5
public property Day: Integer index 3 read GetDateElement write SetDateElement; property Month: Integer index 2 read GetDateElement write SetDateElement; property Year: Integer index 1 read GetDateElement write SetDateElement; private function GetDateElement(Index: Integer): Integer; { remarquez le paramtre Index } procedure SetDateElement(Index: Integer; Value: Integer);
Comme chaque lment de la date (day, month et year) est un int et comme la dfinition de chacun requiert le codage de la date lorsquelle est dfinie, le code vite la duplication en partageant les mthodes de lecture et dcriture pour les trois proprits. Vous navez besoin que dune seule mthode pour lire un lment date et une autre pour crire llment date. Voici la mthode read qui obtient llment date :
function TSampleCalendar.GetDateElement(Index: Integer): Integer; var AYear, AMonth, ADay: Word; begin DecodeDate(FDate, AYear, AMonth, ADay); { dcompose la date code en lments } case Index of 1: Result := AYear; 2: Result := AMonth; 3: Result := ADay; else Result := -1; end; end;
} } }
} }
Mthode read
La mthode read dune proprit est une fonction qui naccepte aucun paramtre (sauf pour ce qui est mentionn ci-aprs) et renvoie une valeur du mme type que la proprit. Par convention, le nom de la fonction est Get suivi du nom de la proprit. Par exemple, la mthode read pour une proprit intitule Count
42-6
Guide du dveloppeur
serait GetCount . La mthode read manipule les donnes internes afin de gnrer une valeur de la proprit respectant le type demand. Les seules exceptions la rgle aucun paramtre sont les proprits tableau et les proprits qui utilisent un spcificateur dindex (voir Cration de proprits tableau la page 42-8), pour lesquelles cet index est transmis comme paramtre. Utilisez des spcificateurs dindex pour crer une mthode read unique partage par plusieurs proprits. Pour plus dinformations sur les spcificateurs dindex, consultez le Guide du langage Pascal Objet. Si vous ne dclarez aucune mthode read, la proprit fonctionne uniquement en criture. Les proprits fonctionnant en criture uniquement sont trs rares.
Mthode write
La mthode write dune proprit est une procdure acceptant un seul paramtre (sauf pour ce qui est mentionn ci-aprs) du mme type que la proprit. Le paramtre peut tre transmis par rfrence ou par valeur et peut porter le nom de votre choix. Par convention, le nom de la mthode write est Set suivi du nom de la proprit. Par exemple, la mthode write dune proprit intitule Count serait SetCount. La valeur transmise en paramtre devient la nouvelle valeur de la proprit ; la mthode write doit accomplir les manipulations ncessaires pour placer les donnes concernes lemplacement de stockage interne de la proprit. Les seules exceptions la rgle paramtre unique sont les proprits tableau et les proprits qui utilisent un spcificateur dindex, pour lesquelles cet index est transmis comme second paramtre. Utilisez des spcificateurs dindex pour crer une mthode read unique partage par plusieurs proprits. Pour plus dinformations sur les spcificateurs dindex, consultez le Guide du langage Pascal Objet. Si vous ne dclarez aucune mthode write, la proprit fonctionne uniquement en lecture. Les mthodes write testent normalement si une nouvelle valeur diffre de la valeur actuelle avant de modifier la proprit. Par exemple, voici une mthode write simple dune proprit de type entier appele Count stockant sa valeur courante dans un champ appel FCount .
procedure TMyComponent.SetCount(Value: Integer); begin if Value <> FCount then begin FCount := Value; Update; end; end;
Cration de proprits
42-7
Pour spcifier une valeur par dfaut pour une proprit, ajoutez la directive default la dclaration (ou la redclaration) de la proprit, suivie par la valeur par dfaut. Par exemple,
property Cool Boolean read GetCool write SetCool default True; Remarque
Dclarer une valeur par dfaut pour une proprit na pas pour effet de dfinir cette proprit par cette valeur. La mthode constructeur du composant doit initialiser la valeur des proprits lorsque cest ncessaire. Toutefois, comme les objets initialisent toujours leurs champs 0, il nest pas ncessaire que le constructeur initialise les proprits entires 0, les proprits chanes null ni les proprits boolennes False.
Lorsque vous dclarez une proprit pour la premire fois, vous ntes pas oblig de spcifier nodefault car, dans ce cas, labsence de valeur par dfaut a la mme signification. Voici la dclaration dun composant qui comprend une proprit boolenne unique appele IsTrue dont la valeur par dfaut est True. La dclaration cidessous (dans la section implmentation de lunit) reprsente le constructeur qui initialise la proprit.
type TSampleComponent = class(TComponent) private FIsTrue: Boolean; public constructor Create(AOwner: TComponent); override; published property IsTrue: Boolean read FIsTrue write FIsTrue default True; end; constructor TSampleComponent.Create(AOwner: TComponent); begin inherited Create(AOwner); { appelle le constructeur hrit } FIsTrue := True; { dfinit la valeur par dfaut } end;
42-8
Guide du dveloppeur
lment particulier (une chane) dans un ensemble plus large de donnes (le texte du mmo). Les proprits tableau sont dclares comme les autres proprits. Les seules diffrences sont les suivantes : La dclaration de la proprit doit comprendre un ou plusieurs index ayant chacun un type dfini. Les index peuvent avoir nimporte quel type. Les parties read et write de la dclaration de la proprit, lorsquelles sont spcifies, doivent tre des mthodes. Il ne peut sagir de champs. Les mthodes read et write dune proprit tableau acceptent des paramtres supplmentaires correspondant aux index. Les paramtres doivent respecter lordre et le type des index spcifis dans la dclaration. Bien quils se ressemblent, il existe quelques diffrences importantes entre les tableaux et les proprits tableau. Contrairement aux indices dun tableau, lindex dune proprit tableau nest pas obligatoirement de type entier. Par exemple, vous pouvez indexer une proprit en utilisant une chane. En outre, vous ne pouvez rfrencer quun seul lment dune proprit et non une plage dlments. Lexemple suivant est la dclaration dune proprit renvoyant une chane en fonction de la valeur dun index de type entier.
type TDemoComponent = class(TComponent) private function GetNumberName(Index: Integer): string; public property NumberName[Index: Integer]: string read GetNumberName; end; function TDemoComponent.GetNumberName(Index: Integer): string; begin Result := Inconnu; case Index of -MaxInt..-1: Result := Ngatif; 0: Result := Zro; 1..100: Result := Petit; 101..MaxInt: Result := Grand; end; end;
Cration de proprits
42-9
Les sous-composants peuvent reprsenter tout objet persistant (tout descendant de TPersistent). A linverse des composants distincts qui peuvent tre affects comme valeur dune proprit, les proprits publies des sous-composants sont enregistres avec le composant qui les cre. Pour que cela fonctionne, les conditions suivantes doivent tre satisfaites : Le propritaire (Owner) du sous-composant doit tre le composant qui le cre et lutilise comme valeur dune proprit publie. Pour les sous-composants qui sont des descendants de TComponent, vous pouvez raliser cela en dfinissant la proprit Owner du sous-composant. Pour les autres souscomposants, vous devez redfinir la mthode GetOwner de lobjet persistant afin quelle renvoie le composant de cration. Si le sous-composant est un descendant de TComponent, il doit indiquer quil est un sous-composant en appelant la mthode SetSubComponent. Gnralement, cet appel est effectu par le propritaire quand il cre le souscomposant ou par le constructeur du sous-composant. Gnralement, les proprits dont les valeurs sont des sous-composants sont en lecture seule. Si vous permettez la modification dune proprit dont la valeur est un sous-composant, la mthode de dfinition de proprit doit librer le sous-composant quand un autre composant est affect la proprit. En outre, le composant r-instancie souvent son sous-composant lorsque la proprit est dfinie nil. Sinon, ds quun autre composant est affect la proprit, le souscomposant ne peut plus tre restaur la conception. Lexemple suivant illustre une telle mthode de dfinition dune proprit dont la valeur est un composant TTimer :
procedure TDemoComponent.SetTimerProp(Value: TTimer); begin if Value <> FTimer then begin if Value <> nil then begin if (FTimer <> nil and FTimer.Owner = self then FTimer.Free; FTimer := Value; FTimer,FreeNotification(self); end else { valeur nil } begin if FTimer.Owner <> self then { FTimer := TTimer.Create(self); FTimer.SetSubComponent(True); FTimer.FreeNotification(self); } end; end; end;
Notez que la mthode de dfinition de proprit ci-dessus a appel la mthode FreeNotification du composant affect la proprit. Cet appel garantit que le composant reprsentant la valeur de la proprit envoie une notification sil est
42-10
Guide du dveloppeur
sur le point dtre dtruit. Il envoie cette notification en appelant la mthode Notification. Vous grez cet appel en redfinissant la mthode Notification, comme suit :
procedure TDemoComponent.Notification(AComponent: TComponent; Operation: TOperation); begin inherited Notification(AComponent, Operation); if (Operation = opRemove) and (AComponent = FTimer) then FTimer := nil; end;
Lappel de la mthode ReferenceInterface avec une interface spcifie fait la mme chose que lappel de la mthode FreeNotification dun autre composant. Ainsi, aprs lappel de la mthode ReferenceInterface partir de la mthode de dfinition de proprit, vous pouvez redfinir la mthode Notification pour grer les notifications depuis limplmenteur de linterface:
procedure TDemoComponent.Notification(AComponent: TComponent; Operation: TOperation); begin inherited Notification(AComponent, Operation); if (Assigned(MyIntfProp)) and (AComponent.IsImplementorOf(MyInftProp)) then MyIntfProp := nil; end;
Notez que le code Notification affecte nil la proprit MyIntfProp, et pas le champ priv (FIntfField). Cela garantit que Notification appelle la mthode de dfinition de proprit, qui appelle ReferenceInterface pour retirer la demande de notification qui a t tablie quand la valeur de la proprit a t pralablement dfinie. Toutes les affectations de la proprit dinterface doivent tre effectues par le biais de la mthode de dfinition de proprit.
Cration de proprits
42-11
42-12
Guide du dveloppeur
La spcification dune valeur par dfaut na pas pour effet dattribuer cette valeur la proprit lorsque lobjet est cr. Le constructeur du composant doit sen charger. Une proprit dont la valeur nest pas dfinie par le constructeur du composant, a la valeur zro, ou la valeur affiche par la proprit quand son stockage en mmoire est 0. Par dfaut, les nombres valent donc 0, les boolens False, les pointeurs nil, etc. En cas de doute, affectez une valeur dans la mthode du constructeur. Le code suivant montre la dclaration dun composant qui attribue une valeur par dfaut la proprit Align, ainsi que limplmentation du constructeur du composant qui affecte cette valeur. Dans notre exemple, le nouveau composant est un cas particulier du composant volet standard utilis en tant que barre dtat dans une fentre. Il doit donc implicitement saligner sur la bordure infrieure de son propritaire.
type TStatusBar = class(TPanel) public constructor Create(AOwner: TComponent); override; published property Align default alBottom; end;
constructor TStatusBar.Create(AOwner: TComponent); begin inherited Create(AOwner); { effectue une initialisation hrite } Align := alBottom; { affecte une nouvelle valeur par dfaut Align } end;
Dtermination du stockage
Vous pouvez choisir si Delphi stocke ou non chacune des proprits de vos composants. Par dfaut, sont stockes toutes les proprits de la partie published de la dclaration de classe. Vous pouvez choisir de ne pas stocker une proprit ou de dsigner une fonction qui dtermine dynamiquement le stockage de la proprit.
Cration de proprits
42-13
Pour contrler le stockage par Delphi dune proprit, ajoutez la directive stored la dclaration de proprit, suivie par true, false ou le nom dune fonction boolenne. Le code suivant montre un composant avec la dclaration de trois nouvelles proprits. La premire est toujours stocke, la deuxime ne lest jamais et la troisime est stocke selon la valeur dune fonction boolenne :
type TSampleComponent = class(TComponent) protected function StoreIt: Boolean; public published property Important: Integer stored True; property Unimportant: Integer stored False; property Sometimes: Integer stored StoreIt; end;
La premire opration accomplir dans une mthode Loaded consiste appeler la mthode Loaded reue en hritage. Ceci afin dtre sr que toutes les proprits reues en hritage sont correctement initialises avant deffectuer linitialisation de votre propre composant. Le code suivant provient du composant TDatabase. Aprs chargement, la base de donnes essaie de rtablir toutes les connexions ouvertes au moment du stockage, et spcifie comment grer toutes les exceptions qui se produisent pendant la connexion.
procedure TDatabase.Loaded; begin inherited Loaded; try if FStreamedConnected then Open else CheckSessionName(False); except if csDesigning in ComponentState then Application.HandleException(Self) else raise; end; end;
42-14
Guide du dveloppeur
1 Cration de mthodes pour le stockage et le chargement de valeurs de proprits. 2 Redfinition de la mthode DefineProperties, en transmettant ces mthodes un objet filer.
Cration de proprits
42-15
if Reader.ReadBoolean then MyCompProperty := Reader.ReadComponent(nil); end; procedure TSampleComponent.StoreCompProperty(Writer: TWriter); begin Writer.WriteBoolean(MyCompProperty <> nil); if MyCompProperty <> nil then Writer.WriteComponent(MyCompProperty); end;
42-16
Guide du dveloppeur
43
Chapitre 43
Chapitre
Cration dvnements
Un vnement est un lien entre une occurrence du systme (une action de lutilisateur ou un changement de focalisation, par exemple) et le fragment de code qui assure effectivement la rponse. Le code de rponse est le gestionnaire de lvnement, dont lcriture est presque toujours du ressort du dveloppeur de lapplication. Grce aux vnements, les dveloppeurs peuvent personnaliser le comportement des composants sans avoir besoin de modifier les classes ellesmmes. Cela sappelle la dlgation. Les vnements associs aux actions utilisateur les plus usuelles (par exemple, les actions de la souris) sont intgrs dans les composants standard, mais vous pouvez aussi dfinir de nouveaux vnements. Pour tre capable de crer des vnements dans un composant, vous devez avoir compris ce qui suit : Quest-ce qu un vnement ? Implmentation des vnements standard Dfinition de vos propres vnements Les vnements tant implments en tant que proprits, il vaut mieux avoir bien compris le chapitre 42, Cration de proprits, avant de crer ou de modifier les vnements dun composant.
Cration dvnements
43-1
vnement clic de souris se produit sur le bouton, ce dernier appelle la mthode associe OnClick qui est pour notre exemple Button1Click. Pour crire un vnement, vous devez comprendre ceci :
Lutilisateur clique sur Button1 Occurrence Button1.OnClick pointe sur Form1.Button1Click Evnement Form1.Button1Click sexcute Gestionnaire dvnement
vnements sont des pointeurs de mthodes. vnements sont des proprits. types dvnements sont des types de pointeurs de mthodes. types gestionnaire dvnement sont des procdures. gestionnaires dvnements sont facultatifs.
Limplmentation de Click appelle le gestionnaire utilisateur des vnements lis aux clics de la souris, sil existe. Si lutilisateur a affect un gestionnaire lvnement OnClick dun contrle, le fait de cliquer sur ce dernier gnre lappel de la mthode. Si aucun gestionnaire nest affect, rien ne se produit.
43-2
Guide du dveloppeur
Par convention, le nom de la donne membre est le mme que celui de la proprit prcd de la lettre F. Par exemple, le pointeur de la mthode OnClick est stock dans une donne membre intitule FOnClick de type TNotifyEvent ; la dclaration de la proprit de lvnement OnClick ressemble ceci :
type TControl = class(TComponent) private FOnClick: TNotifyEvent;
Pour en savoir davantage sur TNotifyEvent et sur les autres types dvnements, voir la prochaine section, Les types dvnements sont des types de pointeurs de mthodes. Comme pour toute autre proprit, vous pouvez dfinir ou modifier la valeur dun vnement au moment de lexcution. Lavantage principal des vnements implments sous la forme de proprits est que lutilisateur de composant peut lui associer un gestionnaire au moment de la conception laide de linspecteur dobjets.
Cration dvnements
43-3
vrifiez que vous affectez une valeur correcte au paramtre avant dappeler le gestionnaire afin de ne pas rendre obligatoire la modification de la valeur par le code de lutilisateur. Un exemple de transmission des paramtres var un gestionnaire dvnement est fourni par lvnement OnKeyPress, de type TKeyPressEvent. TKeyPressEvent dfinit deux paramtres, lun indiquant lobjet ayant gnr lvnement et lautre la touche enfonce :
type TKeyPressEvent = procedure(Sender: TObject; var Key: Char) of object;
Normalement, le paramtre Key contient le caractre tap par lutilisateur. Toutefois dans certaines circonstances, lutilisateur de composant peut souhaiter changer ce caractre. Par exemple, pour forcer tous les caractres en majuscules dans un diteur. Dans un cas comme celui-l, lutilisateur doit dfinir le gestionnaire suivant pour grer les frappes de touches :
procedure TForm1.Edit1KeyPressed(Sender: TObject; var Key: Char); begin Key := UpCase(Key); end;
Vous pouvez galement utiliser les paramtres var pour permettre lutilisateur de surcharger la gestion par dfaut.
43-4
Guide du dveloppeur
Les vnements standard disposent de mthodes virtuelles protges, dclares dans TControl, dont les noms correspondent aux noms des vnements. Par exemple, les vnements OnClick appellent une mthode nomme Click, et les vnements OnEndDrag appellent une mthode nomme DoEndDrag.
Comme les vnements standard de TControl, les vnements des contrles fentrs disposent de mthodes correspondantes. Les vnements de touches standard prsents ci-dessus rpondent toutes les frappes de touches normales.
Cration dvnements
43-5
Remarque VCL
Pour rpondre aux frappes de touches spciales (comme la touche Alt), vous devez rpondre au message WM_GETDLGCODE ou CM_WANTSPECIALKEYS de Windows. Voir chapitre 46, Gestion des messages, pour plus dinformations sur lcriture de gestionnaires de messages.
43-6
Guide du dveloppeur
code agit sur cet tat, vous devez dabord effectuer ces changements dtat avant dautoriser le code de lutilisateur y rpondre. Supposons que vous crivez un composant et que vous souhaitez modifier la faon dont il rpond aux clics de souris. Au lieu dassocier un gestionnaire lvnement OnClick, comme le ferait le dveloppeur dapplications, surchargez la mthode protge Click :
procedure click override { dclaration forward }
procedure TMyControl.Click; begin inherited Click; { excute la gestion standard, y compris lappel au gestionnaire} ... { vos modifications sinsrent ici} end;
Dclenchement de lvnement
Vous avez besoin de savoir ce qui a dclench lvnement. Pour certains vnements, la rponse est vidente. Par exemple, un vnement associ lenfoncement du bouton de souris se produit lorsque lutilisateur clique avec le bouton gauche de la souris provoquant lenvoi par Windows dun message WM_LBUTTONDOWN lapplication. La rception de ce message provoque lappel de la mthode MouseDown dun composant qui son tour appelle le code que lutilisateur a associ lvnement OnMouseDown. Nanmoins, certains vnements sont lis de faon moins vidente des occurrences externes moins spcifiques. Par exemple, une barre de dfilement dispose dun vnement OnChange qui peut tre dclench par plusieurs occurrences, telles des frappes de touche, des clics de souris, ou des modifications dans dautres contrles. Lorsque vous dfinissez vos vnements, assurez-vous que les occurrences appellent tous les vnements appropris.
Cration dvnements
43-7
vnements de type interaction utilisateur sont pratiquement toujours dclenchs par un message issu de Windows indiquant que lutilisateur a agi sur votre composant dune faon qui peut ncessiter une rponse de votre part. Les vnements de modification dtat peuvent aussi tre le fait de messages issus de Windows (par exemple, des changements de focalisation ou dactivation). Cependant, ils peuvent galement survenir la suite dune modification de proprit ou de lexcution dune autre partie de code. Vous disposez dun contrle total sur le dclenchement des vnements que vous avez vous-mme dfinis. Dfinissez les vnements avec soin de sorte que les dveloppeurs soient capables de les comprendre et de les utiliser.
Notifications simples
Un vnement de type notification ne fait quindiquer quun vnement particulier sest produit sans fournir aucune information sur le moment et lendroit o il sest produit. Les notifications utilisent le type TNotifyEvent, qui vhiculent un paramtre unique correspondant lmetteur de lvnement. Les seuls lments connus du gestionnaire associ une notification sont donc le type dvnement et le composant impliqu. Par exemple, les vnements clic de souris sont des notifications. Lorsque vous crivez un gestionnaire pour un vnement de ce type, vous ne rcuprez que deux informations : le fait quun clic sest produit et le composant impliqu. Une notification est un processus sens unique. Il nexiste aucun mcanisme pour renvoyer une information en retour ou pour inhiber la gestion dune notification.
43-8
Guide du dveloppeur
Dclaration de lvnement
Une fois dtermin le type de votre gestionnaire dvnement, vous pouvez dclarer le pointeur de mthode et la proprit pour lvnement. Noubliez pas dattribuer un nom lvnement qui soit la fois significatif et descriptif pour que lutilisateur puisse comprendre son rle. Dans la mesure du possible, choisissez des noms de proprits qui ressemblent ceux de composants dj dfinis.
Exception principale cette rgle : les nombreux vnements qui se produisent avant ou aprs certaines occurrences commencent par Before ou After.
Appel de lvnement
Il est prfrable de centraliser tous les appels un vnement. Autrement dit, crez une mthode virtuelle dans votre composant qui appelle le gestionnaire dvnement de lapplication (sil a t dfini) et qui fournit une gestion par dfaut. Le fait de rassembler tous les appels un vnement en un seul endroit vous permet dtre sr quun programmeur, qui drive un nouveau composant partir du vtre, pourra personnaliser la gestion de lvnement en surchargeant cette mthode sans avoir parcourir votre code pour reprer les endroits o lvnement est appel.
Cration dvnements
43-9
Deux autres considrations sont prendre en compte concernant lappel de lvnement : Les gestionnaires vides doivent tre valides. Les utilisateurs peuvent surcharger la gestion par dfaut.
Le code rel est lgrement diffrent car il prend galement en compte les messages Windows mais la logique reste la mme. Par dfaut, le composant appelle le gestionnaire dfini par lutilisateur avant dexcuter la gestion standard. Si le gestionnaire dfini par lutilisateur attribue le caractre null Key, le composant omet lexcution de la gestion par dfaut.
43-10
Guide du dveloppeur
44
Chapitre 44
Chapitre
Cration de mthodes
Les mthodes des composants sont des procdures et des fonctions intgres dans la structure dune classe. Il nexiste pratiquement aucune restriction sur ce que peuvent raliser les mthodes dun composant, mais Delphi nen respecte pas moins un certain nombre de standards quil est prfrable de suivre. Ce sont : Eviter les interdpendances Noms des mthodes Protection des mthodes Rendre virtuelles des mthodes Dclaration des mthodes
En gnral, les composants ne doivent pas contenir beaucoup de mthodes et vous devez chercher minimiser le nombre des mthodes appeles par une application. Il est prfrable dencapsuler sous la forme de proprits des caractristiques quil serait tentant dimplmenter sous forme de mthodes. Les proprits fournissent une interface qui sinscrit parfaitement dans lenvironnement Delphi et sont accessibles au moment de la conception.
Cration de mthodes
44-1
Les mthodes qui doivent sexcuter selon un ordre dfini. Les mthodes qui placent le composant dans un tat ou un mode pour lequel certains vnements ou certaines mthodes deviennent incorrectes. La meilleure faon de grer les situations de ce type est de fournir le moyen den sortir. Par exemple, si lappel dune mthode a pour effet de placer votre composant dans un tat o lappel dune autre mthode savre incorrect, vous devez modifier cette seconde mthode de telle manire que si elle est appele alors que le composant se trouve dans un tat impropre, elle corrige cet tat avant dexcuter son propre code principal. Faute de mieux, vous devrez dclencher une exception si lutilisateur appelle une mthode non valide. En dautres termes, si vous gnrez une situation dans laquelle il existe des interdpendances entre certaines parties de votre code, il est de votre responsabilit de vous assurer qu une utilisation incorrecte du code nengendre pas de problme. Un message davertissement, par exemple, est prfrable une fin dexcution anormale si lutilisateur na pas respect ces interdpendances.
44-2
Guide du dveloppeur
Cration de mthodes
44-3
Mthodes abstraites
Une mthode est parfois dclare abstract dans un composant Delphi. Dans la VCL et la CLX, les mthodes abstraites se produisent habituellement dans les classes dont les noms commencent par custom, comme dansTCustomGrid. De telles classes sont elles-mmes abstraites, au sens o elles ne servent qu la drivation de classes descendantes. Bien que vous puissiez crer un objet instance dune classe contenant un membre abstrait, ce nest pas recommand. Lappel du membre abstrait entrane une exception EAbstractError. La directive abstract est utilise pour indiquer des parties de classes qui doivent tre surfaces et dfinies dans des composants descendants ; cela force les crivains de composants redclarer le membre abstrait dans des classes descendantes avant que des instances actuelles de la classe puissent tre cres.
44-4
Guide du dveloppeur
public function CalculateArea: Integer; virtual; end; implementation procedure TSampleComponent.MakeBigger; begin Height := Height + 5; Width := Width + 5; end; function TSampleComponent.CalculateArea: Integer; begin Result := Width * Height; end;
Cration de mthodes
44-5
44-6
Guide du dveloppeur
45
Chapitre 45
Chapitre
Graphiques et composants
Windows fournit une puissante interface GDI (Graphics Device Interface) servant dessiner des graphiques indpendamment des priphriques. Malheureusement, GDI impose au programmeur des contraintes supplmentaires telles que la gestion des ressources graphiques. Delphi prend en charge toutes ces tches GDI ingrates, vous laisse vous concentrer sur le travail productif, vous pargnant les recherches de handles perdus ou de ressources non restitues. De mme que toute partie de lAPI Windows, vous pouvez appeler les fonctions GDI directement depuis votre application Delphi. Toutefois, vous vous rendrez vite compte que lutilisation de lencapsulation Delphi des fonctions graphiques est un moyen plus efficace et plus rapide de crer des graphiques. Les rubriques de cette section comprennent : Prsentation des graphiques Utilisation du canevas Travail sur les images Bitmaps hors cran Rponse aux changements
Les fonctions GDI sont spcifiques Windows et ne sappliquent pas aux applications multiplates-formes CLX.
Graphiques et composants
45-1
Pour vous pargner la gestion de vos graphiques un niveau dtaill, Delphi fournit une interface la fois simple et complte : il sagit de la proprit Canvas des composants. Le canevas garantit qu un contexte de priphrique valide est disponible et restitue le contexte lorsquil est inutilis. Il dispose galement de proprits spcifiques pour reprsenter la fonte, le crayon et le pinceau en cours. Le canevas gre toutes ces ressources votre place et vous navez donc pas le souci de crer, de slectionner ou de restituer les lments comme le handle dun crayon. Vous navez qu indiquer au canevas le crayon utiliser et il se charge du reste. Lun des avantages de laisser Delphi grer les ressources graphiques votre place est que Delphi peut mettre en mmoire cache les ressources en vue dun usage ultrieur, ce qui acclre considrablement les oprations rptitives. Par exemple, supposons quun programme cre, utilise puis restitue un outil crayon dun certain type plusieurs fois de suite, vous devez rpter ces tapes chaque fois que vous lutilisez. Comme Delphi stocke en mmoire cache les ressources graphiques, il y a une forte probabilit quun outil que vous utilisez de faon rptitive se trouve dans la mmoire cache. Aussi, au lieu de recrer loutil en question, Delphi se contentera de rutiliser celui qui existe dj. Par exemple, vous pouvez imaginer une application avec des dizaines de fiches ouvertes et des centaines de contrles. Chacun de ces contrles peut prsenter une ou plusieurs proprits TFont. Comme cela peut gnrer des centaines ou des milliers dinstances dobjets TFont, la plupart des applications nutiliseront que deux ou trois handles de fontes grce un cache de fontes. Voici deux exemples montrant quel point le code Delphi manipulant des graphiques peut tre simple. Le premier utilise les fonctions GDI standard pour dessiner une ellipse jaune borde de bleu comme le ferait dautres outils de dveloppement. Le second utilise un canevas pour dessiner la mme ellipse dans une application crite avec Delphi.
procedure TMyWindow.Paint(PaintDC: HDC; var PaintInfo: TPaintStruct); var PenHandle, OldPenHandle: HPEN; BrushHandle, OldBrushHandle: HBRUSH; begin PenHandle := CreatePen(PS_SOLID, 1, RGB(0, 0, 255)); { cre un crayon bleu } OldPenHandle := SelectObject(PaintDC, PenHandle); { dit DC dutiliser le crayon bleu } BrushHandle := CreateSolidBrush(RGB(255, 255, 0)); { cre un pinceau jaune } OldBrushHandle := SelectObject(PaintDC, BrushHandle); { dit DC dutiliser le pinceau // jaune } Ellipse(HDC, 10, 10, 50, 50); { dessine lellipse } SelectObject(OldBrushHandle); { restaure le pinceau original } DeleteObject(BrushHandle); { supprime le pinceau jaune } SelectObject(OldPenHandle); { restaure le crayon original } DeleteObject(PenHandle); { dtruit le crayon bleu } end; procedure TForm1.FormPaint(Sender: TObject); begin with Canvas do begin
45-2
Guide du dveloppeur
Utilisation du canevas
Pen.Color := clBlue; Brush.Color := clYellow; Ellipse(10, 10, 50, 50); end; end;
Utilisation du canevas
La classe canevas encapsule les contrles graphiques plusieurs niveaux, allant des fonctions de haut niveau (pour dessiner des lignes, des formes et du texte) aux proprits de niveau intermdiaire pour manipuler les fonctionnalits de dessin du canevas ; et dans la VCL, offre un accs de bas niveau au GDI Windows. Le tableau suivant rsume les possibilits du canevas.
Tableau 45.1 Niveau
Haut
Outils
Mthodes comme MoveTo, LineTo, Rectangle et Ellipse Mthodes TextOut, TextHeight, TextWidth et TextRect Mthodes FillRect et FloodFill Proprits Pen, Brush et Font Proprit Pixels. Mthodes Draw, StretchDraw, BrushCopy et CopyRect ; proprit CopyMode Proprit Handle
Intermdiaire
Bas
Pour plus dinformations sur les classes canevas, leurs mthodes et leurs proprits, reportez-vous laide en ligne.
Graphiques et composants
45-3
Vous pouvez aussi charger des images partir dun fichier et les enregistrer dans une source MIME Qt ou un objet flux en cas de cration de composants CLX. Pour charger une image dans un objet image partir dun fichier, appelez la mthode LoadFromFile de lobjet image. Pour enregistrer une image dans un fichier partir dun objet image, appelez la mthode SaveToFile de lobjet image. LoadFromFile et SaveToFile acceptent le nom dun fichier comme seul paramtre. LoadFromFile utilise lextension du fichier pour dterminer le type dobjet graphique cr ou charg. SaveToFile utilise le type de fichier appropri au type dobjet graphique enregistr.
45-4
Guide du dveloppeur
Pour charger un bitmap dans lobjet image dun contrle image, par exemple, vous devez transmettre le nom du fichier bitmap la mthode LoadFromFile de lobjet image :
procedure TForm1.LoadBitmapClick(Sender: TObject); begin Image1.Picture.LoadFromFile(RANDOM.BMP); end;
Lobjet image reconnat .bmp comme extension par dfaut des fichiers bitmap, elle cre donc le graphique en tant que TBitmap, avant dappeler la mthode LoadFromFile du graphique. Puisque le graphique est un bitmap, limage est charge depuis le fichier en tant que bitmap.
Delphi nassure ni la cration, ni la maintenance des palettes autres que celles des bitmaps. Toutefois, si vous disposez dun handle de palette, les contrles Delphi peuvent se charger de sa gestion.
Graphiques et composants
45-5
Le fait de spcifier la palette dun contrle a deux consquences pour votre application : Cela informe lapplication que la palette de votre contrle doit tre ralise. Cela dsigne la palette utiliser pour cette ralisation.
45-6
Guide du dveloppeur
La mthode Paint dun contrle graphique est un exemple dutilisation typique dun bitmap hors cran. Comme avec tout objet temporaire, lobjet bitmap doit tre protg par un bloc try..finally :
type TFancyControl = class(TGraphicControl) protected procedure Paint; override; end;
procedure TFancyControl.Paint; var Bitmap: TBitmap; { variable temporaire pour le bitmap hors cran } begin Bitmap := TBitmap.Create; { construit lobjet bitmap } try { draw on the bitmap } { copy the result into the controls canvas } finally Bitmap.Free; { dtruit lobjet bitmap } end; end;
Graphiques et composants
45-7
composant au moment de la conception corresponde aux proprits dfinies dans linspecteur dobjets consiste rpondre aux changements apports aux objets. Pour rpondre aux modifications dun objet graphique, vous devez associer une mthode lvnement OnChange de sa classe. Le composant forme publie les proprits reprsentant le crayon et le pinceau quil utilise pour tracer sa forme. Le constructeur du composant associe une mthode lvnement OnChange de chacun, ce qui a pour effet de provoquer le rafrachissement de limage du composant si le crayon ou le pinceau est modifi :
type TShape = class(TGraphicControl) public procedure StyleChanged(Sender: TObject); end; implementation constructor TShape.Create(AOwner: TComponent); begin inherited Create(AOwner); { appelle toujours le constructeur hrit ! Width := 65; Height := 65; FPen := TPen.Create; { construit le crayon FPen.OnChange := StyleChanged; { affecte la mthode lvnement OnChange FBrush := TBrush.Create; { construit le pinceau FBrush.OnChange := StyleChanged; { affecte la mthode lvnement OnChange end; procedure TShape.StyleChanged(Sender: TObject); begin Invalidate(); end;
} } } }
45-8
Guide du dveloppeur
46
Chapitre 46
Chapitre
La gestion des messages envoys par Windows aux applications est lune des cls de la programmation Windows traditionnelle. Delphi gre la plupart des messages standard votre place. Mais, vous aurez peut-tre grer des messages que Delphi ne prend pas en compte, ou encore crer puis grer vos propres messages. Les composants CLX ne grent pas les messages Windows mais vous pouvez crer des gestionnaires de messages pour vos propres messages. Il y a trois aspects prendre en considration lorsque vous travaillez avec des messages : Comprhension du systme de gestion des messages Modification de la gestion des messages Cration de nouveaux gestionnaires de messages
La bibliothque des composants visuels dfinit un systme de rpartition des messages qui convertit tous les messages Windows (y compris ceux dfinis par lutilisateur) destins une classe spcifique en appels des mthodes. Pour la CLX, le systme de rpartition ne comprend pas MainWndProc et WndProc.
46-1
Vous naurez sans doute jamais besoin de modifier le mcanisme de rpartition des messages. En revanche, vous aurez crire des mthodes de gestion des messages. Voir D claration dune nouvelle mthode de gestion dun message la page 46-7, pour plus de dtails sur ce sujet.
Cette information sapplique uniquement lcriture de composants VCL. Un message Windows est un enregistrement de donnes contenant plusieurs donnes membres exploitables. Le plus important est celui qui contient une valeur de la taille dun entier identifiant le message. Windows dfinit de nombreux messages et lunit Messages dclare tous leurs identificateurs. Un paramtre contient 16 bits, lautre 32 bits. Vous voyez souvent du code Windows qui fait rfrence ces valeurs avec wParam et lParam, comme paramtre de type word et paramtre de type long. Souvent, chaque paramtre contient une information, qui fait rfrence un mot de poids fort dans le paramtre de type long. A lorigine, un programmeur Windows devait mmoriser le contenu de chaque paramtre ou consulter lAPI Windows. Microsoft a rcemment donn un nom aux paramtres. Ces dcomposeurs de message ainsi appels simplifient la comprhension des informations accompagnant chaque message. Par exemple, les paramtres pour le message WM_KEYDOWN maintenant appels nVirtKey et lKeyData, donnent plus dinformations spcifiques que wParam et lParam. Pour chaque type de message, Delphi dfinit un type denregistrement qui donne un nom mnmonique chaque paramtre. Les messages souris transmettent par exemple les coordonnes x et y de lvnement souris dans le paramtre de type long, une dans le mot de poids fort, et lautre dans le mot de poids faible. Avec lutilisation de la structure souris-message, vous navez pas vous soucier du mot dont il sagit, car vous faites rfrence aux paramtres par les noms XPos et YPos au lieu de lParamLo et lParamHi.
Cette information sapplique uniquement lcriture de composants VCL. Lorsquune application cre une fentre, elle recense une procdure fentre avec le modle Windows. La procdure fentre reprsente la routine qui gre les messages pour la fentre. Habituellement, la procdure fentre contient une instruction longue case avec des entres pour chaque message devant tre gr par la fentre. Noubliez pas que fentre dans ce sens signifie seulement quelque chose sur lcran : chaque fentre, chaque contrle, etc. A chaque fois que vous crez un nouveau type de fentre, vous devez crer une procdure fentre complte. Delphi simplifie la rpartition des messages de plusieurs manires : Chaque composant hrite dun systme complet de rpartition de message.
46-2
Guide du dveloppeur
Le systme de rpartition de message dispose dune gestion par dfaut. Vous ne dfinissez de gestionnaire que pour les messages auxquels vous souhaitez spcifiquement rpondre. Vous pouvez modifier des parties de la gestion de message en vous appuyant sur les mthodes reues en hritage pour la majeure partie du traitement. Le bnfice le plus vident de cette rpartition de message est le suivant : tout moment, vous pouvez envoyer nimporte quel message nimporte quel composant. Si le composant na pas de gestionnaire dfini pour ce message, le systme de gestion par dfaut sen charge, gnralement en ignorant le message.
certain de ce que vous voulez effectivement faire. Delphi convertit la plupart des messages en vnements que lauteur ou lutilisateur du composant peut grer. Plutt que de modifier le comportement dfinissant la gestion du message, vous voudrez gnralement modifier le comportement dfinissant la gestion de lvnement. Pour modifier la gestion dun message dans les composants VCL, vous devez surcharger la mthode qui gre ce message. En outre, dans certaines
46-3
Cette information sapplique uniquement lcriture de composants VCL. Comme le type du paramtre Message transmis la mthode de gestion dpend du message gr, vous devez vous reporter la documentation des messages Windows pour connatre le nom et la signification de chaque paramtre. Si pour une raison ou pour une autre, vous avez vous rfrer aux paramtres dun message en utilisant lancienne convention dappellation (WParam, LParam, etc.), vous devez transtyper Message vers le type gnrique TMessage, qui utilise ces noms de paramtres.
46-4
Guide du dveloppeur
Le composant TControl dfinit des plages entires de messages lis la souris quil filtre lorsquun utilisateur fait glisser puis lche un contrle. Une mthode WndProc surcharge peut agir par deux moyens : Elle peut filtrer des plages entires de messages au lieu de spcifier un gestionnaire pour chacun deux. Elle peut inhiber totalement la rpartition des messages de faon ce que les gestionnaires ne soient jamais appels. Pour la CLX, un contrle peut tre driv de TWidgetControl et vous pourriez redfinir EventFilter au lieu de WndProc. Voici une partie de la mthode WndProc pour TControl, par exemple :
procedure TControl.WndProc(var Message: TMessage); begin if (Message.Msg >= WM_MOUSEFIRST) and (Message.Msg <= WM_MOUSELAST) then if Dragging then { gestion spcifique dune opration glisser } DragMouseMsg(TWMMouse(Message)) else { gestion normale des autres oprations } end; { autrement gestion normale } end;
46-5
Dfinition de vos propres messages Dclaration dune nouvelle mthode de gestion dun message Les composants CLX ne grent pas les messages Windows mais vous pouvez crer des gestionnaires de messages pour vos propres messages. Notez que vous ne pouvez pas crer des gestionnaires de messages pour les vnements Qt car ce sont des objets et non des identificateurs de messages.
46-6
Guide du dveloppeur
1 Nommez le type enregistrement daprs le message en rajoutant le prfixe T son nom. 2 Donnez au premier champ de lenregistrement le nom Msg et le type TMsgParam. 3 Dfinissez les deux octets suivants pour quils correspondent au paramtre Word, et les deux suivants inutiliss.
ou Dfinissez les quatre octets suivants pour quils correspondent au paramtre Longint.
( en premier, lidentificateur du message ) ( voici wParam ) ( deux manires de voir lParam ) ( soit les coordonnes x et y... )
1 Dclarez la mthode dans une partie protected de la dclaration de la classe du composant. 2 Faites de la mthode une procdure. 3 Nommez la mthode suivant le message quelle gre en supprimant les caractres de soulignement de son nom.
46-7
4 Transmettez un seul paramtre var appel Message, du type dfini par lenregistrement du message. 5 A lintrieur de limplmentation de la mthode message, crivez le code de gestion spcifique au composant. 6 Appelez le gestionnaire de message transmis en hritage.
Voici la dclaration, par exemple, dun gestionnaire de message pour un message utilisateur intitul CM_CHANGECOLOR.
const CM_CHANGECOLOR = WM_APP + 400; type TMyComponent = class(TControl) protected procedure CMChangeColor(var Message: TMessage); message CM_CHANGECOLOR; end; procedure TMyComponent.CMChangeColor(var Message: TMessage); begin Color := Message.lParam; inherited; end;
46-8
Guide du dveloppeur
47
Chapitre 47
Chapitre
Ce chapitre dcrit les tapes permettant de rendre les composants que vous crez accessibles dans lEDI. Rendre vos composants accessibles la conception est un processus qui ncessite plusieurs tapes : Recensement des composants Ajout de bitmaps la palette Fournir laide pour vos composants Ajout dditeurs de proprits Ajout dditeurs de composants Compilation des composants en paquets
Toutes les tapes ne sappliquent pas tous les composants. Par exemple, si vous ne dfinissez ni proprit ni vnement nouveau, il nest pas ncessaire de fournir de laide. Le recensement et la compilation sont les seules tapes obligatoires. Une fois que vos composants ont t recenss et compils en paquets, ils peuvent tre distribu s dautres dveloppeurs et installs dans lEDI. Pour plus dinformations sur linstallation des paquets dans lEDI, voir Installation de paquets de composants la page 11-6.
47-1
Remarque
Si vous crez votre composant en choisissant Composant|Nouveau Composant dans lEDI, le code requis pour recenser votre composant est automatiquement ajout. Les tapes dun recensement manuel de composant sont : Dclaration de la procdure Register Ecriture de la procdure Register
{ dclarez vos composants ici } { ceci doit apparatre dans la section interface } { limplmentation de composant vient ici }
Dans la procdure Register, appelez RegisterComponents pour chaque composant que vous souhaitez ajouter la palette des composants. Si lunit contient plusieurs composants, vous pouvez les recenser en une seule fois.
47-2
Guide du dveloppeur
Vous pourriez aussi recenser plusieurs composants en mme temps sur la mme page ou recenser des composants sur des pages diffrentes, comme dans le code suivant :
procedure Register; begin RegisterComponents(Miscellaneous, [TFirst, TSecond]); { deux sur cette page... } RegisterComponents(Assorted, [TThird]); { ...un sur une autre... } RegisterComponents(LoadStr(srStandard), [TFourth]); { ...et un sur la page Standard } end;
47-3
47-4
Guide du dveloppeur
La composition de fichiers daide pour les composants seffectue en plusieurs tapes : Cration des entres Aide contextuelle des composants Ajout des fichiers daide des composants
47-5
la liaison vers une classe dobjet en utilisant le nom de classe de lobjet suivi dun caractre de soulignement et de la chane object. Par exemple, pour raliser un lien vers lobjet TCustomPanel, utilisez le code suivant :
!AL(TCustomPanel_object,1)
Pour raliser un lien vers une proprit, une mthode ou un vnement, faites prcder son nom par celui de lobjet qui limplmente et par un caractre de soulignement. Par exemple, pour raliser un lien vers la proprit Text implmente par TControl, utilisez le code suivant :
!AL(TControl_Text,1)
Pour voir un exemple de rubriques de navigation secondaires, affichez laide dun composant quelconque et cliquez sur les liens tiquets hirarchie, proprits, mthodes ou vnements.
3 Chaque proprit, vnement ou mthode dclar lintrieur du composant doit avoir une rubrique.
Une rubrique dcrivant une proprit, un vnement ou une mthode doit indiquer la dclaration de llment et dcrire son rle. Les dveloppeurs dapplications accderont cette rubrique en slectionnant llment dans linspecteur dobjets et en appuyant sur F1, ou en plaant le curseur dans lditeur de code sur le nom de llment et en appuyant sur F1. Pour avoir un exemple de rubrique associe une proprit, slectionnez un lment quelconque dans linspecteur dobjets et appuyez sur F1. Les rubriques de proprit, dvnement et de mthode doivent inclure une note de bas de page K qui indique le nom de la proprit, de lvnement et de la mthode, son nom et celui du composant. Ainsi, la proprit Text de TControl prsente la note de bas de page K suivante :
Text,TControl;TControl,Text;Text,
Les rubriques de proprit, de mthode ou dvnement doivent galement comporter une note de bas de page $ indiquant le titre de la rubrique, tel que TControl.Text. Toutes ces rubriques doivent disposer dun identificateur de rubrique unique la rubrique, entr sous la forme dune note de bas de page #.
47-6
Guide du dveloppeur
Si la rubrique daide est destine une proprit ou un vnement, la note de bas de page A comprend trois entres spares par des points-virgules selon la syntaxe suivante :
ComponentClass_Element;Element_Type;Element
o ComponentClass est le nom de la classe du composant, Element est le nom de la proprit, de la mthode ou de lvnement et Type est la proprit, la mthode ou lvnement Par exemple, en supposant une proprit BackgroundColor dun composant TMyGrid, la note de bas de page A est
TMyGrid_BackgroundColor;BackgroundColor_Property;BackgroundColor
1 2 3 4 5
Drivation dune classe diteur de proprits Modification de la proprit sous une forme textuelle Modification globale de la proprit Spcification des attributs de lditeur Recensement de lditeur de proprits
47-7
et CLX. Nanmoins, certaines classes diteur de proprit fournissent des botes de dialogue spcialises et sont ainsi spcialises VCL ou CLX. Elles peuvent tre trouves respectivement dans les units WinEditors et CLXEditors.
Remarque
Ce qui est absolument ncessaire pour un diteur de proprit est quil drive de TBasePropertyEditor et quil prenne en charge linterface IProperty. Nanmoins, TPropertyEditor fournit une implmentation par dfaut de linterface IProperty. La liste du tableau suivant nest pas complte. Les units WinEditors et CLXEditors dfinissent galement certains diteurs spcialiss utiliss exclusivement par certaines proprits comme le composant Name. Les diteurs de proprits ci-dessous sont les plus utiles aux concepteurs de proprits dfinies par lutilisateur.
Tableau 47.1 Type
TOrdinalProperty TIntegerProperty TCharProperty TEnumProperty TFloatProperty TStringProperty TSetElementProperty TSetProperty
TColorProperty
TFontNameProperty TFontProperty
Lexemple suivant montre la dclaration dun diteur de proprits simple nomm TMyPropertyEditor :
type TFloatProperty = class(TPropertyEditor) public function AllEqual: Boolean; override;
47-8
Guide du dveloppeur
function GetValue: string; override; procedure SetValue(const Value: string); override; end;
Type de proprit
Virgule flottante Pointeur de m thode (vnement) Type ordinal Chane
M thode Set
SetFloatValue SetMethodValue SetOrdValue SetStrValue
Lorsque vous surchargez une mthode GetValue, appelez lune des mthodes Get. Lorsque vous surchargez SetValue, appelez lune des mthodes Set.
47-9
Voici les mthodes GetValue et SetValue de TIntegerProperty. Integer est de type ordinal, ainsi GetValue appelle GetOrdValue et convertit le rsultat en chane. SetValue convertit la chane en entier, effectue certains calculs dintervalle et appelle SetOrdValue.
function TIntegerProperty.GetValue: string; begin with GetTypeData(GetPropType)^ do if OrdType = otULong then // non sign Result := IntToStr(Cardinal(GetOrdValue)) else Result := IntToStr(GetOrdValue); end; procedure TIntegerProperty.SetValue(const Value: string); procedure Error(const Args: array of const); begin raise EPropertyError.CreateResFmt(@SOutOfRange, Args); end; var L: Int64; begin L := StrToInt64(Value); with GetTypeData(GetPropType)^ do if OrdType = otULong then begin if (L < Cardinal(MinValue)) or (L > Cardinal(MaxValue)) then Error([Int64(Cardinal(MinValue)), Int64(Cardinal(MaxValue))]); end else if (L < MinValue) or (L > MaxValue) then Error([MinValue, MaxValue]); SetOrdValue(L); end;
Les spcificits des exemples particuliers sont moins importantes quen principe : GetValue convertit la valeur en chane ; SetValue convertit la chane et valide la valeur avant dappeler une des mthodes Set.
47-10
Guide du dveloppeur
habituellement inutile de convertir les valeurs des proprits en chanes. Lditeur traite gnralement la valeur telle quelle a t rcupre. Lorsque lutilisateur clique sur le bouton ... ct de la proprit, ou doubleclique sur la colonne des valeurs, linspecteur dobjets appelle la mthode Edit de lditeur de proprits. Pour votre implmentation de la mthode Edit, suivez ces tapes :
1 Construisez lditeur que vous utilisez pour cette proprit. 2 Lisez la valeur en cours et attribuez-la la proprit en utilisant une mthode Get. 3 Lorsque lutilisateur slectionne une nouvelle valeur, attribuez cette valeur la proprit en utilisant une mthode Set. 4 Dtruisez lditeur.
Les proprits Color trouves dans la plupart des composants utilisent la bote de dialogue de couleur standard Windows comme diteur de proprits. Voici la mthode Edit issue de TColorProperty, qui appelle la bote de dialogue et utilise le rsultat :
procedure TColorProperty.Edit; var ColorDialog: TColorDialog; begin ColorDialog := TColorDialog.Create(Application); { construit lditeur try ColorDialog.Color := GetOrdValue; { utilise la valeur existante if ColorDialog.Execute then { si lutilisateur valide la bote de dialogue par OK... SetOrdValue(ColorDialog.Color); { ...utilise le rsultat pour dfinir la valeur finally ColorDialog.Free; { dtruit lditeur } end; end;
} } } }
47-11
GetAttributes renvoie un ensemble de valeurs de type TPropertyAttributes qui peut inclure une ou plusieurs des valeurs suivantes :
Tableau 47.3 Indicateur
paValueList paSubProperties paDialog paMultiSelect paAutoUpdate
Signification si inclus
Lditeur peut fournir une liste de valeurs numres. La proprit dispose de sous-proprits quil est possible dafficher. Lditeur peut afficher une bote de dialogue permettant de modifier globalement la proprit. La proprit doit safficher lorsque lutilisateur slectionne plusieurs composants. Mise jour du composant aprs chaque modification au lieu dattendre lapprobation de la valeur. Linspecteur dobjets doit trier la liste de valeurs. La valeur de la proprit ne peut tre modifie lors de la conception. Active llment de menu Revenir hrit dans le menu contextuel de linspecteur dobjets. Cet lment de menu demande lditeur dannuler la valeur en cours de la proprit et de revenir une valeur par dfaut ou standard pralablement tablie. La valeur na pas besoin dtre affiche. Linspecteur dobjets utilise toute sa largeur pour le nom de proprit. Linspecteur dobjets rcupre les valeurs de toutes les sous-proprits chaque modification de la valeur de la proprit. La valeur est une rfrence quelque chose dautre. Utilis conjointement avec paSubProperties, lobjet rfrenc devrait tre affich comme sous-proprits de cette proprit.
paFullWidthName
N/D
GetProperties
GetComponentValue
Les proprits Color sont plus polyvalentes que la plupart des autres proprits, lutilisateur dispose de plusieurs moyens pour slectionner une couleur dans linspecteur dobjets : il peut taper une valeur, slectionner dans une liste ou faire appel lditeur personnalis. Cest pourquoi la mthode GetAttributes de TColorProperty, inclut plusieurs attributs dans la valeur quelle renvoie :
function TColorProperty.GetAttributes: TPropertyAttributes; begin Result := [paMultiSelect, paDialog, paValueList, paRevertable]; end;
47-12
Guide du dveloppeur
Les trois instructions de cette procdure couvrent les diffrentes utilisations de RegisterPropertyEditor : La premire instruction est la plus typique. Elle recense lditeur de proprits TComponentProperty pour toutes les proprits de type TComponent (ou les descendants de TComponent qui nont pas dditeur sp cifique recens). Habituellement, vous crez un diteur sappliquant un type particulier, puis vous souhaitez lutiliser pour lensemble des proprits de ce type. Cest pourquoi le deuxime et le troisime paramtres ont pour valeurs respectives nil et une chane vide. La deuxime instruction est le type de recensement le plus spcifique. Elle recense un diteur pour une proprit spcifique et pour un type sp cifique de composant. Dans notre exemple, lditeur sapplique la proprit Name (de type TComponentName) de tous les composants.
47-13
Catgories de proprit
La troisime instruction est plus sp cifique que la premire, et moins que la deuxime. Elle recense un diteur pour toutes les proprits de type TMenuItem pour les composants de type TMenu.
Catgories de proprit
Dans lIDE, linspecteur dobjets vous permet de masquer et dafficher slectivement des proprits bases sur les catgories de proprit. Les proprits des nouveaux composants personnaliss peuvent rentrer dans ce schma en recensant des proprits par catgories. Faites ceci lors du recensement du composant en appelant RegisterPropertyInCategory ou RegisterPropertiesInCategory. Utilisez RegisterPropertyInCategory pour recenser une seule proprit. Utilisez RegisterPropertiesInCategory pour recenser plusieurs proprits dans un seul appel de fonction. Ces fonctions sont dfinies dans lunit DesignIntf. Notez quil nest pas obligatoire de recenser des proprits ni que toutes les proprits dun composant personnalis soient recenses lorsque quelques-unes le sont. Toute proprit non explicitement associe une catgorie est incluse dans la catgorie TMiscellaneousCategory. De telles proprits sont affiches ou masques dans linspecteur dobjets selon cette catgorisation par dfaut. En plus de ces deux fonctions de recensement de proprits, il existe une fonction IsPropertyInCategory. Cette fonction est utile pour la cration dutilitaires de localisation, dans laquelle vous devez dterminer si une proprit est recense dans une catgorie de proprit donne.
La deuxime variation identifie la proprit en utilisant le type de classe de composant et le nom de proprit caractristiques. Lexemple ci-aprs recense (dans la catgorie THelpCategory) une proprit appele HelpContext dun composant de la classe personnalise TMyButton.
RegisterPropertyInCategory(Help and Hints, TMyButton, HelpContext);
La troisime variation identifie la proprit en utilisant son type au lieu de son nom. Lexemple ci-aprs recense une proprit base sur son type, Integer.
RegisterPropertyInCategory(Visual, TypeInfo(Integer));
47-14
Guide du dveloppeur
Catgories de proprit
La dernire variation utilise la fois le type de la proprit et son nom pour identifier la proprit. Lexemple ci-aprs recense une proprit base sur une combinaison de son type, TBitmap et de son nom, Pattern.
RegisterPropertyInCategory(Visual, TypeInfo(TBitmap), Pattern);
Consultez la section Spcification de catgories de proprits pour une liste des catgories de proprits disponibles et une brve description de leur utilisation.
La deuxime variation vous permet de limiter les proprits recenses celles qui appartiennent un composant spcifique. La liste des proprits recenser comprend seulement les noms, pas les types. Par exemple, le code suivant recense un nombre de proprits dans la catgorie Help and Hints pour tous les composants :
RegisterPropertiesInCategory(Help and Hints, TComponent, [HelpContext, Hint, ParentShowHint, ShowHint]);
La troisime variation vous permet de limiter les proprits recenses celles possdant un type spcifique. Comme avec la seconde variation, la liste des proprits recenser peut ninclure que les noms :
RegisterPropertiesInCategory(Localizable, TypeInfo(String), [Text, Caption]);
Consultez la section Spcification de catgories de proprits pour obtenir une liste des catgories de proprit disponibles ainsi quune brve description de leur utilisation.
47-15
Catgories de proprit
proprits dans des catgories intgres. Les catgories de proprits intgres sont dcrites dans le tableau suivant :
Tableau 47.4 Cat gorie
Action Database
Locale
Localizable
Visual
Input
Miscellaneous
47-16
Guide du dveloppeur
fonction IsPropertyInCategory sont disponibles, autorisant diffrents critres afin de dterminer si une proprit se trouve dans une catgorie. La premire variation vous permet de baser le critre de comparaison sur une combinaison du type de classe du composant propritaire et du nom de la proprit. Dans la ligne de commande ci-aprs, pour que IsPropertyInCategory renvoie True, la proprit doit appartenir un descendant de TCustomEdit, avoir le nom Text et se trouver dans la catgorie de proprit Localizable.
IsItThere := IsPropertyInCategory(Localizable, TCustomEdit, Text);
La deuxime variation vous permet de baser le critre de comparaison sur une combinaison du nom de classe du composant propritaire et du nom de la proprit. Dans la ligne de commande ci-aprs, pour que IsPropertyInCategory renvoie True, la proprit doit tre un descendant de TCustomEdit, avoir le nomText, et se trouver dans la catgorie de proprit Localizable.
IsItThere := IsPropertyInCategory(Localizable, TCustomEdit, Text);
47-17
Veillez ce que votre mthode GetVerb renvoie une valeur pour chaque index possible indiqu par GetVerbCount.
47-18
Guide du dveloppeur
{ instantie lditeur } { si lutilisateur valide la // bote de dialogue par OK... } MyComponent.FThisProperty := MySpecialDialog.ReturnValue;{ ...utilise la valeur } MySpecialDialog.Free; { dtruit lditeur } end; 1: That; { appelle la mthode That } end; end;
var MySpecialDialog: TMyDialog; begin case Index of 0: begin MyDialog := TMySpecialDialog.Create(Application); if MySpecialDialog.Execute then;
Si vous souhaitez quun double-clic sur le composant affiche lditeur de code dun gestionnaire dvnement, utilisez TDefaultEditor comme classe de base pour votre diteur de composants au lieu de TComponentEditor. Puis, au lieu de surcharger la mthode Edit, surchargez la mthode protge TDefaultEditor.EditProperty. EditProperty recherche les gestionnaires dvnement
47-19
du composant et affiche le premier quil trouve. Vous pouvez modifier ce comportement pour visualiser un vnement particulier. Par exemple :
procedure TMyEditor.EditProperty(PropertyEditor: TPropertyEditor; Continue, FreeEditor: Boolean) begin if (PropertyEditor.ClassName = TMethodProperty) and (PropertyEditor.GetName = OnSpecialEvent) then // DefaultEditor.EditProperty(PropertyEditor, Continue, FreeEditor); end;
Placez lappel RegisterComponentEditor dans la procdure Register o vous recensez votre composant. Par exemple, si un nouveau composant nomm TMyComponent et son diteur de composants TMyEditor sont tous les deux
47-20
Guide du dveloppeur
implments dans la mme unit, le code suivant recense le composant et son association lditeur de composants.
procedure Register; begin RegisterComponents(Miscellaneous, [TMyComponent); RegisterComponentEditor(classes[0], TMyEditor); end;
47-21
47-22
Guide du dveloppeur
48
Chapitre 48
Chapitre
Le moyen le plus simple de crer un composant consiste le driver dun composant qui ralise la presque totalit des fonctions souhaites et lui apporter ensuite quelques modifications. Lexemple de ce chapitre modifie le composant mmo standard pour crer un mmo qui ne fait pas de saut de ligne par dfaut. La valeur de la proprit WordWrap du composant mmo est initialise True. Si vous utilisez frquemment des mmos neffectuant pas de saut de ligne, vous pouvez crer un nouveau composant mmo qui ne fait pas de saut de ligne par dfaut.
Remarque
Pour modifier les proprits publies ou enregistrer des gestionnaires dvnements spcifiques pour un composant existant, il est souvent plus simple dutiliser un modle de composant plutt que de crer une classe. La modification dun composant existant se fait en deux tapes : Cration et recensement du composant Modification de la classe composant
48-1
Drivez un nouveau type de composant appel TWrapMemo, descendant de TMemo. Recensez TWrapMemo sur la page Exemples de la palette des composants. Le fichier en-tte que vous obtenez doit ressembler ceci :
unit Memos; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, StdCtrls; type TWrapMemo = class(TMemo) end; procedure Register; implementation procedure Register; begin RegisterComponents(Samples, [TWrapMemo]); end; end.
Si vous compilez et installez maintenant le nouveau composant, il se comportera exactement comme son anctre, TMemo. Dans la section suivante, vous effectuerez une simple modification votre composant.
Surcharge du constructeur
Lorsque vous placez un composant dans une fiche au moment de la conception ou lorsquune application en cours dexcution construit un composant, le constructeur du composant dfinit les valeurs des proprits. Quand un composant est charg depuis un fichier fiche, lapplication dfinit toutes les proprits qui ont t modifies lors de la conception.
48-2
Guide du dveloppeur
Remarque
Lorsque vous surchargez un constructeur, le nouveau constructeur doit appeler le constructeur reu en hritage avant toute autre action. Pour plus dinformations, voir Surcharge des mthodes la page 41-9. Dans notre exemple, votre nouveau composant doit surcharger le constructeur transmis en hritage par TMemo en attribuant la valeur False la proprit WordWrap. Pour ce faire, ajoutez le constructeur surcharg la prdclaration, puis crivez le nouveau constructeur dans la partie implmentation de lunit :
type TWrapMemo = class(TMemo) public { les constructeurs sont toujours publics } constructor Create(AOwner: TComponent); override; { cette syntaxe est toujours // identique } end; constructor TWrapMemo.Create(AOwner: TComponent); { ceci va aprs limplmentation } begin inherited Create(AOwner); { Faites TOUJOURS ceci en premier ! } WordWrap := False; { dfinit la nouvelle valeur dsire } end;
Vous pouvez maintenant installer le nouveau composant sur la palette des composants et lajouter une fiche. Remarquez que la proprit WordWrap est dornavant initialise False. Si vous changez une valeur de proprit initiale, vous devez aussi dsigner cette valeur comme tant celle par dfaut. Si vous chouez faire correspondre la valeur dfinie par le constructeur celle spcifie par dfaut, Delphi ne peut pas stocker, ni restaurer la valeur correcte.
48-3
Spcifier la valeur par dfaut de la proprit naffecte en rien le fonctionnement du composant. Vous devez toujours initialiser la valeur dans le constructeur du composant. La redclaration de la valeur par dfaut assure que Delphi connat quand WordWrap doit tre crit dans le fichier fiche.
48-4
Guide du dveloppeur
49
Chapitre 49
Chapitre
Un contrle graphique est un composant simple. Un contrle purement graphique ne reoit jamais la focalisation et na donc pas besoin de handle de fentre. Les utilisateurs peuvent quand mme manipuler le contrle avec la souris, mais il ny a pas dinterface clavier. TShape, le composant graphique prsent dans ce chapitre, correspond au composant forme inclus dans la page Supplment de la palette des composants. Bien que le composant que nous allons crer soit identique au composant forme standard, vous devrez lui donner un nom diffrent pour viter des doublons didentificateur. Ce chapitre appelle son composant forme TSampleShape et illustre toutes les tapes de sa cration : Cration et recensement du composant Publication des proprits hrites Ajout de fonctionnalits graphiques
49-1
Le contrle forme de notre exemple rend les interactions associes la souris et aux oprations glisser-dplacer accessibles lutilisateur.
49-2
Guide du dveloppeur
49-3
Vous pouvez maintenant utiliser ce type pour dclarer une nouvelle proprit dans la classe.
Dclaration de la proprit
Gnralement, pour dclarer une proprit, vous dclarez un champ priv pour stocker les donnes de la proprit puis vous spcifiez les mthodes pour lire et/ ou crire sa valeur. Souvent, la mthode pour lire la valeur nest pas ncessaire car un simple pointage sur la valeur stocke suffit. Sagissant de notre contrle forme, vous aurez dclarer un champ contenant la forme courante, puis dclarer une proprit qui lit ce champ et lcrit via un appel de mthode. Ajoutez les dclarations suivantes dans TSampleShape :
type TSampleShape = class(TGraphicControl) private FShape: TSampleShapeType; { donne membre pour contenir la valeur de la proprit } procedure SetShape(Value: TSampleShapeType); published property Shape: TSampleShapeType read FShape write SetShape; end;
49-4
Guide du dveloppeur
1 Redclarez les proprits Height et Width avec leurs nouvelles valeurs par dfaut :
type TSampleShape = class(TGraphicControl) published property Height default 65; property Width default 65; end;
1 2 3 4
Dclaration des champs de la classe. Dclaration des proprits daccs. Initialisation des classes ayant un propritaire. Dfinition des proprits des classes ayant un propritaire.
49-5
Vous devez ensuite crire les mthodes SetBrush et SetPen dans la partie implmentation de lunit :
procedure TSampleShape.SetBrush(Value: TBrush); begin FBrush.Assign(Value); { remplace le pinceau existant par le paramtre } end;
49-6
Guide du dveloppeur
procedure TSampleShape.SetPen(Value: TPen); begin FPen.Assign(Value); { remplace le crayon existant par le paramtre } end;
...craserait le pointeur interne de FBrush, ferait perdre de la mmoire et crerait une srie de problmes de proprit.
{ dtruit lobjet crayon } { dtruit lobjet pinceau } { appelle aussi toujours le destructeur hrit }
49-7
vnement OnChange, vous pouvez crer une mthode dans le contrle forme et faire pointer les deux vnements OnChange sur cette mthode. Ajoutez la mthode suivante au contrle forme et effectuez la mise jour du constructeur du composant pour affecter aux vnements du crayon et du pinceau cette nouvelle mthode :
type TSampleShape = class(TGraphicControl) published procedure StyleChanged(Sender: TObject); end; implementation constructor TSampleShape.Create(AOwner: TComponent); begin inherited Create(AOwner); { appelez toujours Width := 65; Height := 65; FPen := TPen.Create; FPen.OnChange := StyleChanged; { affecte la mthode FBrush := TBrush.Create; FBrush.OnChange := StyleChanged; { affecte la mthode end;
le constructeur hrit }
} } } }
Ces modifications faites, le composant se redessine pour reflter tout changement du crayon ou du pinceau.
1 Ajout de Paint dans la dclaration du composant. 2 Insertion de la mthode Paint dans la partie implmentation de lunit.
49-8
Guide du dveloppeur
Sagissant de notre contrle forme, vous devez ajouter la dclaration suivante la dclaration de classe :
type TSampleShape = class(TGraphicControl) protected procedure Paint; override; end;
Paint est appele chaque fois que le contrle doit mettre jour son image. Les contrles sont dessins lorsquils saffichent pour la premire fois ou lorsquune fentre qui se trouvait au-dessus disparat. En outre, vous pouvez forcer le dessin en appelant Invalidate, comme le fait la mthode StyleChanged.
du du du du
} } } }
49-9
if W < H then S := W else S := H; { enregistre du plus petit pour les cercles/carrs } case FShape of { ajuste la hauteur, la largeur et la position sstRectangle, sstRoundRect, sstEllipse: begin X := 0; { lorigine est langle suprieur gauche de ces formes Y := 0; end; sstSquare, sstRoundSquare, sstCircle: begin X := (W - S) div 2; { centre horizontalement... Y := (H - S) div 2; { ...puis verticalement W := S; { utilise la dimension la plus petite pour la largeur... H := S; { ...et pour la hauteur end; end; }
} } } }
case FShape of sstRectangle, sstSquare: Rectangle(X, Y, X + W, Y + H); { dessine les rectangles et les carrs } sstRoundRect, sstRoundSquare: RoundRect(X, Y, X + W, Y + H, S div 4, S div 4); { dessine des formes arrondies } sstCircle, sstEllipse: Ellipse(X, Y, X + W, Y + H); { dessine les formes arrondies } end; end; end;
49-10
Guide du dveloppeur
50
Chapitre 50
Chapitre
Delphi fournit plusieurs composants abstraits que vous pouvez utiliser comme points de dpart pour personnaliser vos composants. Les grilles et les botes liste sont les plus importants. Dans ce chapitre, nous allons voir comment crer un petit calendrier en partant du composant grille de base TCustomGrid. La cration du calendrier ncessite les tapes suivantes : Cration et recensement du composant Publication des proprits hrites Modification des valeurs initiales Redimensionnement des cellules Remplissage des cellules Navigation de mois en mois et danne en anne Navigation de jour en jour
Le composant calendrier rsultant est pratiquement identique au composant TCalendar contenu dans la page Exemples de la palette des composants.
50-1
Recensez TSampleCalendar dans la page Exemples de la palette des composants. Lunit rsultante drivant de TCustomGrid dans la VCL devrait ressembler ceci :
unit CalSamp; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids; type TSampleCalendar = class(TCustomGrid) end; procedure Register; implementation procedure Register; begin RegisterComponents(Samples, [TSampleCalendar]); end; end.
Si la drivation seffectue partir de la version CLX de TCustomGrid, seule la clause uses est diffrente, elle prsente alors les units CLX. Si vous installez le composant calendrier maintenant, vous verrez quil apparat sur la page Exemples. Les seules proprits disponibles sont les proprits de contrle les plus basiques. Ltape suivante consiste rendre disponible certaines des proprits plus spcialises aux utilisateurs du calendrier.
Remarque
Bien que vous puissiez installer le composant calendrier exemple que vous venez de compiler, nessayez pas de le placer tout de suite sur une fiche. Le composant TCustomGrid contient une mthode DrawCell abstraite qui doit tre redclare avant que les objets dinstance puissent tre crs. La surcharge de la mthode DrawCell est dcrite dans Remplissage des cellules.
50-2
Guide du dveloppeur
published property property property property property property property property property property property property property property property end;
Align; { proprits publies } BorderStyle; Color; Font; GridLineWidth; ParentColor; ParentFont; OnClick; { vnements publis } OnDblClick; OnDragDrop; OnDragOver; OnEndDrag; OnKeyDown; OnKeyPress; OnKeyUp;
Il existe bien dautres proprits ne sappliquant pas un calendrier qui sont publiables, par exemple la proprit Options qui permet lutilisateur de choisir les lignes de la grille dessiner. Si vous installez le composant calendrier modifi dans la palette des composants et lutilisez dans une application, vous trouverez bien dautres proprits et vnements oprationnels. Nous allons maintenant commencer ajouter de nouvelles fonctionnalits au composant.
50-3
begin inherited Create(AOwner); { appelle le constructeur hrit } ColCount := 7; { toujours 7 jours/semaine } RowCount := 7; { toujours 6 semaines plus les titres } FixedCols := 0; { aucun libell de ligne } FixedRows := 1; { une ligne pour les noms de jour } ScrollBars := ssNone; { pas de dfilement ncessaire } Options := Options - [goRangeSelect] + [goDrawFocusSelected]; {dsactive la slection // dintervalle } end;
Le calendrier a dornavant sept colonnes et sept lignes, avec la ligne de titre fixe (ou qui ne dfile pas).
Lorsquun utilisateur ou une application modifie la taille dune fentre ou dun contrle, Windows envoie le message WM_SIZE la fentre ou au contrle concern pour lui permettre dajuster les paramtres ncessaires afin de dessiner ultrieurement son image dans la nouvelle taille. Votre composant VCL peut rpondre ce message en modifiant la taille des cellules de faon ce quelles sinscrivent dans les limites du contrle. Pour rpondre au message WM_SIZE, vous devez ajouter au composant une mthode de gestion du message. La cration dune mthode de gestion de message est dcrite en dtail dans Cration de nouveaux gestionnaires de messages la page 46-5. Dans notre exemple, le contrle calendrier devant rpondre au message WM_SIZE, vous devez ajouter au contrle une mthode protge appele WMSize et indexe par le message WM_SIZE, puis crire la mthode de calcul de la taille des cellules qui permettra toutes dtre visibles :
type TSampleCalendar = class(TCustomGrid) protected procedure WMSize(var Message: TWMSize); message WM_SIZE; end; procedure TSampleCalendar.WMSize(var Message: TWMSize); var GridLines: Integer; { variable locale temporaire } begin GridLines := 6 * GridLineWidth; { calcule de taille combine de toutes les lignes } DefaultColWidth := (Message.Width - GridLines) div 7; { dfinit la nouvelle largeur // de cellule par dfaut } DefaultRowHeight := (Message.Height - GridLines) div 7; { ainsi que sa hauteur } end;
Maintenant lorsque le calendrier est redimensionn, il affiche toutes les cellules dans la taille maximum avec laquelle ils peuvent rentrer dans le contrle.
50-4
Guide du dveloppeur
CLX
Dans la CLX, les changements de taille dune fentre ou dun contrle sont notifis automatiquement par un appel la mthode protge BoundsChanged. Votre composant CLX peut rpondre cette notification en modifiant la taille des cellules afin qu elles tiennent toutes dans les limites du contrle. Dans ce cas, le contrle calendrier doit redfinir BoundsChanged afin qu elle calcule la taille de cellule adquate pour que toutes les cellules soient visibles avec la nouvelle taille :
type TSampleCalendar = class(TCustomGrid) protected procedure BoundsChanged; override; end; procedure TSampleCalendar.BoundsChanged; var GridLines: Integer; begin GridLines := 6 * GridLineWidth; { calcul de la taille DefaultColWidth := (Width - GridLines) div 7; { nouvelle DefaultRowHeight := (Height - GridLines) div 7;{ nouvelle inherited; { appelle la mthode hrite } end;
{ variable locale temporaire } combine de toutes les lignes } largeur de cellule par dfaut } hauteur de cellule par dfaut }
50-5
Suivi de la date
Pour que le contrle calendrier soit utile, les utilisateurs ainsi que les applications doivent disposer dun moyen de dfinir la date, le mois et lanne. Delphi stocke les dates et les heures dans des variables de type TDateTime. TDateTime est une reprsentation numrique encode des dates et des heures particulirement pratique pour tre manipule par un programme mais peu commode interprter par un utilisateur. Vous pouvez donc stocker la date du calendrier sous une forme encode et fournir un accs direct cette valeur lors de lexcution, mais vous pouvez aussi fournir les proprits Day, Month et Year que lutilisateur du composant peut dfinir lors de la conception. Le suivi de la date dans le calendrier comprend les traitements suivants : Stockage interne de la date Accs au jour, au mois et lanne Gnration des numros de jours Slection du jour en cours
50-6
Guide du dveloppeur
property CalendarDate: TDateTime read FDate write SetCalendarDate; procedure TSampleCalendar.SetCalendarDate(Value: TDateTime); begin FDate := Value; { dfinit la nouvelle valeur date } Refresh; { met jour limage lcran } end;
2 Dclarez et crivez les mthodes dimplmentation, dfinissant les diffrents lments pour chaque valeur dindex :
type TSampleCalendar = class(TCustomGrid) private function GetDateElement(Index: Integer): Integer; { notez le paramtre Index } procedure SetDateElement(Index: Integer; Value: Integer); function TSampleCalendar.GetDateElement(Index: Integer): Integer; var AYear, AMonth, ADay: Word; begin DecodeDate(FDate, AYear, AMonth, ADay); { clate la date encode en lments } case Index of 1: Result := AYear; 2: Result := AMonth; 3: Result := ADay; else Result := -1; end; end;
50-7
procedure TSampleCalendar.SetDateElement(Index: Integer; Value: Integer); var AYear, AMonth, ADay: Word; begin if Value > 0 then { tous les lments doivent tre positifs begin DecodeDate(FDate, AYear, AMonth, ADay);{ rcupre les lments courants de la date case Index of { dfinit le nouvel lment selon lindex 1: AYear := Value; 2: AMonth := Value; 3: ADay := Value; else Exit; end; FDate := EncodeDate(AYear, AMonth, ADay); { encodage de la date modifie Refresh; { mise jour du calendrier visible end; end;
} } }
} }
Vous pouvez maintenant dfinir le jour, le mois et lanne du calendrier lors de la conception partir de linspecteur dobjets, ou lexcution partir du code. Bien que vous nayez pas encore ajout le code pour dessiner les dates dans les cellules, vous disposez maintenant de toutes les donnes ncessaires.
1 Ajoutez la classe une donne membre dcalage du premier jour du mois, ainsi quune mthode pour mettre jour la valeur de cette donne membre :
type TSampleCalendar = class(TCustomGrid) private FMonthOffset: Integer; protected procedure UpdateCalendar; virtual; end;
{ stocke le dcalage }
50-8
Guide du dveloppeur
procedure TSampleCalendar.UpdateCalendar; var AYear, AMonth, ADay: Word; FirstDate: TDateTime; { date du premier jour du mois begin if FDate <> 0 then { ne calcule le dcalage que si la date est valide begin DecodeDate(FDate, AYear, AMonth, ADay); { rcupre les lments de la date FirstDate := EncodeDate(AYear, AMonth, 1); { date du premier jour du mois FMonthOffset := 2 - DayOfWeek(FirstDate); { gnre le dcalage dans la grille end; Refresh; { toujours repeindre le contrle end;
} } } } } }
2 Ajoutez les instructions au constructeur et aux mthodes SetCalendarDate et SetDateElement qui appellent la nouvelle mthode de mise jour chaque changement de date :
constructor TSampleCalendar.Create(AOwner: TComponent); begin inherited Create(AOwner); { existait dj } { dautres initialisations ici } UpdateCalendar; { dfinit le bon dcalage } end; procedure TSampleCalendar.SetCalendarDate(Value: TDateTime); begin FDate := Value; { existait dj } UpdateCalendar; { appelait prcdemment Refresh } end; procedure TSampleCalendar.SetDateElement(Index: Integer; Value: Integer); begin FDate := EncodeDate(AYear, AMonth, ADay); { encode la date modifie } UpdateCalendar; { appelait prcdemment Refresh } end; end;
3 Ajoutez une mthode au calendrier renvoyant le numro du jour partir des coordonnes ligne/colonne dune cellule qui lui sont transmises :
function TSampleCalendar.DayNum(ACol, ARow: Integer): Integer; begin Result := FMonthOffset + ACol + (ARow - 1) * 7; { calcule le jour pour cette cellule} if (Result < 1) or (Result > MonthDays[IsLeapYear(Year), Month]) then Result := -1; { renvoie -1 si incorrect } end;
4 Vous pouvez dsormais calculer lendroit o saffichent les dates, et mettre jour DrawCell pour remplir les cellules :
procedure TCalendar.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState); var
50-9
TheText: string; TempDay: Integer; begin if ARow = 0 then { sil sagit de la ligne de titre ...} TheText := ShortDayNames[ACol + 1] { utilise le nom du jour } else begin TheText := ; { cellule vide par dfaut } TempDay := DayNum(ACol, ARow); { rcupre le numro pour cette cellule } if TempDay <> -1 then TheText := IntToStr(TempDay); { utilise ce numro sil est // valide } end; with ARect, Canvas do TextRect(ARect, Left + (Right - Left - TextWidth(TheText)) div 2, Top + (Bottom - Top - TextHeight(TheText)) div 2, TheText); end;
Si maintenant vous rinstallez le composant calendrier et le placez dans une fiche, les informations correspondant au mois en cours apparatront.
Notez que vous rutilisez la variable ADay prcdemment dfinie lors du dcodage de la date.
50-10
Guide du dveloppeur
Le seul inconvnient lencapsulation des manipulations les plus frquentes sous la forme de mthodes est le suivant : les mthodes ne sont accessibles qu lexcution. Nanmoins, de telles manipulations ne sont fastidieuses que lorsquelles sont souvent rptes, ce qui est rarement le cas au moment de la conception. Sagissant du calendrier, ajoutez les quatre mthodes suivantes pour grer le passage de mois en mois et danne en anne. Chacune de ces mthodes utilise la fonction IncMonth de faon lgrement diffrente pour incrmenter ou dcrmenter CalendarDate de mois en mois ou danne en anne. Aprs avoir incrment ou dcrment CalendarDate, dcodez la valeur de la date pour remplir les proprits Year, Month et Day avec les nouvelles valeurs correspondantes .
procedure TCalendar.NextMonth; begin DecodeDate(IncMonth(CalendarDate, 1), Year, Month, Day); end; procedure TCalendar.PrevMonth; begin DecodeDate(IncMonth(CalendarDate, -1), Year, Month, Day); end; procedure TCalendar.NextYear; begin DecodeDate(IncMonth(CalendarDate, 12), Year, Month, Day); end; procedure TCalendar.PrevYear; begin DecodeDate(CalendarDate, -12), Year, Month, Day); end;
Noubliez pas dajouter les dclarations des nouvelles mthodes la dclaration de la classe. Dsormais, si vous crez une application qui utilise le composant calendrier, vous pourrez facilement implmenter le passage de mois en mois ou danne en anne.
50-11
Dplacement de la slection
Le comportement reu en hritage dune grille gre le dplacement de la slection en rponse aux touches de direction enfonces ou aux clics de souris. Pour modifier le jour slectionn, vous devez modifier le comportement implicite. Pour grer les dplacements lintrieur du calendrier, vous devez surcharger la mthode Click de la grille. Lorsque vous surchargez une mthode telle que Click, en dpendance troite avec les interactions de lutilisateur, vous devez pratiquement toujours inclure un appel la mthode reue en hritage pour ne pas perdre le comportement standard. Le code suivant est une mthode Click surcharge pour la grille calendrier. Noubliez pas dajouter la dclaration de Click TSampleCalendar, en incluant aprs la directive override.
procedure TSampleCalendar.Click; var TempDay: Integer; begin inherited Click; { noubliez pas dappeler la mthode hrite ! } TempDay := DayNum(Col, Row); { rcupre le numro du jour de la cellule clique } if TempDay <> -1 then Day := TempDay; { change le jour sil est valide } end;
1 Dclarez lvnement ainsi quun champ pour le stocker et une mthode virtuelle pour lappeler :
type TSampleCalendar = class(TCustomGrid) private FOnChange: TNotifyEvent; protected procedure Change; dynamic; published property OnChange: TNotifyEvent read FOnChange write FOnChange;
50-12
Guide du dveloppeur
3 Ajoutez les instructions appelant Change la fin des mthodes SetCalendarDate et SetDateElement :
procedure TSampleCalendar.SetCalendarDate(Value: TDateTime); begin FDate := Value; UpdateCalendar; Change; { seule nouvelle instruction } end; procedure TSampleCalendar.SetDateElement(Index: Integer; Value: Integer); begin { instructions dfinissant les valeurs des lments } FDate := EncodeDate(AYear, AMonth, ADay); UpdateCalendar; Change; { ceci est nouveau } end; end;
Les applications qui utilisent le composant calendrier peuvent maintenant rpondre aux changements en associant des gestionnaires lvnement OnChange.
Dsormais, si lutilisateur clique sur une cellule vide ou tente de sy dplacer laide des touches de direction, le calendrier ne modifie pas la slection en cours.
50-13
50-14
Guide du dveloppeur
51
Chapitre 51
Chapitre
Lorsque vous souhaitez vous connecter avec des bases de donnes, travaillez avec les contrles orients donnes. Cest grce ces contrles que lapplication tablit un lien avec une partie spcifique dune base de donnes. Parmi les contrles sensibles aux donnes de Delphi, citons les libells, les botes de saisie, les botes liste, les botes options, les contrles de rfrence et les grilles. Vous avez galement la possibilit de construire vos propres contrles orients donnes. Pour plus dinformations sur lutilisation des contrles orients donnes, voir chapitre 15, Utilisation de contrles de donnes. Il existe diffrents niveaux dorientation donnes. Le plus lmentaire fonctionne en lecture seulement, permet de scruter des donnes et reflte ltat dune base de donnes. Lorientation donnes modifiables, permettant de modifier les donnes, est plus complexe car lutilisateur peut changer les valeurs stockes dans la base en manipulant le contrle. Notez galement que le degr dimplication de la base de donnes peut varier du cas le plus simple, un lien tabli avec un seul champ, aux cas plus complexes faisant intervenir des contrles enregistrements multiples. Ce chapitre illustre dabord le cas le plus simple, en crant un contrle en lecture simple qui est li un seul champ dun ensemble de donnes. Le contrle spcifique utilis sera le calendrier TSampleCalendar cr dans le chapitre 50, Personnalisation dune grille. Vous pouvez aussi utiliser le contrle calendrier standard de la page Exemples de la palette des composants, TCalendar. Ce chapitre continue ensuite avec une explication sur la manire de faire dun nouveau contrle pour scruter les donnes un contrle de modification des donnes.
51-1
51-2
Guide du dveloppeur
1 Ajoutez la dclaration de la proprit ainsi quune donne membre private pour contenir la valeur :
type TDBCalendar = class(TSampleCalendar) private FReadOnly: Boolean; public constructor Create(AOwner: TComponent); override;
{ champ de stockage interne } { doit surcharger pour dfinir // les valeurs par dfaut }
published property ReadOnly: Boolean read FReadOnly write FReadOnly default True; end; constructor TDBCalendar.Create(AOwner: TComponent); begin inherited Create(AOwner); { appelez toujours le constructeur hrit ! } FReadOnly := True; { dfinit la valeur par dfaut } end;
2 Surchargez la mthode SelectCell pour inhiber la slection si le contrle est accessible en lecture seulement. Lutilisation de SelectCell est explique dans Exclusion des cellules vides la page 50-13.
function TDBCalendar.SelectCell(ACol, ARow: Longint): Boolean; begin if FReadOnly then Result := False { slection impossible si accs en // lecture seule } else Result := inherited SelectCell(ACol, ARow); { sinon, utilise la mthode hrite } end;
51-3
Noubliez pas dajouter la dclaration de SelectCell la dclaration de la classe de TDBCalendar, et ajoutez la directive override. Si vous ajoutez maintenant le calendrier une fiche, vous vous rendez compte que le composant ignore les clics de souris et les frappes de touches. Et il ne met plus jour la position de la slection lorsque vous changez la date.
Le calendrier nautorise toujours pas les modifications directes de lutilisateur mais les modifications de la date effectues via les proprits de date sont prises en compte. Vous disposez maintenant dun contrle en lecture seulement tout fait oprationnel. Vous voil prt ajouter les fonctionnalits servant scruter les donnes.
51-4
Guide du dveloppeur
1 Dclaration du champ de classe de la classe 2 Dclaration des proprits daccs 3 Initialisation du lien de donnes
Avant de compiler lapplication, vous devez ajouter DB et DBCtrls la clause uses de lunit.
51-5
Dclarez les proprits DataSource et DataField ainsi que leurs mthodes dimplmentation, puis crivez ces mthodes en tant que simples botes lettres vers les proprits correspondantes de la classe lien de donnes :
Maintenant que sont tablis les liens entre le calendrier et son lien de donnes, il reste une tape importante franchir. Vous devez construire la classe lien de donnes au moment de la construction du contrle calendrier et le dtruire avant de dtruire ce mme contrle.
51-6
Guide du dveloppeur
constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; constructor TDBCalendar.Create(AOwner: TComponent); begin FDataLink := TFieldDataLink.Create; { construit lobjet lien de donnes } FDataLink.Control := self; { informe le lien de donnes sur le calendrier } FReadOnly := True; { existe dj } end; destructor TDBCalendar.Destroy; begin FDataLink.Free; { dtruit toujours dabord les objets ayant un propritaire... } inherited Destroy; { ...puis appelle le destructeur hrit } end;
Vous avez maintenant un lien de donnes complet. Il vous reste indiquer au contrle les donnes quil doit lire dans le champ li. La section suivante vous explique comment procder.
51-7
destructor TDBCalendar.Destroy; begin FDataLink.OnDataChange := nil; { dtache le gestionnaire avant de dtruire lobjet } FDataLink.Free; { dtruit toujous dabord les objets ayant un propritaire... } inherited Destroy; { ...puis appelle le destructeur hrit } end; procedure TDBCalendar.DataChange(Sender: TObject); begin if FDataLink.Field = nil then { sil ny a pas de champ attribu... } CalendarDate := 0 { ...dfinit une date incorrecte } else CalendarDate := FDataLink.Field.AsDateTime; { sinon, dfinit le calendrier par la // date } end;
51-8
Guide du dveloppeur
51-9
begin MyMouseDown := OnMouseDown; if Assigned(MyMouseDown then MyMouseDown(Self, Button, Shift, X, Y); end; end;
Lorsque MouseDown rpond un message indiquant la manipulation de la souris, la mthode MouseDown hrite est appele uniquement si la proprit ReadOnly du contrle est False et si lobjet lien de donnes est en mode dition, cest--dire si le champ peut tre modifi. Si le champ ne peut tre modifi, le code mis par le programmeur dans le gestionnaire de lvnement OnMouseDown , sil en existe un, est excut.
Lorsque KeyDown rpond un message indiquant la manipulation du clavier, la mthode KeyDown hrite est appele uniquement si la proprit ReadOnly du contrle vaut False, si la touche appuye est une des touches de dplacement du curseur et si lobjet lien de donnes est en mode dition, cest--dire si le champ peut tre modifi. Si le champ ne peut tre modifi ou si une autre touche a t
51-10
Guide du dveloppeur
presse, le code mis par le programmeur dans le gestionnaire de lvnement OnKeyDown, sil en existe un, est excut.
1 Pour rpercuter dans la valeur du champ une modification effectue sur la valeur du calendrier, ajoutez une mthode UpdateData la section private du composant calendrier :
type TDBCalendar = class(TSampleCalendar); private procedure UpdateData(Sender: TObject); end;
51-11
2 Ecrivez la mthode Change, appelant la mthode Modified qui informe lensemble de donnes que celles-ci ont chang, puis appelle la mthode Change hrite :
procedure TDBCalendar.Change; begin FDataLink.Modified; inherited Change; end;
La VCL possde des ID de message dfinis pour les oprations sur les contrles. Par exemple, le message CM_EXIT est envoy au contrle lorsque lutilisateur quitte celui-ci. Vous pouvez crire un gestionnaire qui rponde ce message. Et ensuite, lorsque lutilisateur quitte le contrle, la mthode CMExit, gestionnaire du message CM_EXIT, rpondra en mettant jour lenregistrement dans lensemble de donnes avec les valeurs modifies dans la classe lien de donnes sur un champ. Pour plus dinformations sur les gestionnaires de messages, voir chapitre 46, Gestion des messages. Pour mettre jour lensemble de donnes depuis un gestionnaire de message, suivez ces instructions :
51-12
Guide du dveloppeur
Dans la CLX, TWidgetControl possde une mthode DoExit protge qui est appele quand la focalisation en saisie quitte le contrle. Cette mthode appelle le gestionnaire de lvnement OnExit. Vous pouvez redfinir cette mthode pour actualiser lenregistrement dans lensemble de donnes avant la gnration du gestionnaire dvnement OnExit. Pour mettre jour lensemble de donnes quand lutilisateur quitte le contrle, suivez les tapes ci-aprs :
51-13
51-14
Guide du dveloppeur
52
Chapitre 52
Chapitre
Il est pratique de transformer une bote de dialogue frquemment sollicite en un composant que vous pourrez ajouter dans la palette des composants. Ainsi, vos composants bote de dialogue fonctionneront exactement comme ceux des botes de dialogue standard. Lobjectif ici est de crer un composant simple quun utilisateur peut ajouter un projet et dont il peut dfinir les proprits lors de la conception. La transformation dune bote de dialogue en composant ncessite les tapes suivantes :
1 2 3 4
Dfinition de linterface du composant Cration et recensement du composant Cration de linterface du composant Test du composant
A lexcution, le composant enveloppe de Delphi, associ la bote de dialogue cre et excute celle-ci en lui transmettant les donnes spcifies par lutilisateur. Le composant bote de dialogue est donc la fois rutilisable et personnalisable. Dans ce chapitre, vous allez voir comment crer un composant enveloppe autour de la fiche gnrique A propos de... disponible dans le rfrentiel dobjets de Delphi.
Remarque
Copiez les fichiers ABOUT.PAS et ABOUT.DFM dans votre rpertoire de travail. Il ny a pas grand chose dire concernant la conception de la bote de dialogue enveloppe par un composant. Dans un tel contexte, nimporte quelle fiche peut fonctionner comme une bote de dialogue.
52-1
52-2
Guide du dveloppeur
Pour linstant, le nouveau composant possde uniquement les fonctionnalits intgres TComponent. Cest le composant non visuel le plus simple. Dans la section suivante, vous allez crer linterface entre le composant et la bote de dialogue.
1 Inclusion de lunit de la fiche 2 Ajout des proprits de linterface 3 Ajout de la mthode Execute
Lunit fiche dclare toujours une instance de la classe de la fiche. Dans le cas de la bote A propos de, la classe de la fiche est TAboutBox, et lunit About doit inclure la dclaration suivante :
var AboutBox: TAboutBox;
Ainsi en ajoutant About la clause uses, vous rendez disponible AboutBox au composant enveloppe.
52-3
changer. En dfinissant ces donnes sous la forme de proprits, vous donnez aux dveloppeurs la possibilit de dfinir des donnes au moment de la conception qui, lors de lexcution, seront transmises par lenveloppe la bote de dialogue. La dclaration dune proprit dinterface ncessite deux ajouts la dclaration de classe du composant : Un champ de classe priv qui est une variable utilise par lenveloppe pour stocker la valeur de la proprit. La dclaration published de la proprit elle-mme qui indique son nom et le champ utiliser pour le stockage. De telles proprits dinterface nont pas besoin de mthodes daccs. Elles accdent directement aux donnes stockes. Par convention, le champ qui stocke la valeur de la proprit porte le mme nom que la proprit, mais prcd de la lettre F. Le champ et la proprit doivent avoir le mme type. Par exemple, la dclaration dune proprit dinterface de type entier appele Year, est la suivante :
type TMyWrapper = class(TComponent) private FYear: Integer; { donne membre pour les donnes de la proprit Year } published property Year: Integer read FYear write FYear; { la proprit et son stockage } end;
Sagissant de votre bote A propos de, vous devez disposer de quatre proprits de type string pour le nom du produit, les informations de version, les informations de copyright et les commentaires ventuels.
type TAboutBoxDlg = class(TComponent) private FProductName, FVersion, FCopyright, FComments: string; { dclare les donnes membres } published property property property property end; ProductName: string read FProductName write FProductName; Version: string read FVersion write FVersion; Copyright: string read FCopyright write FCopyright; Comments: string read FComments write FComments;
Si vous installez votre composant dans la palette des composants et si vous le placez dans une fiche, vous pourrez dfinir les proprits, et ces valeurs apparatront de faon permanente dans la fiche. Ainsi, lors de lexcution de la bote de dialogue quil enveloppe, le composant pourra les utiliser.
52-4
Guide du dveloppeur
boolenne appele Execute qui renvoie True si lutilisateur clique sur OK, ou False sil annule la bote de dialogue. La dclaration de la mthode Execute ressemble toujours ceci :
type TMyWrapper = class(TComponent) public function Execute: Boolean; end;
Limplmentation minimale de la mthode Execute doit construire la fiche de la bote de dialogue, puis afficher celle-ci en tant que bote de dialogue modale avant de renvoyer True ou False, selon la valeur renvoye par ShowModal. Voici limplmentation minimale de la mthode Execute pour une fiche bote de dialogue de type TMyDialogBox :
function TMyWrapper.Execute: Boolean; begin DialogBox := TMyDialogBox.Create(Application); try Result := (DialogBox.ShowModal = IDOK); finally DialogBox.Free; end; end;
{ construit la fiche } { excute; dfinit le rsultat selon la //faon de fermer } { restitue la fiche }
Notez lutilisation dun bloc try..finally qui vrifie que lapplication restitue lobjet bote de dialogue mme si une exception se produit. En gnral, lorsque vous construisez un objet de cette manire, vous devez utiliser un bloc try..finally pour protger le bloc de code et tre sr que lapplication libre toutes les ressources quelle alloue. En pratique, il y a davantage de code dans le bloc try..finally. Plus spcifiquement, avant lappel ShowModal, le composant enveloppe doit dfinir certaines proprits de la bote de dialogue en fonction de ses propres proprits dinterface. A linverse, quand ShowModal rend la main, le composant enveloppe dfinit certaines de ses proprits dinterface en fonction du rsultat de lexcution de la bote de dialogue. Dans le cas de la bote A propos de, vous devez utiliser les quatre proprits dinterface du composant enveloppe pour dfinir le contenu des libells de la bote de dialogue. Comme cette dernire ne renvoie aucune information lapplication, il ny a rien de particulier faire aprs lappel ShowModal. Dans la partie publique de la classe TAboutDlg, ajoutez la dclaration pour la mthode Execute :
type TAboutDlg = class(TComponent) public function Execute: Boolean; end; function TAboutBoxDlg.Execute: Boolean;
52-5
Test du composant
begin AboutBox := TAboutBox.Create(Application); { construit la bote A propos de try if ProductName = then { si le nom du produit est vide... ProductName := Application.Title; { ...utilise la place le titre de lapplication AboutBox.ProductName.Caption := ProductName; { copie le nom du produit AboutBox.Version.Caption := Version; { copie les infos de version AboutBox.Copyright.Caption := Copyright; { copie les infos de copyright AboutBox.Comments.Caption := Comments; { copie les commentaires AboutBox.Caption := About + ProductName; { dfinit le titre de la bote with AboutBox do begin ProgramIcon.Picture.Graphic := Application.Icon; { copie licne Result := (ShowModal = IDOK); { excute et dfinit le rsultat end; finally AboutBox.Free; { restitue la bote de dialogue A propos de end; end;
} } } } } } } } } }
Test du composant
Une fois le composant bote de dialogue install, vous pouvez lutiliser comme nimporte quelle autre bote de dialogue commune, en le plaant sur une fiche et en lexcutant. Un moyen rapide de vrifier le fonctionnement de la bote A propos de consiste ajouter un bouton de commande dans une fiche et excuter la bote de dialogue lorsque lutilisateur clique sur ce bouton. Par exemple, si vous avez cr une bote de dialogue A propos de, et si vous lavez ajout la palette des composants, vous pouvez tester son fonctionnement en suivant les tapes ci-dessous :
1 Crez un nouveau projet. 2 Placez un composant A propos de dans la fiche principale. 3 Placez un bouton de commande dans la fiche. 4 Double-cliquez sur le bouton de commande pour crer un gestionnaire dvnements vide. 5 Dans le gestionnaire dvnements, entrez la ligne de code suivante :
AboutBoxDlg1.Execute;
6 Excutez lapplication.
Lorsque la fiche principale apparat, cliquez sur le bouton de commande. La bote A propos de saffiche avec licne projet par dfaut et Project1 comme titre. Choisissez OK pour fermer la bote de dialogue. Vous pouvez pousser plus loin le test du fonctionnement du composant en dfinissant les diffrentes proprits du composant A propos de et en excutant une nouvelle fois lapplication.
52-6
Guide du dveloppeur
Index
Symboles
&, caractre 3-21, 6-38 ... (points de suspension), bouton 15-25 .DLL Apache 13-12 dploiement 13-11 installation 13-6 .DLL, fichiers cration 5-10 prdfinies 6-31 recensement 6-32 actions de rpartition 29-4 actions, 6-20 Actions, proprit 28-5 activation juste--temps 39-4 39-5 Active Server Pages 37-1 Active, proprit client, sockets 32-7 ensembles de donnes 18-5 serveur, sockets 32-8 sessions 20-20 ActiveAggs, proprit 23-16 ActiveFlag, proprit 16-22 ActiveForms 38-1, 38-6 crer 38-2 ActiveX 33-13, 38-1 applications Web 33-14 compar ASP 37-8 ou InternetExpress 25-36 25-37 ActiveX , page de la palette de composants 3-33, 3-34 ActiveX Data Objects Voir ADO ActiveX, contrles 33-23 incorporation dans le document HTML 28-15 ActiveX, page de la palette de composants 35-5 ActnList, unit 6-32 actualisation actions 6-30 adaptateur utilisateur final 29-4 adaptateurs actions 29-9 applications Web 29-8 champs 29-8 enregistrements 29-9 erreurs 29-9 adaptateurs dapplication 29-4 adaptateurs Web actions 29-9 champs 29-8 enregistrements 29-9 erreurs 29-9 AdapterPageProducer 29-3 Add, mthode chanes 3-58 menus 6-46 persistantes, colonnes 15-22 AddAlias, mthode 20-28 AddFieldDef, mthode 18-45 AddFontResource, fonction 13-16 AddIndexDef, mthode 18-45 AddObject, mthode 3-59 AddParam, mthode 18-62 AddPassword, m thode 20-25 AddRef, m thode 4-22, 4-26, 4-27 IUnknown 33-4 Address, proprit client, sockets 32-6 TSocketConnection 25-29 AddStandardAlias, mthode 20-28 AddStrings, mthode 3-58 ADO 14-2, 18-2, 21-1, 21-2, 21-3 composants 21-121-22 prsentation 21-2 dploiement 13-7 fournisseurs 21-3, 21-4 fournisseurs de ressources 39-6 stockages de donnes 21-3, 21-4 transactions implicites 21-7 21-8 ADO, connexions 21-321-9 dpassement de dlais 21-6 vnements 21-821-9 se connecter aux stockages de donnes 21-321-8 ADO, ensembles de donnes 21-1021-19 connexion 21-11 fichiers de donnes 21-16 21-17 ADO, objets objet connexion 21-5 Recordset 21-1121-12 ADO, page de la palette de composants 3-33, 14-2, 21-2 ADOExpress 21-1 adressage absolu 10-11 adresses connexions par socket 32-3, 32-4 adresses IP noms dhte 32-5
Index
A
A propos de, bote de dialogue 52-2, 52-3 ajout de proprits 52-4 abonnements par utilisateur 35-17 permanents 35-17 temporaires 35-16 Abort, procdure empcher les modifications 18-23 AbortOnKeyViol, proprit 20-60 AbortOnProblem, proprit 20-60 About, unit 52-3 AboutDlg, unit 52-2 abstract, classes 40-3 acclrateurs 3-21, 6-38 accs aux donnes composants 5-11, 14-1 mcanismes 5-115-12, 14-114-2, 18-218-3 multiplates-formes 13-8, 14-2 accs aux donnes, composants threads 9-5 AccsBD, page de la palette de composants 3-32, 14-2, 25-3 Acquire, mthode 9-8 Action 6-19 Action, proprit 3-20 ActionBand 6-20 ActionLink, proprit 3-20 actions 6-266-56 actualisation 6-30 adaptateurs Web 29-9 classes dactions 6-30 excution 6-28
I-1
ADT, champs 19-26, 19-27 19-29 affichage 15-26, 19-27 aplanissement 15-26 champs persistants 19-28 affectation des touches 12-9 affectations variables objet 3-11 Affecter donnes locales, commande 23-16 affichage en tableau (grilles) 3-48 AfterApplyUpdates, vnement 23-38, 24-9 AfterCancel, vnement 18-24 AfterClose, vnement 18-5 AfterConnect, vnement 17-3, 25-32 AfterDelete, vnement 18-23 AfterDisconnect, vnement 17-4, 25-33 AfterDispatch, vnement 28-6, 28-9 AfterEdit, vnement 18-20 AfterGetRecords, vnement 24-9 AfterInsert, vnement 18-21 AfterOpen, vnement 18-5 AfterPost, vnement 18-24 AfterScroll, vnement 18-6 agent Web 5-13, 27-127-2 AggFields, proprit 23-16 Aggregates, proprit 23-14, 23-16 agrgation 33-9 ensembles de donnes client 23-1323-16 interfaces 4-25 agrgats maintenus 14-18, 23-1323-16 champs agrgat 19-12 oprateurs de synthse 23-14 sous-totaux 23-15 spcification 23-1423-15 valeurs 23-16 aide aide 5-31 aide contextuelle 3-48 bulles daide 3-48 conseils daide 3-48 informations de type 34-9 aide en ligne 47-4 aide par mot cl 5-29 Ajout de champs, bote de dialogue 19-5 I-2
Ajouter linterface, commande 25-19 Ajouter au rfrentiel, commande 5-22 alias BDE 20-3, 20-15, 20-28 20-30 cration 20-28 locaux 20-28 spcification 20-15, 20-1620-17 suppression 20-29 diteur de bibliothques de types 34-11, 34-19, 34-26 34-27 AliasName, proprit 20-15 Align, proprit 3-20, 6-4 barres dtat 3-47 contrles texte 7-8 volets 6-49 Alignment, proprit 3-38 barres dtat 3-48 champs 19-13 contrles de texte format 3-35 contrles mmo orients donnes 15-10 en-ttes de colonne 15-24 grilles de dcision 16-13 grilles de donnes 15-23 mmos 3-35 AllowAllUp, proprit 3-39 boutons outil 6-53 turboboutons 6-51 AllowDelete, proprit 15-33 AllowGrayed, proprit 3-40 AllowInsert, proprit 15-33 alTop, constante 6-49 Anchor, proprit 3-20 ancrage 7-4 annes bissextiles 50-8 ANSI, jeu de caractres 12-3 AnsiChar 4-43 AnsiString 4-45 Apache, applications 27-7 dboguer 27-9 Apache, DLL 13-11, 27-7 dploiement 13-12 apartment, modle de thread 36-9 Append, mthode 18-21, 18-23 Insert et 18-22 AppendRecord, mthode 18-25 application niveau triple Voir applications multiniveaux
application de rpartition de sockets 25-10, 25-15, 25-29 Application, variable 6-3, 28-3 applications agent Web 28-128-22 Apache 27-7, 28-2, 29-2 applications client Web 25-3625-48 base de donnes 14-1 client/serveur 25-1 protocoles de rseau 20-17 COM 5-15, 36-136-19 cration 3-25 dploiement 13-1 distribues 39-1 fichiers 13-3 graphiques 40-8, 45-1 informations dtat 3-47 ISAPI 27-7, 28-1, 29-2 MDI 5-2 MTS 5-16 multiniveaux 25-125-48 prsentation 25-4 multiplates-formes 10-1 10-34 cration 10-1 multithreads 9-1 NSAPI 27-7, 28-1, 28-2, 29-2 portage 10-19 ralisation de palettes 45-5, 45-6 SDI 5-2 serveur Web 5-12, 5-13, 29-2 service 5-4 tutoriel WebSnap 29-20 WebSnap 29-129-28 applications base de fichiers 14-1014-12 ensembles de donnes client 23-3923-42 applications niveau double 14-3, 14-10, 14-14 applications niveau unique 14-3, 14-10, 14-14 base de fichiers 14-11 applications Apache crer 28-2, 29-2 applications bidirectionnelles mthodes 12-8 proprits 12-6 applications client bibliothques de types 34-22, 35-235-6 COM 33-10, 35-135-18
Guide du dveloppeur
comme applications serveur Web 25-36 cration 25-2625-35 crer 35-135-18 fourniture de requtes 24-7 objets transactionnels 39-2 protocoles de rseau 20-17 services Web 31-931-11 simples 25-37 applications client simples 25-2 applications client/serveur 5-11 applications COM 33-3, 33-19 applications COM+ 39-7, 39-24 applications console 5-4 applications de bases de donnes 5-11, 14-1 base de fichiers 14-10 14-12, 21-1621-17, 23-39 23-42 architecture 14-614-17, 25-36 dploiement 13-7 distribues 5-12 mise lchelle 14-13 multiniveaux 25-4 portage 10-29 XML et 26-126-12 applications distantes TCP/IP 32-1 applications distribues base de donnes 5-12 MTS et COM+ 5-16, 39-1 applications GUI 3-25 applications internationales 12-1 abrviations et 12-10 conversion des saisies clavier 12-9 localisation 12-13 applications ISAPI crer 28-1, 29-2 applications Linux 10-1 applications multiniveaux 14-3, 14-15 applications Web 25-36 25-48 construction 25-38, 25-3925-48 avantages 25-2 composants 25-3 construction 25-1225-35 dploiement 13-11 licences serveur 25-3 paramtres 23-33 prsentation 25-4
rappels 25-20 relations matre/dtail 25-22 applications multiplates-formes 3-32 applications multithreads sessions 20-14, 20-3220-34 applications NSAPI crer 28-1, 28-2, 29-2 applications portables 10-1 10-34 applications serveur COM 36-136-19 multiniveaux 25-5 recensement 25-13, 25-25 25-26 services Web 31-231-9 applications serveur agent Web 28-1 accs aux bases de donnes 28-18 ajouter un projet 28-3 architecture 28-3 cration de rponses 28-8 crer 28-128-3 envoi de donnes aux 28-11 envoi de fichiers 28-13 gestion dvnements 28-5, 28-7, 28-9 gestion des connexions de base de donnes 28-19 interrogation de tables 28-22 modles 28-3 de rponse 28-15 prsentation 28-128-4 rpartiteur Web 28-5 applications serveur Web 5-12, 5-13, 27-127-10, 28-2, 29-2 crer 29-2 dboguer 27-7 emplacements des ressources 27-3 multiniveaux 25-3825-48 prsentation 27-627-10 standards 27-3 types 27-6 applications service 5-45-9 code exemple 5-5, 5-7 exemple 5-7 applications Web ActiveX 33-14, 38-1, 38-16 38-18 clients multiniveaux 25-37 adaptateurs 29-8 ASP 37-1
base de donnes 25-3625-48 objet 28-3 applications WebSnap prsentation 29-129-28 applications Windows 10-1 Apply, mthode 20-52 ApplyRange, mthode 18-40 ApplyUpdates, mthode 10-33, 20-38 ensembles de donnes BDE 20-41 ensembles de donnes client 21-14, 23-8, 23-24, 23-2423-25, 24-4 fournisseurs 23-25, 24-4, 24-9 TDatabase 20-40 TXMLTransformClient 26-11 AppServer, proprit 23-39, 24-3, 25-20, 25-33 arborescence XML 29-1 arborescence XSL 29-1 Arc, mthode 8-4 architecture applications BDE 20-120-2 applications de bases de donnes 14-614-17, 20-1 20-2 client 25-5 serveur 25-6 applications serveur agent Web 28-3 multiniveau 25-5, 25-6 base sur le Web 25-36 architecture multiniveau 25-5, 25-6 arrt des threads 9-12 Arrire-plan 6-23 arrire-plan 12-10 transparent 12-10 as, mot rserv liaison anticipe 25-34 AS_ApplyUpdates, mthode 24-4 AS_DataRequest, mthode 24-4 AS_Execute, mthode 24-4 AS_GetParams, mthode 24-4 AS_GetProviderNames, mthode 24-4 AS_GetRecords, mthode 24-4 AS_RowRequest, mthode 24-4 ASCII, tables 20-6 ASP 37-137-9 compar ActiveX 37-8
Index
I-3
compar au courtier Web 37-1 documents HTML 37-1 lments intrinsques 37-2 37-3, 37-437-7 gnration de pages 37-3 interface utilisateur 37-1 langage de script 37-3 objet Application 37-4 objet Request 37-5 objet Response 37-537-6 objet Server 37-7 objet Session 37-637-7 performances 37-1 script 33-13 Assign, m thode listes de chanes 3-58 AssignedValues, proprit 15-25 AssignValue, mthode 19-19 Associate, proprit 3-37 atomicit transactions 14-5, 39-10 Attributes, proprit paramtres 18-54, 18-62 TADOConnection 21-7 attributs diteurs de proprits 47-11 attributs dactivation 39-7 attributs de champs 19-15 19-17 affectation 19-16 suppression 19-16 attributs de transaction modules de donnes MTS 25-17 attributs des champs dans les paquets de donnes 24-7 attributs transactionnels 39-10 39-12 dfinir 39-11 audit de code modles 5-3 AutoCalcFields, proprit 18-26 AutoComplete, proprit 25-8 AutoDisplay, proprit 15-10, 15-11 AutoEdit, proprit 15-6 AutoHotKeys, proprit 6-38 Automation compatibilit de type 34-13 descriptions de types 33-12 IDispatch, interface 36-15 interfaces 36-1336-16 I-4
Guide du dveloppeur
liaison tardive 36-15 objets Active Server 37-2 optimisation 33-18 vrification de types 36-14 AutoPopup, proprit 6-55 AutoSelect, proprit 3-35 AutoSessionName, proprit 20-20, 20-34, 28-19 AutoSize, proprit 3-20, 3-35, 6-5, 13-15, 15-9 .AVI, fichiers 8-34 AVI clips 3-51
B
balises HTML transparentes conversion 28-16 paramtres 28-15 prdfinies 28-15 syntaxe 28-15 balises transparentes pour HTML prdfinition 25-4725-48 bandes daction 6-19, 6-21 Bands, proprit 3-41, 6-54 barre doutils 6-21 barre de dfilement fentres du texte 7-87-9 barres dtat 3-47 internationalisation 12-9 barres doutils 3-40, 6-19, 6-48 ajout 6-516-53 ajout de volets comme 6-49 6-51 conception 6-486-56 dfinition des marges 6-50 dsactivation des boutons 6-52 insertion de boutons 6-49, 6-51, 6-52 listes dactions 6-20 masques 6-55 menus contextuels 6-55 outil de dessin par dfaut 6-50 transparentes 6-52, 6-54 turboboutons 3-39 barres de dfilement 3-36 barres de progression 3-48 barres gradues 3-36 barres gradues horizontales 3-37 barres gradues verticales 3-37 barres multiples 3-41, 6-48 ajout 6-536-54 conception 6-486-56
configuration 6-54 masques 6-55 bascules 6-51, 6-53 base de donnes composants 20-320-4 base de donnes locale accs 20-6 support BDE 20-620-8 base de donnes, pilotes dbExpress 22-4 bases de donnes 5-11, 14-1 14-6, 51-1 base de fichiers 14-3 accs aux 18-1 accs non autoris 17-4 ajout de donnes 18-25 alias et 20-16 applications Web et 28-18 choix 14-3 connexion 17-117-16 connexion aux 14-4, 17-4 17-6 connexions implicites 17-2 gnration de rponses HTML 28-1828-22 identification 20-1520-17 nom 20-16 proprits daccs 51-551-6 relationnelles 14-1 scurit 14-414-5 transactions 14-514-6 types 14-3 bases de donnes locales 14-3 alias 20-28 renommer les tables 20-8 bases de donnes relationnelles 14-1 .bashrc 10-17 BatchMove, mthode 20-8 BDE alias 20-3, 20-15, 20-18, 20-2820-30 cration 20-28 disponibilit 20-29 requtes htrognes 20-11 spcification 20-1620-17 suppression 20-29 appels API 20-1, 20-5 connexions aux bases de donnes 20-1420-18 ensemble de donnes 20-2 20-3 fermeture des connexions 20-22
fournisseurs de ressources 39-6 gestion des connexions 20-22 mises jour en mmoire cache gestion des erreurs 20-43 noms de pilotes 20-15 oprations groupes 20-55 20-60 ouverture de connexions de bases de donnes 20-22 pilotes 20-1, 20-15 pilotes ODBC 20-18 proprits de la connexion par dfaut 20-21 rcupration des donnes 20-11 requtes htrognes 20-10 20-11 sessions 20-18 transactions implicites 20-34 types de table 20-6 utilitaires 20-6220-63 Voir moteur de bases de donnes Borland BDE, ensembles de donnes 14-1 BDE, page de la palette de composants 3-33, 14-1 BDEalias spcification 20-15 BeforeApplyUpdates, vnement 23-37, 24-9 BeforeCancel, vnement 18-24 BeforeClose, vnement 18-5 BeforeConnect, vnement 17-3, 25-32 BeforeDelete, vnement 18-23 BeforeDisconnect, vnement 17-4, 25-33 BeforeDispatch, vnement 28-5, 28-7 BeforeEdit, vnement 18-20 BeforeGetRecords, vnement 24-9 BeforeInsert, vnement 18-21 BeforeOpen, vnement 18-5 BeforePost, vnement 18-24 BeforeScroll, vnement 18-6 BeforeUpdateRecord, vnement 20-38, 20-46, 23-26, 24-13 BeginDrag, mthode 7-1 BeginRead, mthode 9-9 BeginTrans, mthode 17-7
BeginWrite, mthode 9-9 Beveled 3-38 BevelKind, proprit 3-24 bibliothque Qt 10-25 bibliothques contrles personnaliss 40-5 bibliothques de types 33-11, 33-12, 33-16, 33-19, 34-1 34-31 accs 33-17 ajout de proprits et mthodes 34-2434-25 avantages 33-18 contenu 33-16, 34-1, 35-5 35-6 contrles ActiveX 38-3 cration 33-16 crer 34-2134-22 dployer 34-3034-31 drecensement 33-19 enregistrer 34-29 exporter au format IDL 34-30 gnres par les experts 34-2 IDL et ODL 33-16 importer 35-235-6 inclure comme ressource 34-3034-31 navigateurs 33-18 objets Active Server 37-3 objets transactionnels 39-3 optimisation des performances 34-10 outils 33-19 ouvrir 34-22 quand les utiliser 33-17 recensement 33-19 recensement des objets 33-18 recenser 34-29 types autoriss 34-1334-15 unit _TLB 34-3, 34-22, 35-2, 35-535-6, 36-16 visualisation 33-19 bibliothques javascript 25-38, 25-4025-41 emplacement 25-40, 25-41 bin rpertoire 10-18 BinaryOp, m thode 4-33 biseaux 3-51 bitmap, objets 8-3 bitmaps 3-50, 8-198-20, 45-4 ajout aux composants 47-4 ajout du dfilement 8-18 apparition dans lapplication 8-2
association aux chanes 3-59, 7-14 barres doutils 6-52 chargement 45-5 compars aux contrles graphiques 49-3 dans les cadres 6-17 dfilement 8-18 dfinition de la taille initiale 8-18 dessin sur 8-19 destruction 8-22 vnements dessins par le propritaire 7-17 hors cran 45-645-7 internationalisation 12-11 pinceaux 8-9 proprits des pinceaux 8-8, 8-9 remplacement 8-21 ScanLine, proprit 8-10 surfaces de dessin 45-4 temporaires 8-18, 8-19 vides 8-18 BLOB 15-10, 15-11 BLOB, champs 15-2, 15-3 affichage des graphiques 15-11 affichage des valeurs de champs 15-10, 15-11 extraction la demande 24-6 BLOBS mise en cache 20-4 BlockMode, proprit 32-10, 32-11 bmBlocking 32-11 BMPDlg, unit 8-22 bmThreadBlocking 32-11 Bof, proprit 18-7, 18-8, 18-10 bote dtat des threads 9-13 botes options 3-42, 15-2, 15-13 de rfrence 15-24 dessines par le propritaire 7-13 measure-item, vnements de type 7-16 styles de variant 7-14 orientes donnes 15-12 15-15 botes options de rfrence 15-3, 15-1315-15 champs de rfrence 15-14 dans les grilles de donnes 15-24 I-5
Index
remplissage 15-24 sources de donnes secondaires 15-14 botes peindre 3-26, 3-51 botes de dialogue 52-152-6 communes 3-52 cration 52-1 dfinition de ltat initial 52-2 diteurs de proprit comme 47-10 internationalisation 12-9, 12-11 multipages 3-46 standard Windows 52-2 cration 52-2 excution 52-4 botes de dialogue communes 52-1 botes de dialogue multipages 3-46 botes de dialogue standard 3-52, 52-2 cration 52-2 excution 52-4 botes graphiques 15-2 botes groupe 3-44 botes liste 3-41, 15-2, 15-13, 50-1 dplacement des lments 7-3 dessines par le propritaire 7-13 draw-item, vnements 7-17 measure-item, vnements de type 7-16 styles de variant 7-14 glissement des lments 7-2, 7-3 orientes donnes 15-12 15-15 proprits de stockage exemple 6-10 remplissage 15-12 botes liste de cases cocher 3-41 botes liste de rfrence 15-3, 15-1315-15 champs de rfrence 15-14 sources de donnes secondaires 15-14 Bookmark, proprit 18-11 BookmarkValid, mthode 18-11 boolennes valeurs 51-4 I-6
BorderWidth, proprit 3-45 bordures volets 3-45 boucle des messages threads 9-5 boutons 3-383-40 affectation de glyphes aux 6-50 ajout aux barres doutils 6-49, 6-51, 6-52 dsactivation sur les barres doutils 6-52 et barres doutils 6-48 navigateur 15-33 boutons bitmap 3-39 boutons outil 6-52 ajout dimages 6-52 dans plusieurs lignes 6-52 dsactivation 6-52 tat initial, dfinition 6-52 forcer le passage la ligne 6-52 groupe/interrompre le groupe 6-53 obtenir de laide avec 6-55 utilisation comme bascules 6-53 boutons radio 3-40, 15-3 orients donnes 15-16 15-17 regroupement 3-44 slection 15-16 boutons souris 8-25 clic 8-26, 8-27 vnements de dplacement souris et 8-27 relchs 8-27 .BPL, fichiers 11-1, 13-3 Brush, proprit 3-51, 8-4, 8-8, 45-3 BrushCopy, mthode 45-3, 45-7 bulles daide 3-48 ButtonAutoSize, proprit 16-11 ButtonStyle, proprit grilles de donnes 15-23, 15-24, 15-25 ByteType 4-48
C
cabinets 38-18 CacheBlobs, proprit 20-4 CachedUpdates, proprit 10-33, 20-37 cadres 6-14, 6-156-18
et modles de composants 6-16, 6-17 graphiques 6-17 partage et distribution 6-18 ressources 6-17 calendriers 50-150-13 ajout de dates 50-550-10 dfinition des proprits et vnements 50-2, 50-7, 50-11 en lecture seule 51-351-4 manipulation 50-1050-13 redimensionnement 50-4 slection du jour en cours 50-10 CanBePooled, mthode 39-9 Cancel, mthode 18-21, 18-24, 21-21 Cancel, proprit 3-39 CancelBatch, mthode 10-33, 21-14, 21-16 CancelRange, mthode 18-40 CancelUpdates, mthode 10-33, 20-38, 21-14, 23-7 canevas 40-8, 45-2, 45-3 ajout de formes 8-118-12, 8-15 dessin 8-4 dessin de lignes 8-6, 8-10 8-11, 8-298-30 changement de la largeur du crayon 8-6 gestionnaires dvnements 8-27 outils de dessin par dfaut 49-5 palettes 45-545-6 prsentation 8-18-4 proprits communes, mthodes 8-4 rafrachissement de lcran 8-2 CanModify, proprit ensembles de donnes 15-6, 18-20, 18-44 grilles de donnes 15-29 requtes 20-12 Canvas, proprit 3-51, 40-8 Caption, proprit 3-21 botes groupe et groupes de boutons radio 3-44 en-ttes de colonne 15-24 entres incorrectes 6-36 grilles de dcision 16-13 libells 3-47
Guide du dveloppeur
caractre & 3-21, 6-38 caractre de fin de fichier 10-16 caractres 42-2 caractres accentus 12-10 caractres de fin de ligne 10-16 caractres tendus routines de bibliothque dexcution 4-47 caractres larges 12-4 caractres multi-octets (MBCS) 10-20, 10-25 carrs, dessin 49-9 cases cocher 3-40, 15-2 orientes donnes 15-15 15-16 cassettes vido 8-35 Cast, m thode 4-31 CastTo, mthode 4-32 CDaudio, disques 8-34 CellDrawState, fonction 16-14 CellRect, mthode 3-49 Cells, fonction 16-14 Cells, proprit 3-49 cellules de grille 3-49 CellValueArray, fonction 16-14 cercles, dessin 49-9 CGI, applications 13-12 CGI, programmes 27-5, 27-6, 27-7 chane, champs taille 19-7 chanes 4-42, 42-2, 42-8 association de graphiques 7-15 comptage de rfrences 4-45, 4-52 conversions PChar 4-52 conversions sur 2 octets 12-3 corruption de la mmoire 4-54 dclaration et initialisation 4-50 directives de compilation 4-54 fichiers 4-62 jeux de caractres tendus 4-55 longues 4-45 mlange et conversion de types 4-51 paramtres variables 4-54 position de dpart 7-10 prsentation des types 4-43 renvoi 42-9 routines
bibliothque dexcution 4-46 distinction minuscules/ majuscules 4-48 support des caractres multi-octets 4-48 taille 7-10 traduction 12-2, 12-9, 12-11 tri 12-10 tronquer 12-4 variables locales 4-52, 4-53 chanes courtes 4-44 chanes tendues 4-45 chanes longues 4-45 champ, objets 19-119-32 accs aux valeurs 19-23 19-24 dfinition 19-6 dynamiques 19-219-3 ou persistants 19-2 vnements 19-18 persistants 19-319-19 ou dynamiques 19-2 proprits 19-2, 19-1319-18 excution 19-15 partage 19-15 proprits daffichage et ddition 19-13 suppression 19-1219-13 champs 19-119-32 activation 19-19 adaptateurs Web 29-8 affectation de valeurs 18-25 affichage des listes 17-15 affichage des valeurs 15-12, 19-20 ajout aux fiches 8-288-29 bases de donnes 51-5, 51-7 cachs 24-5 colonnes persistantes et 15-20 cration 19-6 dfinition des limites de donnes 19-2419-26 enregistrements de message 46-7 extraction de donnes 19-20 formats par dfaut 19-17 lecture seule 15-6 mise jour des valeurs 15-6 modification des valeurs 15-6 options mutuellement exclusives 15-3 proprits 19-2
saisie de donnes 18-22, 19-17 types de donnes abstraites 19-2619-32 valeurs null 18-25 valeurs par dfaut 19-24 champs agrgat 19-7, 23-16 affichage 19-12 dfinition 19-12 champs BLOB obtenir les valeurs 20-4 champs boolens 15-2, 15-15 champs cachs 24-5 champs calculs 18-2618-27, 19-7 affectation de valeurs 19-9 champs de rfrence et 19-11 dfinition 19-819-10 ensembles de donnes client 23-13 champs de donnes 19-7 dfinition 19-719-8 champs de rfrence 15-14, 19-7, 19-3119-32 dans les grilles de donnes 15-24 dfinition 19-1019-11 fourniture de valeurs par programme 19-11 mise en mmoire cache des valeurs 19-11 performances 19-11 spcification 15-24 champs en lecture seule 15-6 champs mmo 15-2, 15-10 texte format 15-11 champs mmo texte formats 15-3 champs numriques formatage 19-17 champs persistants 15-18, 19-3 19-19 ADT, champs 19-28 affichage des listes 19-5, 19-6 attribution de nom 19-6 cration 19-4 cration de tables 18-45 dfinition 19-6 ensembles de donnes, champs 18-43 modification de lordre 19-6 paquets de donnes 24-5 proprits 19-1319-18 retour des champs dynamiques 19-4 I-7
Index
suppression 19-1219-13 tableau, champs 19-2919-30 types de donnes 19-7 types spciaux 19-6, 19-7 Change, mthode 51-12 ChangeBounds, proprit 10-24 ChangeCount, proprit 10-33, 20-37, 23-7 ChangedTableName, proprit 20-60 CHANGEINDEX 23-9 changement fichiers projet 2-3 ChangeScale, proprit 10-24 Char, type de donnes 4-43, 12-3 chargement graphiques 45-4 Chart FX 13-5 CHECK, contrainte 24-15 Checked, proprit 3-40 CheckSynchronize routine 9-5 chemin de recherche 10-18 chemins (URL) 27-3 Chord, mthode 8-4 cibles, listes dactions 6-20 classe de conversion 4-684-71 classe lien de donnes sur un champ 51-11 classes 4-1, 40-2, 41-1, 42-3 abstraites 40-3 accs 41-441-7, 49-6 anctre 41-341-4 par dfaut 41-4 cration 41-1 dfinition 40-12, 41-241-3 mthodes statiques et 41-8 mthodes virtuelles et 41-9 drivation de nouvelles 41-241-3, 41-9 drives 41-8 descendantes 41-341-4, 41-8, 41-9 diteurs de proprits comme 47-7 hritage 41-8 hirarchie 41-4 instanciation 41-2 par dfaut 41-4 partie protge 41-6 partie publie 41-7 partie publique 41-6 proprits comme 42-3
transmission comme paramtres 41-10 classes anctres 3-6, 3-9 classes crateur CoClasses 35-6, 35-14 classes drives 3-9 classes descendantes redfinition des mthodes 41-8, 41-9 classes distantes exceptions 31-731-8 recenser 31-5 clause uses 10-7 cl, champs 18-38 multiples 18-37, 18-38 Clear, mthode champs 19-19 listes de chanes 3-58, 3-59 ClearSelection, mthode 7-11 cls de licence 38-7 cls partielles dfinition des portes 18-38 recherche 18-34 clic, vnements 8-26, 8-27, 43-8 Click, mthode 43-2 surcharge 43-7, 50-12 client action 6-19 client, applications architecture 25-5 interfaces 32-2 multiniveaux 25-2, 25-5 simples 25-2 sockets et 32-1 utilisateur, interfaces 25-1 client, connexions 32-2, 32-3 acceptation de requtes 32-8 numros de port 32-5 ouverture 32-7 client, requtes 27-527-6 client, sockets 32-3, 32-632-7 affectation dhtes 32-4 connexion aux serveurs 32-9 demande de services 32-6 gestion dvnements 32-9 identification des serveurs 32-6 messages derreur 32-8 proprits 32-6 clients Voir applications client clients, listes dactions 6-20 Clipboard 7-10 objets graphiques 8-3 test de la prsence des images 8-24 Clipbrd, unit 7-9
clips audio 8-33 clips AVI 8-31, 8-34 clips vido 8-31, 8-33 CloneCursor, mthode 23-17 Close, mthode composants de connexion 17-4 connexions de bases de donnes 20-22 ensembles de donnes 18-5 sessions 20-20 CloseDatabase, mthode 20-22 CloseDataSets, mthode 17-14 CLSID 33-6, 33-16 fichier licence de paquet 38-8 CLX 3-1 applications 10-1 constructeurs dobjets 10-15 dploiement 13-6 et VCL 10-6 clx60.bpl 13-6 CM_EXIT, message 51-12 CMExit, mthode 51-12 CoClasses 33-6 actualiser 34-23 CLSID 33-6 composants enveloppe 35-1, 35-3 limitations 35-2 contrles ActiveX 38-5 crer 34-21, 35-6, 35-13 35-14 dclarations 35-5 diteur de bibliothques de types 34-11, 34-18, 34-25 34-26 instanciation 33-6 nom 36-3, 36-5 code 44-4 optimisation 8-16 portable 10-17 code assembleur 10-23 code indpendant de la position (PIC) 10-11, 10-23 code portable 10-19 code relogeable 10-23 code source dition 2-3 rutilisation 6-14 visualisation gestionnaires dvnements spcifiques 3-29 codes caractres sur plusieurs octets 12-3
I-8
Guide du dveloppeur
cohrence transactions 14-5 ColCount, proprit 15-33 collecteur dvnements 35-15 colonnes 3-48 tat par dfaut 15-18, 15-25 grilles de dcision 16-12 inclusion dans les tables HTML 28-21 persistantes 15-18, 15-20 15-21 cration 15-2115-25 insertion 15-22 modification de lordre 15-22 suppression 15-22 proprits 15-20, 15-23 15-24 redfinition 15-25 suppression 15-19 colonnes dynamiques 15-19 proprits 15-19 Color, proprit 3-21, 3-47, 3-51 crayons 8-6 en-ttes de colonne 15-24 grilles de dcision 16-13 grilles de donnes 15-23 pinceaux 8-8 ColorChanged, proprit 10-24 Cols, proprit 3-49 Columns, proprit 3-42, 15-21 grilles 15-18 groupes de boutons radio 3-45 ColWidths, proprit 3-49, 7-16 COM 5-15, 33-2 applications 33-19 distribues 5-15 clients 33-3, 33-10, 34-22, 35-135-18 conteneurs 33-10, 35-1 contrleurs 33-10, 35-1 experts 33-19, 36-1 extensions 33-2 comparaison des technologies 33-11 interfaces 33-3, 36-3, 36-9 Automation 36-1336-16 dcompte de rfrences 33-5 dfinition 33-3 drivation 33-4 identificateurs de rpartition 36-15 implmentation 33-6
informations de type 33-16 interfaces doubles 36-14 36-15 marshaling 33-8 modifier 36-13 optimisation 33-18 pointeur dinterface 33-5 modification des interfaces 34-2334-25 proxy 33-8 spcification 33-2 technologies 33-11 types de serveurs 33-5 COM+ 5-16, 25-7, 33-11, 33-15, 39-1, 39-1939-20 voir aussi objets transactionnels compar 39-2 crer des objets vnement 39-21 dclenchement dvnements 39-21 vnements 35-1635-17, 39-2039-21 expert objet vnement 39-2039-21 objets vnement 39-20 pointeurs dinterface 33-5 serveurs en processus 33-7 synchronisation dappel 39-1939-20 transactions 25-21 COM, bibliothque 33-2 COMCTL32.DLL 6-48 CommandCount, proprit 17-14, 21-8 commande, objets 21-1921-22 itration sur les 17-14 commandes ADO 21-8, 21-19 21-22 annulation 21-2021-21 asynchrone 21-21 excution 21-20 itration sur les 17-14 paramtres 21-2121-22 rcupration de donnes 21-21 spcification 21-1921-20 commandes, listes dactions 6-20 Commands, proprit 17-14, 21-8
CommandText, proprit 18-51, 21-17, 21-18, 21-19, 21-21, 22-7, 22-8, 23-38 CommandTimeout, proprit 21-6, 21-21 CommandType, proprit 21-17, 21-18, 21-19, 22-6, 22-7, 22-8, 23-38 Commit, mthode 17-9 CommitTrans, mthode 17-9 CommitUpdates, mthode 10-33, 20-38, 20-41 communes, botes de dialogue 52-1 communication entre niveaux 25-10 communications 32-1 protocoles 20-17, 27-3, 32-2 standards 27-3 communications business-to-business XML 30-1 commutateurs de commandes 10-16 Compare, mthode 4-35 CompareBookmarks, mthode 18-11 CompareOp, mthode 4-36 compilateur directives 10-22 compilation conditionnelle 10-20, 10-22 compilation du code 2-5 composant de bases de donnes temporaires 20-23 composant enveloppe 52-2 composant rpartiteur dadaptateur 29-4 composant texte statique 3-47 composants 3-2, 3-133-23, 41-1, 42-3 abstraits 40-3 aide la dcision 16-1 aide en ligne 47-4 ajout lunit existante 40-12 ajout la palette de composants 47-1 ajout aux units 40-12 applications Web 29-4 classes drives 40-12, 49-2 cration 40-2, 40-9 dpendances 40-6 double-clic 47-17, 47-19 47-20 gnrateurs de page 29-7 I-9
Index
gestion mmoire 3-13 initialisation 42-14, 49-7, 51-6 installation 3-34, 11-611-7, 47-21 interfaces 41-4, 41-6, 52-2 conception 41-7 excution 41-6 menus contextuels 47-17, 47-1847-19 modification 48-148-4 modifier les donnes 51-8 51-13 multiplates-formes 3-32 non visuels 3-53, 40-5, 40-13, 52-3 orients donnes 51-1 palette des bitmaps 47-4 paquets 47-21 personnalisation 40-3, 42-1 personnaliss 3-34, 6-14 prsentation 40-1 propritaire 3-13 proprits communes 3-20 3-22, 3-233-24 recensement 40-13, 47-2 redimensionnement 3-38 regroupement 3-443-46 renommer 3-83-9 rpartiteur 29-14 rpondre aux vnements 51-7 ressources, libration 52-5 scruter les donnes 51-2 51-7 standard 3-323-34 test 40-14, 40-15 tests 52-6 composants adaptateurs 29-14 composants application, applications Web 29-4 composants base de donnes 5-11, 20-1420-18 application des mises jour en m moire cache 20-40 identification des bases de donnes 20-1520-17 partags 20-18 sessions et 20-1420-15, 20-23 temporaires interruption 20-23 composants calendrier 3-44 composants connexion base de donnes I-10
dans les modules de donnes distants 25-6 implicite 20-3 DataSnap 25-5, 25-2725-35 fermeture des connexions 25-33 protocoles 25-1025-12, 25-27 composants daide la dcision 14-18, 16-1, 16-20 affectation des donnes 16-516-7 ajout 16-316-5 allocation de mmoire 16-21 options de conception 16-9 prsentation 16-116-2 composants de base de donnes 20-320-4 composants de connexion base de donnes 14-914-10, 17-117-16, 20-320-4 accs aux mtadonnes 17-14 17-16 ADO 21-321-9 dbExpress 22-322-6 excution des commandes SQL 17-1117-13, 21-6 implicite 17-2, 21-3 implicites 20-15 instructions par connexion 22-3 liaison 21-321-5, 22-3 22-6 bases de donnes BDE 20-1420-18 implicites 20-22 liaison 20-1520-17 DataSnap 14-16, 25-3 composants enveloppe contrles ActiveX 35-7, 35-935-10 initialisation 52-3 objets Automation 35-735-8 exemple 35-1035-13 objets COM 35-1, 35-2, 35-3, 35-735-13 composants menu 6-34 composants personnaliss 3-34 composants rpartiteur 29-4 adaptateurs 29-14 composants standard 3-323-34 compression des donnes TSocketConnection 25-29 comptage de rfrences
interfaces 4-254-28 objets COM 4-22 ComputerName, proprit 25-28 concepteur de liaisons de champs 18-41 concepteur de menus 3-31, 6-336-34 menu contextuel 6-42 conception applications 2-2 ConfigMode, proprit 20-29 Connected, proprit 17-3 composants de connexion 17-4 Connection, proprit 21-4, 21-11 ConnectionBroker 23-30 ConnectionName, proprit 22-5 ConnectionObject, proprit 21-5 ConnectionString, proprit 17-2, 17-5, 21-4, 21-11 ConnectionTimeout, proprit 21-6 ConnectOptions, proprit 21-5 connexion, bote de dialogue 17-5 connexion, composants DataSnap 25-26 gestion des connexions 25-32 ouverture des connexions 25-32 connexions base de donnes 17-317-6 asynchrones 21-521-6 attribution de nom 22-5 22-6 fermeture 20-22 gestion 20-22 limiter 25-9 ouverture 20-20, 20-22 persistantes 20-21 protocoles de rseaux 20-17 regroupement 25-7 temporaires 20-23 client 32-3 CORBA 25-12, 25-31 DCOM 25-10, 25-28 fermeture 25-33 HTTP 25-1125-12, 25-30
Guide du dveloppeur
ouverture 25-32, 32-7 protocoles 25-1025-12, 25-27 serveurs 20-17 serveurs de base de donnes 17-3 SOAP 25-12, 25-30 TCP/IP 25-1025-11, 25-29, 32-232-3 connexions ADO asynchrones 21-521-6 excution des commandes 21-6 connexions aux bases de donnes persistantes 20-21 connexions bloquantes 32-11 connexions non bloquantes ou 32-10 gestion dvnements 32-10 connexions dcoute 32-2, 32-3, 32-8, 32-9 numros de port 32-5 connexions de base de donnes regroupement 25-7, 39-6 connexions de bases de donnes 17-317-6 conservation 17-3 fermeture 17-4, 17-4 limiter 25-9 connexions nommes 22-522-6 affectation dun nouveau nom aux 22-6 ajout 22-6 chargement lexcution 22-5 suppression 22-6 connexions non bloquantes 32-1032-11 connexions bloquantes ou 32-10 connexions par socket 32-2 32-3 envoi/rception dinformations 32-10 fermeture 32-7 multiples 32-5 ouverture 32-8 points de terminaison 32-3 types 32-2 connexions socket extrmits 32-6 connexions Web 25-1125-12 conseils daide 3-48
conservation des annulations 21-7 conservation des validations 21-7 consistance transactions 39-10 console, applications CGI 27-7 CONSTRAINT, contrainte 24-15 ConstraintErrorMessage, proprit 19-13, 19-25, 19-26 Constraints, proprit 6-5, 23-9, 24-15 constructeur de requtes 18-51 constructeur SQL 18-51 constructeurs 3-12, 40-14, 42-13, 44-3, 50-3, 50-4, 50-5, 51-6 multiplates-formes 10-25 multiples 6-10 objets ayant un propritaire et 49-6, 49-7 surcharge 48-2 constructeurs dobjets 10-15 Contains, liste (paquets) 11-7, 11-10 Content, mthode gnrateurs de page 28-16 Content, proprit rponse Web, objets 28-13 ContentFromStream, mthode gnrateurs de page 28-16 ContentFromString, mthode gnrateurs de page 28-16 ContentStream, proprit rponse Web, objets 28-13 contextes de priphriques 8-2, 40-8, 45-1 contextes objet ASP 37-3 ContextHelp 5-33 contraintes contrles 6-46-5 donnes 19-2419-26 cration 19-2419-25 dsactivation 23-36 ensembles de donnes client 23-823-9, 23-35 23-36 importation 19-2519-26, 23-36, 24-15 contraintes de donnes Voir contraintes contrat de licence 13-17 contrle de versions 2-6
ContrleBD, page de la palette de composants 3-32, 14-17, 15-1, 15-2 contrles 3-2, 3-133-23 changement 40-3 dplacement dans les 3-21, 3-24 dessin 49-7, 49-9, 50-4 dessins par le propritaire 7-13, 7-15 dessin 7-15, 7-17 dimensionnement 7-16 vnements 7-15 styles 7-14 diteur 7-7 diteur de texte format 7-7 fentrs 40-4 forme 49-7 graphiques 40-4, 45-4 compars aux bitmaps vs. 49-3 cration 40-4, 49-3 dessin 49-3 enregistrement des ressources systme 40-4 vnements 45-7 mmo 7-7 options daffichage 3-21 orients donnes 15-115-36 palettes et 45-545-6 personnaliss 40-5 bibliothques 40-5 position 3-20 pour modifier les donnes 51-851-13 pour scruter les donnes 51-251-7 prexistants 40-5 rception de la focalisation 40-4 redessin 50-5 redimensionnement 45-7, 50-4 regroupement 3-443-46 standard affichage des donnes 15-5, 19-20, 19-2019-21 taille 3-20 contrles ActiveX 13-5, 33-10, 33-11, 33-13, 33-24, 35-10, 38-138-18 ajouter des vnements 38-938-10
Index
I-11
ajouter des mthodes 38-9 38-10 ajouter des proprits 38-9 38-10 applications Web 33-14 bibliothques de types 33-17, 38-3 bote propos 38-5 composants enveloppe 35-6, 35-7, 35-935-10 conception 38-4 crer 38-2, 38-7 crer partir dun contrle VCL 38-438-7 dbogage 38-16 dploiement Web 38-16 38-18 lments 38-338-4 expert 38-7 expert contrle ActiveX 38-438-6 gnrer 38-2 gestion des vnements 38-11 implmentation 38-3 importer 35-435-5 informations de version 38-5 interfaces 38-838-13 licence 38-5, 38-738-8 modle de thread 38-5 orients donnes 35-9, 38-8, 38-1238-13 pages de proprits 35-7, 38-4, 38-1338-15 proprits persistantes 38-13 recenser 38-1538-16 types compatibles Automation 38-4, 38-8 contrles animation 3-51, 8-31 8-33 exemple 8-32 contrles ddition 15-915-10 slection de texte 7-9, 7-10 contrles de redimensionnement 3-38 contrles de saisie 3-343-36 contrles de texte format 3-36, 15-11 proprits 3-35 contrles de texte multiligne 15-10, 15-11 contrles dessins par le propritaire 3-59 botes liste 3-42, 3-43 contrles enfant 3-21 I-12
contrles en-ttes 3-46 contrles graphiques 49-1 49-10 dessin 49-849-10 contrles haut-bas 3-37 contrles incrmenteur 3-37 contrles liste 3-413-44 contrles mmo proprits 3-35 contrles onglets 3-46 contrles orients donnes 14-17, 15-115-36, 19-20, 51-1 affichage des donnes 15-7 15-8 dans les grilles 15-18, 15-32 valeurs actuelles 15-9 affichage des graphiques 15-11 association des ensembles de donnes 15-315-4 cration 51-251-13 dsactivation de laffichage 15-7, 18-10 destruction 51-6 dition 18-20 fonctionnalits communes 15-2 grilles 15-17 insertion denregistrements 18-22 lecture seule 15-9 liste 15-215-3 modification 15-515-7 pour modifier les donnes 51-851-13 pour scruter les donnes 51-251-7 rafrachissement des donnes 15-8 rponse aux changements 51-7 reprsentation des champs 15-9 saisie de donnes 19-17 contrles pages 3-46 contrles pages, ajout de pages 3-46 contrles parent 3-21 contrles texte 3-343-36 contrleurs Automation 33-12, 35-1, 35-1335-17, 36-15 crer des objets 35-1335-14 vnements 35-1535-17
exemple 35-1035-13 interfaces de rpartition 35-1435-15 interfaces doubles 35-14 controlling Unknown 4-26, 4-28 ControlType, proprit 16-10, 16-17 convention dappel safecall 34-10 conventions dappel donnes membres 43-3 vnements 43-9 mthodes 44-2 proprits 42-6 types denregistrement de message 46-7 conversion complexe 4-67 monnaies 4-69 conversion des monnaies exemple 4-69 conversion des monnaies europennes 4-71 conversion des temps 4-66 conversions chane 4-52 PChar 4-52 valeurs des champs 19-21 19-22 conversions des euros 4-69 Convert, fonction 4-64, 4-65, 4-67, 4-68, 4-71 coordonnes position de dessin actuelle 8-26 Copier (rfrentiel dobjets) 5-23 CopyFile, fonction 4-58 CopyFrom, fonction 4-64 CopyMode, proprit 45-3 CopyRect, mthode 8-4, 45-3, 45-7 CopyToClipboard, mthode 7-10 contrles mmo orients donnes 15-10 graphiques 15-11 CORBA 4-19 applications de bases de donnes multiniveaux 25-12 connexion aux serveurs dapplications 25-31 CORBA, connexions 25-12, 25-31
Guide du dveloppeur
correspondances entre claviers 12-11 ct serveur 29-10 couleurs crayons 8-6 internationalisation et 12-10 Count, proprit listes de chanes 3-57 TSessionList 20-33 courtage de connexions 25-31 courtier dobjets 25-31 courtier de donnes 23-30, 25-1 courtiers XML 25-4225-44 crayons 8-6, 49-5 changement 49-7 couleurs 8-6 largeur 8-6 modes de dessin 8-30 obtenir leur position 8-8 paramtres par dfaut 8-6 pinceaux 8-5 position, dfinition 8-8, 8-26 style 8-7 CREATE TABLE 17-12 Create, mthode 3-12 CreateDataSet, mthode 18-46 CreateFile, fonction 4-58 CreateObject, mthode 37-3 CreateParam, mthode 23-34 CreateSharedPropertyGroup 39-7 CreateSuspended, paramtre 9-12 CreateTable, m thode 18-46 CreateWidget, proprit 10-25 cration dun module de page Web 29-24 Crer un ensemble de donnes, commande 18-46 Crer un sous-menu, commande (menu Concepteur) 6-39, 6-42 Crer une table, commande 18-46 crtl.dcu 13-7 cryptage TSocketConnection 25-29 cubes de dcision 16-7, 16-10 affichage des donnes 16-10, 16-12 DimensionMap 16-8 dimensions pagines 16-23 dimensions, ouverture/ fermeture 16-10 tat perfor 16-10 vnements 16-8
forage 16-5 gestion de la mmoire 16-9 obtention de donnes 16-5 options de conception 16-9 paramtres de dimensions 16-22 pivotement 16-5 rafrachissement 16-8 sous-totaux 16-5 Currency, proprit champs 19-13 curseurs 18-6 bidirectionnel 18-57 clonage 23-17 dplacement 18-8, 18-33, 18-34 avec des conditions 18-12 sur la dernire ligne 18-7, 18-9 sur la premire ligne 18-7, 18-10 liaison 18-41, 22-13 synchronisation 18-48 unidirectionnels 18-58 curseurs bidirectionnels 18-57 curseurs de glissement 7-2 curseurs unidirectionnels 18-58 CursorChanged, proprit 10-24 CursorType, proprit 21-14 CurValue, proprit 24-13 Custom, proprit 25-47 CustomConstraint, proprit 19-13, 19-25, 23-9 CutToClipboard, mthode 7-10 contrles mmo orients donnes 15-10 graphiques 15-11
D
Data, proprit 23-6, 23-16, 23-18, 23-41 Database, paramtre 22-4 DatabaseCount, proprit 20-24 DatabaseName, proprit 17-2, 20-3, 20-16 requtes htrognes 20-10 Databases, proprit 20-24 DataChange, mthode 51-11 DataCLX 10-6 DataField, proprit 15-12, 51-5, 51-6 botes listes de rfrence et botes options de rfrence 15-14
DataRequest, mthode 23-38, 24-4 DataSet, proprit fournisseurs 24-2 grilles de donnes 15-19 DataSetCount, proprit 17-14 DataSetField, proprit 18-43 DataSets, proprit 17-14 DataSnap, page de la palette de composants 3-33, 25-3, 25-7 DataSource, proprit botes listes de rfrence et botes options de rfrence 15-14 contrles orients donnes 51-5, 51-6 grilles de donnes 15-19 navigateurs de donnes 15-36 requtes 18-55 DataSource, proprits contrles ActiveX 35-9 DataType, proprit paramtres 18-53, 18-54, 18-61 date, champs formatage 19-17 dates composants calendrier 3-44 internationalisation 12-10 saisie 3-44 DateTimePicker, composant 3-44 DAX 33-2, 33-2333-24 Day, proprit 50-6 DB/2, pilote dploiement 13-10 dBASE, tables 20-6 ajout denregistrements 18-22, 18-23 DBChart, composant 14-18 DBCheckBox, composant 15-2, 15-1515-16 DBComboBox, composant 15-2, 15-1215-13 DBConnection, proprit 23-20 DBCtrlGrid, composant 15-3, 15-3215-33 proprits 15-33 dbDirect, page de la palette de composants 14-2 DBEdit, composant 15-2, 15-9 15-10 DBEdit, contrles 15-2 I-13
Index
multiligne 15-10 texte format 15-11 dbExpress 10-2610-32, 13-8, 14-2, 22-122-2 composants 22-122-21 dbogage 22-1922-21 dploiement 22-1 mtadonnes 22-1422-19 pilotes 22-4 dbExpress, applications 13-11 dbExpress, page de la palette de composants 3-32, 22-2 DBGrid, composant 15-2, 15-1815-32 vnements 15-31 proprits 15-23 DBGridColumns, composant 15-18 DBImage, composant 15-2, 15-11 DBListBox, composant 15-2, 15-1215-13 DBLogDlg, unit 17-5 DBLookupComboBox, composant 15-3, 15-1315-15 DBLookupListBox, composant 15-3, 15-1315-15 DBMemo, composant 15-2, 15-10 DBNavigator, composant 15-2, 15-3315-36 DBRadioGroup, composant 15-3, 15-1615-17 DBRichEdit, composant 15-3, 15-11 DBSession, proprit 20-4 DBText, composant 15-2, 15-9 dbxconnections.ini 22-5, 22-5 22-6 dbxdrivers.ini 22-4 DCOM 33-8 applications InternetExpress 25-41 applications multiniveaux 25-10 connexion au serveur dapplications 23-31, 25-28 connexions 25-10 distribution dapplications 5-15 DCOM, connexions 25-28 DCOMCnfg.exe 25-41 .DCP, fichiers 11-13 .DCR, fichiers 47-4 .DCU, fichiers 11-2, 11-13 I-14
Guide du dveloppeur
DDL 17-11, 18-50, 18-57, 20-9, 22-12 Dbogage 27-10 dbogage applications dbExpress 22-1922-21 applications serveur Web 27-7 contrles ActiveX 38-16 objets Active Server 37-9 objets COM 36-19 objets transactionnels 39-23 39-24 dbogage du code 2-5 dbogueur dapplications Web 27-8, 28-2, 29-2 dbogueur intgr 2-5 Decision Cube, page de la palette de composants 14-18, 16-1 dclarations classes 41-10, 49-6 protges 41-6 publiques 41-6 published 41-7 gestionnaires dvnements 43-6, 50-12 gestionnaires de messages 46-6, 46-8 mthodes 8-16, 44-4 dynamiques 41-10 publiques 44-3 statiques 41-8 virtuelles 41-9 nouveaux types de composants 41-3 proprits 42-3, 42-442-7, 42-8, 42-14, 49-4 stockes 42-14 types dfinis par lutilisateur 49-3 variables exemple 3-11 dclarations de type et objets 3-11 proprits 49-3 types numrs 8-13 dclencheurs 14-6 DECnet 32-1 dcompte de rfrences COM interfaces 33-5 objets COM 33-4 default directive 42-13, 48-3 mot rserv 42-8
Default, proprit lments daction 28-7 DEFAULT_ORDER 23-9 DefaultColWidth, proprit 3-49 DefaultDatabase, proprit 21-4 DefaultDrawing, proprit 15-30 DefaultExpression, proprit 19-24, 23-9 DefaultHandler, mthode 46-3 DefaultPage, proprit 29-19 DefaultRowHeight, proprit 3-49 Dfaut, case cocher 5-3 dfinition classes 41-241-3 dfinitions dindex 18-45 copie 18-46 dfinitions de champs 18-45 copie 18-46 dfinitions de types diteur de bibliothques de types 34-1134-12 dlai, vnements 9-11 DELETE, instruction 20-46, 20-49 DELETE, instructions 24-11 Delete, mthode 18-23 listes de chanes 3-58, 3-59 DeleteAlias, mthode 20-29 DeleteFile, fonction 4-56 DeleteFontResource, fonction 13-16 DeleteIndex, mthode 23-11 DeleteRecords, mthode 18-48 DeleteSQL, proprit 20-46 DeleteTable, mthode 18-47 Delphi cadre ActiveX (DAX) 33-23 33-24 cadre de travail ActiveX (DAX) 33-2 Delta, proprit 23-6, 23-24 dnomination sessions de base de donnes 28-19 $DENYPACKAGEUNIT, directive de compilation 11-11 dplacements fichiers 4-63 dploiement applications 13-1 applications CLX 13-6
applications de bases de donnes 13-7 applications gnralistes 13-1 applications MIDAS 13-11 contrles ActiveX 13-5 dbExpress 22-1 DLL, fichiers 13-6 fichiers paquet 13-3 fontes 13-15 moteur de bases de donnes Borland 13-9 Web, applications 13-11 dploiement Web contrles ActiveX 38-16 38-18 DEPLOY 13-9, 13-10, 13-16, 13-17 drfrencement de pointeurs dobjet 41-10 drivation de classes 41-241-3, 41-9 ds que possible, dsactivation 25-8 dsactivation ds-que-possible 39-5 dsancrage des contrles 7-7 DESIGNONLY, directive de compilation 11-11 dessin dimages 45-7 dessin des contrles 49-7, 49-9, 50-4 Destroy, mthode 3-12 destructeurs 3-12, 44-3, 51-6 objets ayant un propritaire et 49-6, 49-7 dtail, fiches 15-17 dtails imbriqus 18-43, 19-30 19-31, 25-22 extraction la demande 24-6 dveloppement multiplate-forme 6-19, 6-21 DeviceType proprit 8-33 .DFM, fichiers 10-2, 12-11, 42-12 gnration 12-14 fichiers .DFM 3-8 gnration 3-8 Dialogues, page de la palette de composants 3-33 dictionnaire de donnes 19-15 19-17, 20-6020-62 contraintes 24-15 dictionnaire des donnes 25-3 diffrence majuscules/ minuscules
index 23-10 DimensionMap, proprit 16-8 Dimensions, proprit 16-13 Direction, proprit paramtres 18-54, 18-61 directives 10-22 $ELSEIF 10-22 $ENDIF 10-22 $H (compilateur) 4-44, 4-54 $IF 10-22 $IFDEF 10-20 $IFEND 10-22 $IFNDEF 10-21 $LIBPREFIX, compilateur 5-10 $LIBSUFFIX, compilateur 5-10 $LIBVERSION, compilateur 5-10 $P (compilateur) 4-54 $V (compilateur) 4-55 $X (compilateur) 4-55 compilation conditionnelle 10-20 default 42-13, 48-3 du compilateur $MESSAGE 10-23 dynamic 41-10 override 41-9 protected 43-6 public 43-6 published 42-3, 43-6, 52-4 relatives aux chanes 4-54 stored 42-14 virtual 41-9 directives de compilation bibliothques 5-10 chanes 4-54 spcifiques au paquet 11-11 directives de compilation, chanes et types caractre 4-54 Directory, directive 13-12 DirtyRead 17-10 DisableCommit, mthode 39-13 DisableConstraints, mthode 23-36 DisableControls, mthode 15-7 DisabledImages, proprit 6-52 Dispatch, mthode 46-3, 46-5 dispID 33-16, 36-15 liaison 36-16 dispinterfaces 25-34, 36-13, 36-14, 36-1536-16 bibliothques de types 34-11 liaison dynamique 34-11
DisplayFormat, proprit 15-30, 19-13, 19-18 DisplayLabel, proprit 15-20, 19-13 DisplayWidth, proprit 15-19, 19-13 Dissocier attributs, commande 19-17 DLL 10-11, 10-17 HTTP, serveurs 27-5, 27-6 incorporation dans le document HTML 28-15 internationalisation 12-12, 12-14 MTS 39-2 paquets 11-1, 11-2 serveurs COM 33-7 modles de thread 36-7 DllGetClassObject 39-3 DllRegisterServer 39-3 DML 17-11, 18-50, 18-57, 20-9 .DMT, fichiers 6-43, 6-44 document actif 35-17 Document Object Model Voir DOM DocumentElement, proprit 30-4 documents Active 33-11, 33-15 documents HTML ActiveForms 38-6 applications InternetExpress 25-39 ASP 37-1 bases de donnes et 28-18 contrles ActiveX 38-1 ensembles de donnes 28-21 feuilles de style 25-46 gnrateurs de page 28-14 28-18 gnrateurs de table 28-20 28-22 incorporation de tables 28-21 modles 25-45, 25-4725-48, 28-1528-16 documents XML 26-1, 30-1 30-9 composants 30-330-4, 30-9 conversion en paquets de donnes 26-126-9 gnrer les interfaces 30-6 nud racine 30-4, 30-7, 30-9 nuds 30-2, 30-430-6 attributs 26-6, 30-5 enfants 30-530-6
Index
I-15
fichiers de transformation 26-1 mappage vers des champs 26-2 proprits 30-6 valeurs 30-5 publication dinformations de base de donnes 26-10 DoExit, mthode 51-13 DOM 30-2, 30-230-3 implmentations 30-2 utilisation 30-3 domaines dappellation interfaces invocables 31-5 donnes Voir aussi enregistrements accs 51-1 affichage 19-20, 19-2019-21 dans les grilles 15-18, 15-32 dsactivation de laffichage 15-7 valeurs actuelles 15-9 affichage seulement 15-9 analyse 14-18, 16-2 tablissement de rapports 14-18 formats, internationalisation 12-10 impression 14-18 modification 18-2018-26 reprsentation graphique 14-18 saisie de 18-22 synchronisation des fiches 15-4 valeurs par dfaut 15-12, 19-24 donnes membres 3-2 donnes membres classe 49-4 dclaration 49-6 donnes membres de classe nommer 43-3 double-clics composants 47-17 rponse aux 47-1947-20 Down, proprit 3-39 turboboutons 6-50 .DPK, fichiers 11-2, 11-7 .DPL, fichiers 11-2, 11-13 DragCursor, proprit 3-21 DragMode, proprit 3-21, 7-1 grilles 15-23 Draw, mthode 8-4, 45-3, 45-7 DrawShape 8-16 I-16
drintf, unit 20-61 DriverName, proprit 20-15, 22-4 DropConnections, mthode 20-15, 20-23 DropDownCount, proprit 3-42, 15-13 DropDownMenu, proprit 6-55 DropDownRows, proprit botes options de rfrence 15-15 grilles de donnes 15-23, 15-25 DTD, fichier 30-2 durabilit transactions 14-5, 39-10 dynamic, directives 41-10 dynamiques, champs 19-219-3
E
E/S de fichier types 4-59 EAbort 4-17 EBX registre 10-24 cran rafrachissement 8-2 rsolution 13-13 programmation 13-13, 13-14 criture des paramtres de proprit 42-7, 47-9 Edit, contrle 3-34 Edit, m thode 18-20, 47-10, 47-12 diteur daction ajout dactions 28-5 changement dactions 28-6 diteur de bibliothque de types serveurs dapplications 25-19 diteur de bibliothques types numrs 34-11 diteur de bibliothques de types 34-234-30 34-17 actualiser 34-29 ajout dalias 34-2634-27 ajout denregistrements et dunions 34-27 ajout de CoClasses 34-25 34-26 ajout de modules 34-27 ajout de proprits et mthodes 34-2434-25
ajout de types numrs 34-26 ajouter des interfaces 34-23 alias 34-11, 34-19 attributs de liaison 38-12 barre dtat 34-6 barre doutils 34-434-6 CoClasses 34-11, 34-18 composants 34-334-9 dfinitions de types 34-11 34-12 dispinterfaces 34-11 lments 34-934-12 caractristiques communes 34-934-10 enregistrement et recensement des informations de type 34-2834-30 enregistrements 34-20 enregistrements et unions 34-1134-12 interfaces 34-1034-11 interfaces de rpartition 34-18 messages derreur 34-6, 34-9 modification des interfaces 34-2334-25 modules 34-12, 34-21 ouverture de bibliothques 34-22 page COM+ 39-5 page Texte 34-9, 34-24 pages dinformations de type 34-634-9 alias 34-7 bibliothques de types 34-7 champs 34-8 CoClasses 34-7 constantes 34-8 dispinterfaces 34-7 enregistrements 34-8 numrations 34-7 interfaces 34-7 mthodes 34-8 modules 34-8 proprits 34-8 unions 34-8 Pascal Objet ou IDL 34-13, 34-1534-21 slectionner des lments 34-6 syntaxe 34-13, 34-1534-21 types num rs 34-19
Guide du dveloppeur
unions 34-20 volet liste des objets 34-6 diteur de chane de connexion 21-4 diteur de champs 5-21, 19-4 application dattributs de champ 19-16 barre de titre 19-5 boutons de navigation 19-5 cration de champs persistants 19-4 dfinition densembles dattributs 19-15 liste de champs 19-5 modification de lordre des colonnes 15-23 suppression densembles dattributs 19-16 suppression de champs persistants 19-12 diteur de code 2-4 affichage 47-19 gestionnaire dvnement 3-29 ouverture des paquets 11-9 prsentation 2-4 diteur de collection de paquets 11-14 diteur de collection de paramtres 18-53, 18-60 diteur de colonnes cration de colonnes persistantes 15-21 modification de lordre des colonnes 15-22 suppression de colonnes 15-22 diteur de CommandText 18-52 diteur de connexion 22-522-6 diteur de cube de dcision 16-816-9 contrle de la mmoire 16-9 paramtres de dimensions 16-8 diteur de fichiers dindex 20-7 Editeur de liaisons de donnes de contrle ActiveX 35-9 diteur de liste dactions 6-20 diteur de liste de chanes affichage 15-12 diteur de masque de saisie 19-17 diteur de pages Web 25-45 25-46
diteur de proprits de bases de donnes 20-16 affichage des paramtres de connexion 20-17 diteur de requte de dcision 16-6 diteur de texte format, contrles 3-34 proprits 3-35 diteur du gestionnaire dactions 6-21, 6-22, 6-24 diteur SQL de mise jour 20-4720-48 page Options 20-47 page SQL 20-48 diteurs de composants 47-17 47-21 par dfaut 47-17 recensement 47-20 diteurs de proprits 3-27, 42-3, 47-7 attributs 47-11 botes de dialogue comme 47-10 comme classes drives 47-7 recensement 47-1347-14 EditFormat, proprit 15-30, 19-13, 19-18 dition code 2-3 dition de masque, contrles 3-34 EditKey, mthode 18-32, 18-35 EditMask, proprit 19-17 champs 19-13 EditRangeEnd, mthode 18-39 EditRangeStart, mthode 18-39 lments action rpartiteurs Web 29-18 lments daction 28-3, 28-4, 28-628-9 activation et dsactivation 28-7 ajout 28-5 chanage 28-9 gnrateurs de page et 28-16 gestionnaires dvnements 28-4 par dfaut 28-6, 28-7 prcaution de changement 28-3 slection 28-6, 28-7 lments de menu 6-366-38 ajout 6-36, 6-46 dfinition 6-33
dfinition des proprits 6-41 dplacement 6-39 emplacements 6-42 imbrication 6-38 lettres soulignes 6-38 lignes de sparation 6-37 modification 6-41 noms 6-36, 6-45 regroupement 6-37 slection 7-11 suppression 6-37, 6-42 lments Web proprits 25-4625-47 Ellipse, mthode 8-5, 8-11, 45-3 ellipses dessin 8-11, 49-9 $ELSEIF directive 10-22 Embed , balise HTML (<EMBED>) 28-15 EmptyDataSet, mthode 18-48, 23-32 EmptyStr, variable 4-50 EmptyTable, mthode 18-47 EnableCommit, mthode 39-13 EnableConstraints, mthode 23-36 EnableControls, mthode 15-7 Enabled, proprit contrles orients donnes 15-8 lments daction 28-7 menus 6-46, 7-11 sources de donnes 15-4, 15-6 turboboutons 6-50 EnabledChanged, proprit 10-24 encapsulation 3-6 EndRead, mthode 9-9 EndWrite, mthode 9-9 enregistrement graphiques 45-4 Enregistrement de modle, bote de dialogue 6-45 enregistrements adaptateurs Web 29-9 affichage 15-32 ajout 18-2118-23, 18-25 oprations groupes 20-57 ajout la fin 18-23 ajouts oprations groupes 20-9 compars aux objets 3-5 copie I-17
Index
oprations groupes 20-9, 20-58 critres de recherche 18-12, 18-13 dplacement dans les 15-33, 18-618-10, 18-19 diteur de bibliothques de types 34-1134-12, 34-20, 34-27 filtrage 18-1418-18 itration dans les 18-9 lecture 22-9, 23-3123-32 asynchrone 21-13 marquage 18-1118-12 mise jour 18-2518-26, 24-924-13 partir de documents XML 26-1126-12 ensembles de donnes client 23-2423-29 filtrage des mises jour 24-12 identification des tables 24-13 multiples 24-7 oprations groupes 20-9, 20-57 paquets delta 24-9, 24-10 requtes et 20-12 rafrachissement 15-8, 23-3623-37 recherche 18-1218-14, 18-3218-35 rgularisation des mises jour 23-27 ritration de recherches 18-35 suppression 18-23, 18-47 18-48 oprations groupes 20-9, 20-58 synchronisation de lenregistrement en cours 18-48 tri 18-3018-32 validation 15-7, 18-24 la fermeture des ensembles de donnes 18-24 grilles de donnes 15-30 Enregistrer attributs, commande 19-15 Enregistrer comme modle, commande (menu Concepteur) 6-42, 6-45 I-18
Guide du dveloppeur
ensemble de donnes BDE 20-220-3 ensemble de donnes BDE support de base de donnes locale 20-620-8 types 20-2 ensembles 42-2 ensembles donglets 3-46 ensembles de donnes 14-8, 18-118-64 ADO 21-1021-19 ajout denregistrements 18-21 18-23, 18-25 annulation des modifications 18-2418-25 BDE 20-220-14 catgories 18-2718-29 champs 18-2 composants daide la dcision 16-516-7 cration 18-4418-47 curseurs 18-6 documents HTML 28-21 dition 18-2018-21 tats 18-318-4 fermeture 18-5 sans dconnexion 17-13 validation des enregistrements 18-24 filtrage denregistrements 18-14 18-18 fournisseurs 24-2 itration sur les 17-14 lecture seule mise jour 20-12 ligne en cours 18-6 marquage denregistrements 18-11 18-12 modes 18-318-4 modification de donnes 18-2018-26 navigation dans les 15-33, 18-618-10, 18-19 non indexs 18-25 ouverture 18-5 personnaliss 18-3 procdures stockes 18-28, 18-5818-64 recherche 18-1218-14 cls partielles 18-34 colonnes multiples 18-13, 18-14
extension dune recherche 18-35 utilisation dindex 18-13, 18-14, 18-3218-35 requtes 18-27, 18-4918-58 suppression denregistrements 18-23 tables 18-27, 18-2918-48 unidirectionnels 22-122-21 validation des enregistrements 18-24 ensembles de donnes ADO excution des commandes 21-22 lecture asynchrone 21-13 mises jour groupes 21-13 21-16 recherches indexes 18-32 ensembles de donnes BDE 18-2, 20-220-14 application des mises jour en mmoire cache 20-41 bases de donnes 20-320-4 composants daide la dcision 16-5 copie 20-58 oprations groupes 20-55 20-60 sessions 20-320-4 ensembles de donnes client 23-123-42, 25-3 annulation des modifications 23-6 application des mises jour 23-2423-25 applications base de fichiers 23-3923-42 avec ensembles de donnes unidirectionnels 22-12 champs calculs 23-13 chargement de fichiers 23-40 connexion aux autres ensembles de donnes 14-1214-16, 23-2923-38 contraintes 23-823-9, 23-3523-36 dsactivation 23-36 copie des donnes 23-16 23-18 cration de tables 23-39 23-40 dploiement 13-7 dition 23-6
enregistrement des modifications 23-7 filtrage denregistrements 23-3 23-6 fournisseurs et 23-2923-38 fourniture de requtes 23-3823-39 fusion des donnes 23-17 fusion des modifications 23-41 index 23-923-12 ajout 23-10 limitation des enregistrements 23-34 23-35 mise jour des enregistrements 23-24 23-29 navigation 23-2 paramtres 23-3223-35 partage de donnes 23-17 permutation dindex 23-11 rafrachissement des enregistrements 23-36 23-37 recherches indexes 18-32 regroupement de donnes 23-1123-12 rsolution des erreurs de mise jour 23-25, 23-27 23-29 sauvegarde des fichiers 23-4123-42 spcification de fournisseurs 23-3023-31 suppression dindex 23-11 synthse des donnes 23-13 23-16 types 23-2123-22 ensembles de donnes daide la dcision 16-516-7 ensembles de donnes de type procdure stocke Voir procdures stockes ensembles de donnes de type requte Voir requtes ensembles de donnes de type table Voir tables ensembles de donnes destination, dfinition 20-56 ensembles de donnes en lecture seule
mise jour 14-12 ensembles de donnes non indexs 18-22, 18-25 ensembles de donnes source, dfinition 20-56 ensembles de donnes unidirectionnels 22-122-21 connexion aux serveurs 22-3 excution des commandes 22-1022-12 liaison 22-622-9 limites 22-1 modification de donnes 22-12 prparation 22-922-10 rcupration de mtadonnes 22-1422-19 rcupration des donnes 22-9 types 22-222-3 ensembles de donnes, champs 19-26, 19-3019-31 affichage 15-28 persistants 18-43 en-ttes de message (HTTP) 27-3, 27-4 de rponse 28-13 de requte 28-9 HTTP, requtes 27-4 en-ttes de colonne 3-46, 15-20, 15-24 entre, paramtres 18-59 entre/sortie, paramtres 18-60 enveloppes 40-5, 52-2 initialisation 52-3 enveloppes de composant 40-5 environnement de traduction intgr 12-14 EOF, marqueur 4-63 Eof, proprit 18-7, 18-8, 18-9 EPasswordInvalid 4-19 EReadError 4-62 ERemotableException 31-8 erreurs adaptateurs Web 29-9 override, directive et 41-9 erreurs de compilation override, directive et 41-9 erreurs de mise jour messages de rponse 25-44 rsolution 23-25, 23-27 23-29, 24-10, 24-13 ErrorAddr, variable 4-18 vnement, objets 9-10
vnements 3-283-31, 10-24, 40-7, 43-143-10 accs 43-6 aide sur 47-4 association des gestionnaires 3-29 attente d 9-10 champ, objets 19-18 clic 43-1, 43-2 COM 36-11, 36-13 COM+ 35-1635-17, 39-20 39-21 connexion 17-5 connexions ADO 21-821-9 contrles graphiques 45-7 contrles orients donnes activation 15-8 contrleurs Automation 35-11, 35-15 35-17 courtiers XML 25-44 dfinition de nouveaux 43-743-10 dlai 9-11 et objets 3-11 gestion des messages 46-3, 46-6 gestionnaires par dfaut 43-10 grilles de dcision 16-14 grilles de donnes 15-31 15-32 hrits 43-5 implmentation 43-2 interfaces 36-12 multiplates-formes 10-25 niveau application 6-4 nommer 43-9 objets Automation 36-5 objets COM 36-1136-13 composants enveloppe 35-3 par dfaut 3-29 partags 3-30 rcuprer 43-3 rpondre aux 51-7 signalement 9-10 sources de donnes 15-5 souris glisser-dplacer 7-17-4 systme 3-4 types 3-3 utilisateur 3-4 vnements clavier 43-4, 43-10 internationalisation 12-9 I-19
Index
vnements de connexion 17-5 vnements souris 8-258-27, 49-2 dfinis 8-25 informations dtat 8-25 paramtres 8-25 test 8-28 vnements standard 43-543-7 vnements, renommer par erreur 34-29 EventFilter 6-6, 46-5 volutivit 14-13 EWriteError 4-62 Exception 4-18 exceptions 4-54-18, 10-17, 44-2, 46-3, 52-5 classes 4-14 composant 4-15 dclenchement 4-18 dfinies par lutilisateur 4-17 gestion 4-6 imbriques 4-7 instances 4-12 interfaces COM 34-10 redclenchement 4-14 rponse aux 4-5 RTL 4-9, 4-10 silencieuses 4-17 threads 9-6 Voir aussi gestion des exceptions Exclusive, proprit 20-6 ExecProc, mthode 18-63, 22-11 ExecSQL, mthode 18-56, 18-57, 22-11 objets mise jour 20-53 Execute, mthode 52-4 commandes ADO 21-20, 21-22 composants de connexion 17-1117-12 dialogues 3-52 ensembles de donnes client 23-33, 24-4 fournisseurs 24-4 TBatchMove 20-59 threads 9-4 ExecuteOptions, proprit 21-13 ExecuteTarget, mthode 6-32 exemple "techniques de dessin" 8-258-30 Exemples, page de la palette de composants 3-33, 3-34 Expandable, proprit 15-27 Expanded, proprit I-20
colonnes 15-26, 15-27 grilles de donnes 15-23 expert ActiveForms 38-638-7 expert console 5-4 expert liaison de donnes XML 30-630-9 expert objet Active Server 37-2 37-3 experts 5-22 applications WebSnap 29-1 29-28 bibliothques de types 34-2134-22 COM 36-1 composant 40-10 contrles ActiveX 38-438-6, 38-7 expert console 5-4 liaison de donnes XML 30-630-9 Module de donnes CORBA 25-1825-19 Module de donnes distant 25-1525-16 Module de donnes MTS 25-1625-17 Module de donnes SOAP 25-1725-18 objet COM 33-21 objets Automation 36-436-9 objets COM 34-21, 36-2 36-4, 36-9 objets transactionnels 39-17 39-20 pages de proprits 38-13 Ressource DLL 12-11 services Web 31-3 explorateur de bases de donnes 20-16, 20-62 explorateur MTS 39-25 explorateur SQL 20-62, 25-3 dfinition des ensembles de donnes 19-16 Expression, proprit 23-14 ExprText, proprit 19-12 Extensible Markup Language Voir XML extraction la demande 23-32 extrmits connexions socket 32-6
F
fabricants 29-6 fabricants de classes 33-6, 36-2, 36-4
facteur de conversion 4-69 familles de conversion 4-65 exemple de cration 4-65 familles de conversion, recensement 4-66 FastNet, page de la palette de composants 3-33 fentre classe 40-5 contrles 40-4 gestion de message 50-4 handles 40-4, 40-6 fentres redimensionnement 3-38 FetchAll, m thode 10-33, 20-38 FetchBlobs, mthode 23-32, 24-4 FetchDetails, mthode 23-32, 24-4 FetchOnDemand, proprit 23-32 FetchParams, mthode 23-33, 24-4 feuilles de style 25-46 fiche principale 6-1 fiches 2-2, 3-25 accs depuis dautres fiches 3-10 affichage 6-7 ajout aux projets 3-9, 6-16-2 ajout de champs aux 8-28 8-29 ajout de rfrences dunit 6-2 comme types dobjets 3-6 3-8 cration lors de lexcution 6-7 dtail 15-17 en composants 52-1 fichiers 10-2 gestion mmoire 6-7 instanciation 3-6 liaison 6-2 modales 6-6 navigation entre les contrles 3-21, 3-24 non modales 6-6, 6-8 partager des gestionnaires dvnements 8-16 principales 6-1 proprits de requte exemple 6-10 rcupration des donnes depuis 6-106-13 rfrencement 6-2
Guide du dveloppeur
synchronisation des donnes 15-4 tables matre-dtail 15-17 transmission darguments aux 6-96-10 utilisation des variables locales pour crer 6-8 variable globale pour 6-7 fiches actives applications multiniveaux 25-37 en tant quapplication Web de base de donnes 25-38 ou InternetExpress 25-36 fiches HTML HTML fiches 25-45 fiches matre-dtail 15-17 exemple 18-4118-42 fichier dindex 20-7 fichier dindex MDX 20-7 fichier LIC 38-7 fichier LPK 38-8 fichier paquet licence 38-8 fichiers 4-554-64 chanes 4-62 copie 4-58 copie doctets depuis 4-64 dplacements 4-63 criture vers 4-61 envoi par le Web 28-13 graphiques 8-208-22, 45-4 handles 4-58, 4-59, 4-61 lecture depuis 4-61 manipulation 4-554-64 modes 4-61 position 4-63 recherche 4-56 renommer 4-58 ressource 6-476-48 routines API Windows 4-59 bibliothque dexcution 4-55 routines date-heure 4-58 suppression 4-56 taille 4-63 types E/S 4-59 sans type 4-59 texte 4-59 typs 4-59 types incompatibles 4-59 Voir aussi flux de fichier fichiers .TLB 34-30
fichiers ADTG 21-16 fichiers CAB 38-18 fichiers de collection de paquets 11-14 fichiers de configuration 10-17 fichiers de contrle de rseau 20-27 fichiers de traitement par lots 10-16 fichiers de transformation 26-1 26-7 nuds dfinis par lutilisateur 26-6, 26-826-9 TXMLTransform 26-7 TXMLTransformClient 26-10 TXMLTransformProvider 26-9 fichiers du projet distribution 2-6 fichiers excutables 10-17 internationalisation 12-12, 12-14 serveurs COM 33-7 modles de thread 36-7 fichiers fiche 3-17, 10-2, 12-14 fichiers IDL crer 34-30 fichiers ini 10-9 fichiers objet partag 10-11, 10-17 fichiers palette des bitmaps 47-4 fichiers paquet 13-3 fichiers projet changement 2-3 fichiers ressource chargement 6-47 fichiers ressources et bibliothques de types 33-18 fichiers source changement 2-3 paquets 11-2, 11-7, 11-9, 11-13 fichiers XML 21-16 FieldByName, mthode 18-37, 19-24 FieldCount, proprit champs persistants 15-20 FieldDefs, proprit 18-45 FieldKind, proprit 19-13 FieldName, proprit 19-6, 19-13, 25-46 champs persistants 15-20 grilles de dcision 16-13 grilles de donnes 15-24
Fields, proprit 19-23 FieldValues, proprit 19-23 FileAge, fonction 4-58 FileExists, fonction 4-56 FileGetDate, fonction 4-58 FileName, proprit ensembles de donnes client 14-11, 23-40, 23-42 FileSetDate, fonction 4-58 FillRect, m thode 8-5, 45-3 Filter, proprit 18-15, 18-16 18-17 Filtered, proprit 18-15 FilterGroup, proprit 21-14, 21-15 FilterOnBookmarks, mthode 21-12 FilterOptions, proprit 18-18 filtres 18-1418-18 activation/ dsactivation 18-15 champs vierges 18-16 comparaison de chanes 18-18 dfinition 18-1518-18 dfinition lexcution 18-18 distinction majuscules/ minuscules 18-18 ensembles de donnes client 23-323-5 utilisation de paramtres 23-3423-35 oprateurs 18-17 options des champs texte 18-18 portes ou 18-35 requtes et 18-15 utilisation de signets 21-12 21-13 filtres de donnes 18-1418-18 activation/ dsactivation 18-15 champs vierges 18-16 dfinition 18-1518-18 dfinition lexcution 18-18 ensembles de donnes client 23-323-5 oprateurs 18-17 requtes et 18-15 utilisation de signets 21-12 21-13 finally, mot rserv 45-7, 52-5 FindClose, procdure 4-56 FindDatabase, mthode 20-23 FindFirst, fonction 4-56 I-21
Index
FindFirst, mthode 18-19 FindKey, mthode 18-32, 18-34 EditKey ou 18-35 FindLast, mthode 18-19 FindNearest, mthode 18-32, 18-34 FindNext, fonction 4-56 FindNext, mthode 18-19 FindPrior, mthode 18-19 FindResourceHInstance, fonction 12-13 FindSession, mthode 20-33 First Impression 13-5 First, mthode 18-7 FixedColor, proprit 3-49 FixedCols, proprit 3-49 FixedOrder, proprit 3-41, 6-54 FixedRows, proprit 3-49 FixedSize, proprit 3-41 FlipChildren, mthode 12-8 FloodFill, mthode 8-5, 45-3 flux 3-63 flux de fichier 4-604-64 cration 4-60 E/S de fichier 4-604-64 exceptions 4-62 fin de marqueur 4-63 flux de composant 4-60 modification de la taille 4-63 obtenir un handle 4-58 ouverture 4-60 portables 4-59 TMemoryStream 4-60 focalisation 3-19, 40-4 champs 19-19 dplacement 3-37 focalisation dentre champs 19-19 focalisation de saisie 40-4 FocusControl, mthode 19-19 FocusControl, proprit 3-47 fonctionnalits Windows non portables 10-10 fonctions 40-7 API Windows 40-4 vnements et 43-3 graphiques 45-1 lecture des proprits 47-9, 47-11 nommer 44-2 proprits de lecture 42-6 Windows API 45-1 fonctions membres 3-3
Font, proprit 3-21, 3-35, 3-47, 8-4, 45-3 contrles mmo orients donnes 15-10 en-ttes de colonne 15-24 grilles de donnes 15-24 FontChanged, proprit 10-24 fontes 13-15 hauteur de 8-5 Footer, proprit 28-21 FOREIGN KEY, contrainte 24-15 Format, proprit 16-13 formatage des donnes applications internationales 12-10 formats personnaliss 19-18 formats de donnes par dfaut 19-17 personnalisation 19-18 formats montaires 12-10 formes 3-51, 8-118-12, 8-15 dessin 8-11, 8-15 pourtour 8-6 remplissage 8-8, 8-9 remplissage avec la proprit bitmap 8-9 formes gomtriques dessin 49-9 Formula One 13-5 Found, proprit 18-19 fournisseurs 24-124-16 application des mises jour 24-5, 24-924-13 filtrage des mises jour 24-12 association des documents XML 24-3 association des ensembles de donnes 24-2 association avec des documents XML 26-9 contraintes de donnes 24-15 distants 23-30, 24-3, 25-6, 25-7 ensembles de donnes client et 23-2923-38 vnements du client 24-14 externes 14-13, 23-22, 23-29, 24-2 fourniture de donnes des documents XML 26-10 26-12 gestion des erreurs 24-13 internes 23-22, 23-29, 24-2
locaux 23-30, 24-3 utilisation dobjet de mise jour 20-12 XML 26-926-10 fournisseurs densembles de donnes 14-14 fournisseurs de ressources 39-6 ADO 39-6 BDE 39-6 fourniture 24-1, 25-4 FrameRect, mthode 8-5 FReadOnly 51-9 Free, mthode 3-12, 10-15 FreeBookmark, mthode 18-11 FromCommon 4-69
G
$G, directive de compilation 11-11, 11-13 GDI, applications 40-8, 45-1 gnrateurs de contenu 28-4, 28-14 gestion dvnements 28-16, 28-17, 28-18 gnrateurs de page 28-14 28-18, 29-6, 29-9 chanage 28-17 composants 29-7 conversion de modles 28-16 gestion dvnements 28-16, 28-17, 28-18 modles 29-7 HTML 29-9 orients donnes 28-19 types 29-3 gnrateurs de page ensemble de donnes 28-19 conversion de valeurs de champ 28-20 gnrateurs de table 28-20 28-22 dfinition de proprits 28-20 gestion de la mmoire composants de dcision 16-9 gestion des exceptions 4-54-18 blocs de protection de ressources 4-8 cration dun gestionnaire 4-11 dclaration de lobjet 4-18 excution du code de nettoyage 4-5 flux de contrle 4-6 gestionnaires par dfaut 4-13
I-22
Guide du dveloppeur
instructions 4-11 porte 4-13 prsentation 4-54-18 protection des allocations de ressources 4-7 protection des blocs de code 4-5 TApplication 4-16 Voir aussi exceptions gestion mmoire composants 3-13 fiches 6-7 interfaces 4-27 objets COM 4-22 gestionnaire dactions 6-18, 6-19, 6-20, 6-21, 6-24 gestionnaire daide 5-25, 5-26 5-35 gestionnaire de composants COM+ 39-25 gestionnaire de projet 6-2 gestionnaire de proprits partages 39-7 exemple 39-739-8 gestionnaires dvnements 3-8, 3-283-31, 10-24, 40-7, 51-7 affichage de lditeur de code 47-19 association des vnements 3-29 contrles dessins par le propritaire 7-15 dclarations 43-6, 50-12 dfinition 3-28 dessin de lignes 8-27 criture 3-9, 3-28, 3-29 menus 3-31, 7-12 comme modles 6-45 mthodes 43-3, 43-5, 43-6 surcharge 43-6 paramtres 43-3, 43-8, 43-9, 43-10 notification dvnements 43-8 partage 8-16 partags 3-293-31 pointeurs 43-3, 43-9 rechercher 3-29 redfinir 43-10 rponse aux clics de bouton 8-14 Sender, paramtre 3-30 suppression 3-31 transmission de paramtres par rfrence 43-10
types 43-3 GetAliasDriverName, mthode 20-30 GetAliasNames, mthode 20-30 GetAliasParams, mthode 20-30 GetAttributes, mthode 47-11 GetBookmark, mthode 18-11 GetConfigParams, mthode 20-30 GetData, mthode champs 19-20 GetDatabaseNames, mthode 20-30 GetDriverNames, mthode 20-30 GetDriverParams, mthode 20-30 GetFieldByName, mthode 28-10 GetFieldNames, mthode 17-15, 20-30 GetFloatValue, mthode 47-9 GetGroupState, mthode 23-12 GetHandle 5-28 GetHelpFile 5-28 GetHelpStrings 5-28 GetIDsOfNames, mthode 36-15 GetIndexNames, mthode 17-16, 18-30 GetMethodValue, mthode 47-9 GetNextPacket, mthode 10-33, 20-38, 23-31, 23-32, 24-4 GetOptionalParam, mthode 23-18, 24-7 GetOrdValue, mthode 47-9 GetPalette, mthode 45-5, 45-6 GetParams, mthode 24-4 GetPassword, mthode 20-26 GetProcedureNames, mthode 17-15 GetProcedureParams, mthode 17-16 GetProperties, mthode 47-12 GetRecords, mthode 24-4, 24-8 GetSessionNames, mthode 20-33 GetStoredProcNames, mthode 20-30 GetStrValue, mthode 47-9 GetTableNames, mthode 17-15, 20-30 GetValue, mthode 47-9 GetVersionEx, fonction 13-16 GetViewerName 5-27
GetXML, mthode 26-11 glisser-ancrer 3-22, 3-24, 7-4 7-7 glisser-dplacer 3-21, 7-17-4 DLL 7-4 vnements 49-2 obtention dinformations dtat 7-4 personnalisation 7-3 pointeur de la souris 7-4 Global Offset Table (GOT) 10-23 Glyph, proprit 3-39, 6-50 GNU assembleur 10-20 utilitaire make 10-17 GotoBookmark, mthode 18-11 GotoCurrent, m thode 18-48 GotoKey, mthode 18-32, 18-33 GotoNearest, mthode 18-33, 18-34 Graph Custom Control 13-5 graphes de dcision 16-14 16-20 changement du type de graphe 16-18 comportements lexcution 16-21 cration 16-14 dfinition des sries de donnes 16-1916-20 tats de pivotement 16-10 tats en cours des pivots 16-10 modles 16-18 options daffichage 16-16 personnalisation 16-1716-19 prsentation 16-15 Graphic, proprit 8-19, 8-22, 45-4 graphiques 45-145-8 affichage 3-50 ajout au document HTML 28-15 ajout de contrles 8-18 association aux chanes 3-59 changement des images 8-21 chargement 8-20, 45-4, 45-5 coller 8-24 complexes 45-6 conteneurs 45-4 contrles dessins par le propritaire 7-13 copie 8-23 dans les cadres 6-17 dessin 8-4 I-23
Index
dessin de lignes 8-108-11, 8-298-30 gestionnaires dvnements 8-27 enregistrement 8-21 exemple "techniques de dessin" 8-258-30 fichiers 8-208-22 fonctions, appel 45-1 formats de fichiers 8-3 indpendants 45-3 des priphriques 45-1 internationalisation 12-10 lignes dessin changement de la largeur du crayon 8-6 lignes dessines 8-6 mthodes 45-3, 45-4, 45-7 copie dimages 45-7 palettes 45-5 outils de dessin 45-2, 45-8, 49-5 changement 49-7 prsentation 45-1 prsentation de la programmation 8-18-4 redessiner les images 45-7 redimensionnement 8-21, 15-11, 45-7 remplacement 8-21 stockage 45-4 suppression 8-23 types dobjets 8-38-4 graphiques dfilables 8-18 graphiques, objets threads 9-5 GridLineWidth, proprit 3-49 grilles 3-483-49, 15-3, 50-1, 50-2, 50-5, 50-12 affichage des donnes 15-18, 15-19, 15-32 ajout de donnes 18-22 dessin 15-30 tat par dfaut 15-18 restauration 15-25 insertion de colonnes 15-21 modification de donnes 15-7, 15-2915-30 modification de lordre des colonnes 15-22 obtention de valeurs 15-20 options lexcution 15-28 15-29
orientes donnes 15-17, 15-32 personnalisation 15-1915-25 suppression de colonnes 15-19, 15-22 grilles de chanes 3-49 grilles de couleurs 8-6 grilles de dcision 16-11 affichage des donnes 16-13 comportements lexcution 16-21 cration 16-11 tats de pivotement 16-10 tats en cours des pivots 16-10 vnements 16-14 modification de lordre des colonnes/lignes 16-12 prsentation 16-12 proprits 16-13 grilles de donnes 15-2, 15-3, 15-17, 15-1815-32 affichage des donnes 15-18, 15-19, 15-32 ADT, champs 15-26 tableau, champs 15-26 dessin 15-30 tat par dfaut 15-18 restauration 15-25 vnements 15-3115-32 insertion de colonnes 15-21 modification de donnes 15-7, 15-2915-30 modification de lordre des colonnes 15-22 obtention de valeurs 15-20 options lexcution 15-28 15-29 personnalisation 15-1915-25 proprits 15-33 suppression de colonnes 15-19, 15-22 grilles dessines 3-48 grilles tabulaires 15-32 groupe de turboboutons ajout aux barres doutils 6-49 regroupement 6-50 Grouped, proprit boutons outil 6-53 groupes de discussion 1-3 groupes de proprits partages 39-7 groupes radio 3-44 GroupIndex, proprit 3-39 menus 6-46
turboboutons 6-50 GroupLayout, proprit 16-11 Groups, proprit 16-11 GUID 4-23, 33-4, 34-9 gnration 4-24
H
$H, directive de compilation 4-44, 4-54 Handle, proprit 4-61, 10-25, 32-7, 40-4, 40-6, 45-3 contexte de priphrique 8-2 HandleException 4-16 HandleException, mthode 46-3 handles connexions par socket 32-7 modules ressource 12-13 HandleShared, proprit 20-18 HandlesTarget, mthode 6-32 HasConstraints, proprit 19-14 HasFormat, mthode 7-11, 8-24 Header, proprit 28-21 Height, proprit 3-20, 3-24, 6-4 botes liste 15-13 TScreen 13-14 HelpContext 5-32, 5-33 HelpContext, proprit 3-48 HelpFile 5-33 HelpFile, proprit 3-48 HelpIntfs.pas 5-26 HelpKeyword 5-32, 5-33 HelpSystem 5-32, 5-33 HelpType 5-32, 5-33 hritage 3-6, 3-9 hritage de classe 3-93-13, 41-8 hrites proprits 49-2, 50-2 H riter (rfrentiel dobjets) 5-23 heure internationalisation 12-10 heure, champs formatage 19-17 heures saisie 3-44 hirarchie (classes) 41-4 Hint, proprit 3-48 Hints, proprit 15-36 HorzScrollBar 3-36 Host, proprit client, sockets 32-6 TSocketConnection 25-29 HostName, proprit TCorbaConnection 25-31 htes 25-29, 32-4
I-24
Guide du dveloppeur
adresses 32-4 URL 27-3 HotImages, proprit 6-52 HotKey, proprit 3-37 HTML modles par dfaut 25-45, 25-47 HTML, commandes 28-15 gnration 28-16 informations de base de donnes 28-19 HTML, documents 27-5 gnrateurs de page ensemble de donnes 28-19 HTTP, messages de rponse 27-6 HTML, modles gnrateurs de page WebSnap 29-9 HTML, tables 28-15, 28-21 cration 28-2028-22 dfinition des proprits 28-20 lgendes 28-21 HTMLDoc, proprit 25-45, 28-16 HTMLFile, proprit 28-16 HTTP 27-3 applications multiniveaux 25-1125-12 code de statut 28-12 connexion au serveur dapplications 25-30 en-ttes de message 27-3 en-ttes de rponse 28-13, 37-6 en-ttes de requte 27-4, 28-9, 37-5 prsentation 27-427-6 SOAP 31-1 HTTP, messages de rponse Voir messages de rponse HTTP, messages de requte Voir messages de requte httpd.conf 13-12 httpsrvr.dll 25-11, 25-15, 25-30 HyperHelp, visualiseur 5-25
I
IApplicationObject, interface 37-4 IAppServer, interface 23-37, 23-39, 24-324-4, 25-625-10 appel 25-33 extension 25-19
fournisseurs distants 24-3 fournisseurs locaux 24-3 informations dtat 25-23 transactions 25-21 XML, courtiers 25-39 icon objets graphiques 8-4 icne 6-23 icnes 3-50, 45-4 barres doutils 6-52 vues arborescentes 3-43 IConnectionPoint, interface 36-13 IConnectionPointContainer, interface 36-13 ICustomHelpViewer 5-25, 5-26, 5-27, 5-28 implmentation 5-26 ID de contexte 5-29 IDataIntercept, interface 25-29 IDefaultPageFileName 29-7 identificateurs donnes membres de classe 43-3 vnements 43-9 incorrects 6-36 mthodes 44-2 paramtres de proprit 42-6 types denregistrement de message 46-7 idogrammes 12-3 abrviations et 12-10 caractres 12-4 IDispatch, interface 33-9, 33-20, 36-13, 36-1536-16 automation 33-13 identificateurs 36-16 IDL (Interface Definition Language) 33-16, 33-19, 34-1 diteur de bibliothques de types 34-9 IDL, compilateur 33-19 IDOMImplementation 30-3 IETF, protocoles et standards 27-3 IExtendedHelpViewer 5-26, 5-29 $IFDEF, directive 10-20 $IFEND, directive 10-22 $IFNDEF, directive 10-21 IGetDefaultAction 29-8 IGetProducerComponent 29-7 IGetScriptObject 29-6 IGetWebAppComponents 29-8 IGetWebAppServices 29-8
IHelpManager 5-26, 5-33 IHelpSelector 5-26, 5-30 IHelpSystem 5-26, 5-33, 5-34 IID 33-4 IInterface, interface 4-22, 4-26, 4-27 implmente dans TInterfacedObject 4-22 IInvokable 4-29, 31-4 IIS 37-1 version 37-3 IIteratorObjectSupport 29-6 Image, balise HTML (<IMG>) 28-15 ImageIndex, proprit 6-52, 6-54 ImageList 6-22 ImageMap , balise HTML (<MAP>) 28-15 images 3-50, 8-18, 15-2, 45-3, 45-345-6 affichage 3-50 ajout 8-18 ajout aux menus 6-40 boutons outil 6-52 changement 8-21 chargement 8-20 contrles 8-17 pour 8-2 dans les cadres 6-17 dfilement 8-18 dessin 45-7, 49-8 effacement 8-23 enregistrement 8-21 internationalisation 12-10 pinceaux 8-9 r-affichage 8-3 remplacement 8-21 renforcement du contrle des 7-14 Images, proprit boutons outil 6-52 IMalloc, interface 4-19 IMarshal, interface 36-16, 36-18 IME 12-9 ImeMode, proprit 12-9 ImeName, proprit 12-9 implmentation dvnements 43-2 implements, mot cl 4-24, 4-25 $IMPLICITBUILD, directive de compilation 11-11 importateur de services Web 31-10
Index
I-25
Importation dActiveX, commande 35-2 Importation de bibliothque de types, commande 35-2 ImportedConstraint, proprit 19-14, 19-25 $IMPORTEDDATA, directive de compilation 11-11 Importer un contrle ActiveX, commande 35-4 Importer une bibliothque de types, commande 35-3 impression 3-61 Increment, proprit 3-37 Indent, proprit 3-43, 6-50, 6-52, 6-54 index 18-3018-43, 42-9 actions groupes 20-57, 20-58 affichage des listes 17-16, 18-30 ensembles de donnes client 23-923-12 portes 18-35 recherche sur des cls partielles 18-34 regroupement de donnes 23-1123-12 relations matre/dtail 18-41 spcification 18-3118-32 suppression 23-11 tables dBASE 20-720-8 tri denregistrements 18-30 18-32 tri des enregistrements 23-9 index NDX 20-7 index primaires actions groupes 20-57, 20-58 index, mot rserv 50-7 Index, proprit champs 19-14 IndexDefs, proprit 18-45 IndexFieldCount, proprit 18-31 IndexFieldNames, proprit 18-32, 22-8 IndexName et 18-32 IndexFields, proprit 18-31 IndexFiles, proprit 20-7 IndexName, proprit 20-7, 22-8, 23-11 IndexFieldNames et 18-32 IndexOf, mthode 3-57, 3-58 indicateurs 51-4 I-26
Indy Clients, page de la palette de composants 3-33 Indy Divers, page de la palette de composants 3-34 Indy - Serveurs, page de la palette de composants 3-34 INFINITE, constante 9-11 information dtat gestion 39-6 proprits partages 39-7 transactions 39-12 information de types lexcution 41-7 informations dtat 3-47 communication 25-2325-24 communiquer 24-9 vnements souris 8-25 informations de connexion spcification 17-5 informations de schma 22-14 22-19 champs 22-1722-18 index 22-18 procdures stockes 22-16 22-17, 22-19 tables 22-16 informations de type 33-16 aide 34-9 importer 35-235-6 informations de types dispinterfaces 36-14 interface IDispatch 36-15 informations de version informations de type 34-9 informatique nomade 14-17 Informix, pilotes dploiement 13-10 INI, fichiers Win-CGI, programmes 27-7 initialisation composants 42-14, 49-7 mthodes 42-14 threads 9-3 InitWidget, proprit 10-25 INotifyWebActivate 29-6 Insrer depuis le modle, commande (menu Concepteur) 6-42, 6-43 Insrer depuis une ressource, commande (menu Concepteur) 6-42, 6-47 Insrer le code de support dvnement, option 36-11 Insrer, commande (menu Concepteur) 6-42
INSERT 17-13 INSERT, instruction 20-46, 20-50 INSERT, instructions 24-11 Insert, mthode 18-21, 18-22 Append et 18-22 chanes 3-58 menus 6-46 Insertion de modle, bote de dialogue 6-44 Insertion depuis une ressource, bote de dialogue 6-47 InsertObject, mthode 3-59 InsertRecord, mthode 18-25 InsertSQL, proprit 20-46 inspecteur dobjets 3-8, 3-27, 42-2, 47-7 aide sur 47-4 modification des proprits de tableau 42-3 slection des menus 6-43 Installer les objets COM+, commande de menu 39-24 Installer les objets MTS commande de menu 39-24 InstallShield Express 2-6, 13-1 dploiement applications 13-2 BDE 13-9 paquets 13-3 SQL Links 13-10 instanciation modules de donnes CORBA 25-18 modules de donnes distants 25-16 instructions daffectation 42-2 instructions SQL ensembles de donnes daide la dcision 16-5 ensembles de donnes de dcision et 16-6 fournies par le client 23-38, 24-7 fournies par le fournisseur 24-13 gnration fournisseurs 24-4, 24-11 24-12 TSQLDataSet 22-9 objets mise jour 20-46 20-51 paramtres 17-12 SQL transparent 20-35
Guide du dveloppeur
IntegralHeight, proprit 3-42, 15-13 intgrit des donnes 14-6, 24-15 intgrit rfrentielle 14-6 InterBase Express dploiement 13-7 InterBase, page de la palette de composants 3-33, 14-2 InterBase, pilote dploiement 13-10 InterBaseExpress 10-28 intercepteurs 33-5 interface de document multiple 5-15-3 interface de document unique 5-15-3 Interface Definition Language (IDL) 33-19, 34-1 interface, mot cl 4-19 interfaces 4-194-29, 34-17, 41-4, 41-6, 52-2, 52-3 agrgation 4-24, 4-25 ajouter des mthodes 36-11 ajouter des proprits 36-10 applications distribues 4-28 Automation 36-1336-16 bibliothques de types 35-6, 36-10 bibliothques de types et 33-12 caractristiques du langage 4-19 CLSID 4-28 code exemple 4-20, 4-24, 4-26 COM 4-28, 5-15, 33-1, 33-3, 34-1034-11, 35-1, 36-3, 36-936-16 dclarations 35-6 vnements 36-12 composants 4-27 comptage de rfrences 4-22, 4-23, 4-254-28 conception 41-7 controlling Unknown 4-26, 4-28 CORBA 4-28 Ctrl+Maj+G 4-24 de rpartition 36-13, 36-15 36-16 compatibilit de type 36-17 dlgation 4-24 drivation 4-22
destruction dobjets 4-26 DII (Dynamic Invocation Interface) 4-29 DOM 30-2 doubles 36-1436-15 compatibilit de type 36-17 paramtres 36-18 diteur de bibliothques de types 34-1034-11, 34-17, 36-10 lments de programme non visuels 40-5 en sortie 36-12, 36-13 excution 41-6 extension du modle dhritage simple 4-19, 4-20 gestion de la dure de vie 4-22, 4-26 gestion mmoire 4-23, 4-26 IID 4-23, 4-28 IInterface, implmentation 4-22 implmentation 33-6 implmenter 36-3 internationalisation 12-9, 12-11, 12-14 interrogation dynamique 4-22 invocables 4-29, 31-2, 31-4 31-5 liaison anticipe 25-34 liaison dynamique 4-23, 34-11 liaison tardive 25-33 liaisons dynamiques 36-13 marshaling 4-29 modules de donnes Web 29-6 modules de page Web 29-7 nuds XML 30-5 objets vnement COM+ 39-21 objets externes 4-25 objets internes 4-25 oprateur as 4-23 optimisation du code 4-27 partage entre les classes 4-20 personnalises 36-16 polymorphisme 4-20 prsentation 4-194-29 procdures 4-21 proprits 42-11 proprits, dclaration 52-3 rutilisation du code 4-24
serveurs dapplications 25-1925-21, 25-33 services Web 31-1 SOAP 4-28 systme daide 5-26 TComponent 4-27 utilisation 4-194-29 interfaces COM exceptions 34-10 interfaces de rpartition appels de mthodes 35-14 35-15 bibliothques de types 34-11 diteur de bibliothques de types 34-18 interfaces de types 33-18 interfaces doubles appels de mthodes 35-14 MTS 39-17 objets Active Server 37-3 optimisation 33-18 interfaces du composant cration 52-3 proprits, dclaration 52-3 interfaces et WebSnap 29-6, 29-7 interfaces invocables 4-29, 31-2, 31-431-5 appeler 31-1031-11 dfinition 31-2 domaine dappellation 31-5 implmenter 31-631-7 recenser 31-4 URI 31-10 interfaces utilisateur 3-25, 14-1714-18 disposition 6-46-5 fiches 6-16-2 organisation des donnes 15-815-9, 15-17 InternalCalc, champs 19-7, 23-13 index et 23-11 internationalisation des applications 12-1 Internet serveurs 27-127-10 Internet Engineering Task Force 27-3 Internet Information Server (IIS) 37-1 version 37-3 Internet, page de la palette de composants 3-33 I-27
Index
Internet, standards et protocoles 27-3 InternetExpress 5-14, 25-38 25-48 ou fiches actives 25-3625-37 InternetExpress, page de la palette de composants 3-33 intranets noms dhte 32-4 InTransaction, proprit 17-8 Invalidate, mthode 49-9 Invoke, mthode 36-15 IObjectContext, interface 33-15, 37-3, 39-4, 39-5 arrter une transaction 39-12 IObjectControl, interface 33-15, 39-2 IOleClientSite, interface 35-17 IOleDocumentSite, interface 35-17 IP, adresses 32-4, 32-6 htes 32-4 noms dhte 32-4 IPageResult 29-8 IPaint, interface 4-20 IPersist, interface 4-19 IProducerEditorViewSupport 2 9-7 IProvideClassInfo, interface bibliothques de types 33-17 IProviderSupport, interface 24-2 IPX/SPX, protocoles 32-1 IRequest, interface 37-5 IResponse, interface 37-5 IRotate, interface 4-21 is, mot rserv 3-11 ISAPI, applications 27-7 dboguer 27-9 messages de requte 28-3 ISAPI, DLL 13-11 IsCallerInRole 39-16 IsCallerInRole, mthode 25-7 IScriptingContext, interface 37-3 ISecurityProperty, interface 39-16 IServer, interface 37-7 ISessionObject, interface 37-6 ISetWebContentOptions 29-7 isolation transactions 14-5, 39-10 ISpecialWinHelpViewer 5-26 IsSecurityEnabled 39-16 IsValidChar, mthode 19-20 ItemHeight, proprit 3-42 botes options 15-13 I-28
botes liste 15-13 ItemIndex, proprit 3-41 groupes de boutons radio 3-45 Items, proprit botes liste 3-41 contrles radio 15-16 groupes de boutons radio 3-44 ITypeComp 33-18 ITypeComp, interface 33-18 ITypeInfo 33-18 ITypeInfo, interface 33-18 ITypeInfo2 33-18 ITypeLib 33-18 ITypeLib, interface 33-18 ITypeLib2 33-18 IUnknown, interface 4-28, 33-3, 33-4, 33-19 contrleurs Automation 36-15 IVarStreamable 4-384-39 IWebVariablesContainer 29-6 IXMLNode 30-430-6, 30-7
KeyExclusive, proprit 18-34, 18-39 KeyField, proprit 15-14 KeyFieldCount, proprit 18-34 KeyViolTableName, proprit 20-60 KeywordHelp 5-33 Kind, proprit boutons bitmap 3-39 Kylix 10-1
L
label 40-4 langage de dfinition de donnes 17-11, 18-50, 22-12 langage de manipulation de donnes 17-11, 18-50 Last, mthode 18-7 Layout, proprit 3-39 -LEchemin, directive de compilation 11-13 lecteurs de cassettes audio-numriques 8-34 lecteurs multimdia 3-26, 8-33 8-35 exemple 8-35 lecture des paramtres de proprit 47-9 lecture incrmentale 23-31, 25-23 lecture seule proprits 41-6 Left, proprit 3-20, 3-23, 3-24, 6-4 LeftCol, proprit 3-49 LeftPromotion, mthode 4-34, 4-36 Length, fonction 4-51 lettres de lecteurs 10-17 liaison anticipe 25-34 liaison de donnes 38-12 liaison de fiche 6-2 liaison de vtable liaison immdiate COM 33-17 liaison dynamique 25-33 liaison prcoce Automation 36-14 liaison statique 25-34 COM 33-17 liaison tardive 25-33 Automation 36-13, 36-15 libells 3-47, 12-10, 15-2 colonnes 15-20 libration des ressources 52-5
J
jeux de caractres 4-47, 12-2, 12-212-4 ANSI 12-3 conversions sur plusieurs octets 12-3 OEM 12-3 ordres de tri internationaux 12-10 par dfaut 12-2 sur plusieurs octets 12-3 jeux de caractres ANSI 4-43 journal de modifications 23-6, 23-24, 23-41 annulation des modifications 23-6 enregistrement des modifications 23-7 juste temps, activation 25-8
K
K, notes de bas de page (systme daide) 47-5 KeepConnection, proprit 17-4, 17-14, 20-21 KeepConnections, proprit 20-15, 20-21 KeyDown, mthode 51-10
Guide du dveloppeur
libmidas.dcu 13-7 $LIBPREFIX, directive 5-10 LibraryName, proprit 22-4 libre, modle de thread 36-8 $LIBSUFFIX, directive 5-10 $LIBVERSION, directive 5-10 licence Internet Explorer 38-8 licence dutilisation 13-17 liens de donnes 51-551-7 initialisation 51-6 liens hypertextes ajout au document HTML 28-15 liens symboliques 10-18 lignes 3-48 adaptateurs Web 29-9 dessin 8-6, 8-10, 8-108-11, 8-298-30 changement de la largeur du crayon 8-6 dessin de gestionnaires dvnements 8-27 effacement 8-30 grilles de dcision 16-12 lignes de sparation (menus) 6-37 limites des rectangles 8-11 Lines, proprit 3-35, 42-8 LineSize, proprit 3-37 LineTo, mthode 8-5, 8-8, 8-10, 45-3 Link, balise HTML (<A>) 28-15 Linux 10-1 environnement dexploitation 10-16 rpertoires 10-18 List, proprit 20-33 liste Contains (paquets) 47-21 liste Requires (paquets) 47-21 listes chanes 3-543-59 utilisation dans les threads 9-5 listes dactions 3-30, 6-19, 6-21, 6-266-56 listes de chanes 3-543-59 court terme 3-55 long terme 3-55 ajout dobjets 7-15 ajout dune chane 3-58 contrles dessins par le propritaire 7-147-15 copie 3-58 cration 3-553-56
dplacement dune chane 3-58 dessines par le propritaire 7-13 criture dans un fichier 3-54 lecture depuis un fichier 3-54 objets associs 3-59 parcourir 3-57 position 3-57 positionnement 3-58 recherche de chanes 3-57 sous-chanes 3-57 suppression dune chane 3-58 tri 3-58 listes de fichiers dplacement des lments 7-3 glissement des lments 7-2, 7-3 listes de recherche (systme daide) 47-5 listes droulantes dans les grilles de donnes 15-24 listes modifiables 10-9 ListField, proprit 15-14 ListSource, proprit 15-14 -LNchemin, directive de compilation 11-13 Loaded, mthode 42-14 LoadFromFile, mthode chanes 3-54 ensembles de donnes ADO 21-17 ensembles de donnes client 14-11, 23-40 graphiques 8-20, 45-4 LoadFromStream, mthode ensembles de donnes client 23-40 LoadParamListItems, procdure 17-16 LoadParamsFromIniFile, mthode 22-5 LoadParamsOnConnect, proprit 22-5 Local SQL 20-10 requtes htrognes 20-10 locales 12-2 formats des donnes et 12-10 modules ressource 12-11 LocalHost, proprit client, sockets 32-7 localisation 12-1, 12-14
des applications 12-2 ressources 12-11, 12-12, 12-14 LocalPort, proprit client, sockets 32-7 Locate, mthode 18-12 Lock, mthode 9-8 LockType, proprit 21-14 LogChanges, proprit 23-6, 23-41 LoginPrompt, proprit 17-5 Lookup, mthode 18-13 LookupCache, proprit 19-11 LookupDataSet, proprit 19-11, 19-14 LookupKeyFields, proprit 19-11, 19-14 LookupResultField, proprit 19-14 lParam, paramtre 46-2 LPK_TOOL.EXE 38-8 -LUpaquet, directive de compilation 11-13
M
MainMenu, composant 6-34 Man, pages 5-25 mappages XML 26-226-4 dfinition 26-4 Mappings, proprit 20-58 Margin, proprit 3-39 marshaler thread libre 36-8 marshaling 33-8 IDispatch, interface 33-13 interface IDispatch 36-16 interfaces COM 33-8, 36-4, 36-1636-18 personnalis 36-18 MasterFields, proprit 18-41, 22-13 MasterSource, proprit 18-41, 22-13 Max, proprit barres de progression 3-48 barres gradues 3-37 MaxDimensions, proprit 16-22 MaxLength, proprit 3-35 contrles mmo orients donnes 15-10 contrles orients donnes de texte format 15-11 MaxRecords, proprit 25-42 MaxRows, proprit 28-21
Index
I-29
MaxStmtsPerConn, proprit 22-3 MaxSummaries, proprit 16-22 MaxTitleRows, proprit 15-27 MaxValue, proprit 19-14 MBCS 4-47 MDAC 13-7 MDI, applications 5-15-3 cration 5-2 menus fusion 6-466-47 spcification du menu actif 6-46 Memo, contrle 3-34 mmoire composants daide la dcision 16-21 conservation 41-9 mmoire cache ressources 45-2 mmoire dynamique 3-63 mmos 42-8 Menu 6-19 Menu, proprit 6-46 menus 6-336-46 accs aux commandes 6-38 affichage 6-41, 6-42 ajout 6-356-41 dautres applications 6-47 droulants 6-386-39 ajout dimages 6-40 dplacement dlments 6-40 dplacement parmi 6-42 enregistrement comme modles 6-43, 6-446-45 gestion des vnements 3-31, 6-45 internationalisation 12-9, 12-11 modles 6-35, 6-42, 6-43 6-46 chargement 6-43 suppression 6-44 noms 6-35 rutilisation 6-42 surgissants 7-127-13 menus contextuels ajout dlments 47-1847-19 barres doutils 6-55 concepteur de menus 6-42 menus droulants 6-386-39 affichage 6-41 menus droulants et 6-38 menus, listes dactions 6-20
MergeChangeLog, mthode 23-8, 23-41 $MESSAGE, directive 10-23 message de requte HTTP 29-13 messages 10-24, 46-146-8, 50-4 clavier 51-9 dcomposeur 46-2 dfinis 46-2 dfinis par lutilisateur 46-5, 46-8 enregistrements types, dclaration 46-6 gestion 46-346-5 gestionnaires 46-1, 46-3, 50-4, 50-5 cration 46-546-8 dclarations 46-6, 46-8 par dfaut 46-3 surcharge 46-4 identificateurs 46-6 souris 51-9 Windows 6-5 messages derreur internationalisation 12-11 messages de frappes de touches 43-6 messages de rponse 28-3, 37-5 contenu 28-13, 28-1428-22 cration 28-1128-13, 28-14 28-22 envoi 28-9, 28-14 informations den-tte 28-1228-13 informations de base de donnes 28-1828-22 informations de statut 28-12 rponse aux 28-13 messages de requte 28-3, 37-5 contenu 28-11 courtier XML 25-43 lments daction 28-6 HTTP, prsentation 27-5 27-6 informations den-tte 28-9 28-11 rpartition 28-5 rponse aux 28-828-9 traitement 28-5 types 28-10 messages lis au clavier 51-9 messages souris 46-2 messages WM_PAINT 8-2 mesures conversion 4-64 mtadonnes 17-1417-16
dbExpress 22-1422-19 modification 22-1222-13 obtention auprs des fournisseurs 23-32 mtafichiers 3-50, 8-1, 8-20, 45-4 quand les utiliser 8-4 Method, proprit 28-10 mthodes 3-3, 8-16, 40-7, 44-1, 50-11 ajouter aux interfaces 36-11 appel 43-6, 44-3, 49-4 dclaration 8-16, 44-4 dynamiques 41-10 publiques 44-3 statique 41-8 virtuelles 41-9 dessin 49-8, 49-9 et objets 3-5, 3-8 gestion des messages 46-1, 46-5 gestionnaires dvnements 43-3, 43-5, 43-6 surcharge 43-6 graphiques 45-3, 45-4, 45-7 palettes 45-5, 45-6 hrites 43-6 initialisation 42-14 nommer 44-2 pointeurs 43-9 proprits et 42-542-7, 44-1, 44-2, 49-4 protges 44-3 publiques 44-3 redfinition 41-8, 41-9 rpartition 41-7 suppression 3-31 surcharge 41-9, 46-3, 50-12 virtuelles 41-8, 44-4 mthodes dynamiques 41-9 mthodes statiques 41-8 mthodes virtuelles 41-8 MethodType, proprit 28-7, 28-11 Microsoft Server DLL 27-7 Microsoft Server, DLL 27-7 messages de requte 28-3 Microsoft SQL Server, pilote dploiement, pilote 13-10 Microsoft Transaction Server 5-16, 39-1 midas.dll 23-1, 25-3 midaslib.dcu 25-3 MIDI, fichiers 8-35
I-30
Guide du dveloppeur
MIDL gnration de fichiers en-tte 33-19 gnration du code proxy/ stub 33-19 Voir aussi IDL mime 8-23 MIME, messages 27-6 Min, proprit barres de progression 3-48 barres gradues 3-37 MinSize, proprit 3-38 MinValue, proprit 19-14 mise jour des donnes 25-43 25-44 mise jour des enregistrements 25-4325-44 mises jour en cache 23-18 23-29 ensembles de donnes client 23-19, 23-2423-29 application des mises jour 23-2423-25 erreurs de mise jour 23-2723-29 objets mise jour 23-22 prsentation 23-2023-21 relations matre/dtail 23-22 mises jour en cascade 24-7 mises jour en mmoire cache BDE 20-3720-55 application 20-3920-43 tables multiples 20-46, 20-51 gestion derreur 20-43 20-45 ensembles de donnes clients application tables multiples 20-46, 20-51 mises jour groupes 21-13 21-16 annulation 21-16 application 21-1521-16 mises jour places en mmoire cache ADO 21-1321-16 annulation 21-16 application 21-1521-16 ensembles de donnes client 14-1214-16 erreurs de mise jour 24-13 transactions 17-7 fournisseurs 24-924-10
MM, film 8-34 modales, fiches 6-6 mode ddition 18-20 annulation 18-21 Mode, proprit 20-57 crayons 8-6 modle "briefcase" 14-17 modle "dconnect" 14-17 modle de thread 39-18 apartment 36-9 contrles ActiveX 38-5 libre 36-8 modles 5-22, 5-24 applications serveur agent Web 28-3 composant 6-14 gnrateurs 29-7 gnrateurs de page 29-7 graphes de dcision 16-18 menus 6-35, 6-42, 6-436-46 chargement 6-43 programmation 5-3 modles de code 5-3 modles de composants 6-14, 41-2 et cadres 6-16, 6-17 modles de projet 5-24 modles de thread 36-636-9 objets COM 36-3, 36-5 registres 36-7 modles HTML 25-4725-48 modles threading modules de donnes CORBA 25-19 modules de donnes distants 25-15 modules de donnes MTS 25-16 modes de dessin 8-30 Modification de graphe, bote de dialogue 16-18 modification des proprits tableau 42-3 modification du code 2-4 modification en mmoire cache BDE appliquer 20-12 mise jour densembles en lecture seule 20-12 ensembles de donnes clients appliquer 20-12 mise jour densembles en lecture seule 20-12 Modified, m thode 51-12 Modified, proprit 3-35
Modifiers, proprit 3-37 ModifyAlias, mthode 20-29 ModifySQL, proprit 20-46 module base de donnes 20-63 Module de donnes CORBA, expert 25-1825-19 Module de donnes distant, expert 25-15, 25-1525-16 Module de donnes MTS, expert 25-1625-17 Module de donnes SOAP, expert 25-1725-18 modules 40-12 diteur de bibliothques de types 34-12, 34-21, 34-27 modules dapplication Web interfaces interfaces modules Web 29-8 modules de donnes 14-7, 25-6, 29-6 accs depuis des fiches 5-21 applications serveur agent Web 28-4 applications Web et 28-2, 28-3 composants base de donnes 20-18 cration 5-17 distant ou standard 5-17 distants Voir modules de donnes distants modification 5-17 sessions 20-20 Web 29-3, 29-5 modules de donnes CORBA instanciation 25-18 modles threading 25-19 modules de donnes distants 5-21, 25-3, 25-6, 25-13, 25-1525-19 enfant 25-25 instanciation 25-16 modle threading 25-16 modles threading 25-15 multiples 25-2425-25, 25-3525-36 parent 25-25 regroupement 25-9 sans tat 25-8, 25-9, 25-23 25-24 modules de donnes MTS attributs de transaction 25-17 modles threading 25-16
Index
I-31
modules de donnes transactionnels 25-6 connexions de base de donnes 25-6 regroupement 25-7 connexions de bases de donnes 25-9 interface 25-20 scurit 25-10 modules de donnes Web 29-5 interfaces 29-6 structure 29-6 modules de fusion 13-4 modules de page 29-3, 29-7 Web 29-6 modules de page Web 29-3, 29-6 interfaces 29-7 modules ressource 12-11, 12-12 modules Web 28-228-3, 28-4, 29-529-8 types 29-5 mois, renvoyer actuel 50-8 Moniteur SQL 20-62 monnaie internationalisation 12-10 Month, proprit 50-6 MonthCalendar, composant 3-44 moteur de bases de donnes Borland 5-11, 14-1, 18-2, 20-1 dploiement 13-9, 13-17 mises jour en mmoire cache 20-3720-55 rcupration des donnes 18-56, 20-2, 20-3 Web, applications 13-11 moteurs de bases de donnes tiers 13-8 motifs 8-9 de remplissage 8-8 motifs de remplissage 8-9 mots cls 47-5 protected 43-6 mots de passe connexions implicites et 20-15 tables dBASE 20-2420-27 tables Paradox 20-2420-27 MouseDown, mthode 51-9 MouseToCell, mthode 3-49 .MOV, fichiers 8-34 Move, mthode listes de chanes 3-58, 3-59 MoveBy, mthode 18-8 I-32
MoveCount, proprit 20-59 MoveFile, fonction 4-58 MovePt 8-30 MoveTo, mthode 8-5, 8-8, 45-3 moyennes cubes de dcision 16-5 .MPG, fichiers 8-34 MTS 5-16, 25-7, 33-11, 33-15, 39-1 voir aussi objets transactionnels applications de bases de donnes multiniveaux 25-725-9 compar COM+ 39-2 contraintes 39-3 environnement dexcution 39-2 libration des ressources 39-8 rfrences dobjets 39-21 39-23 serveurs en processus 39-2 transactions 25-21 multibarres 6-48, 6-53 multimdia 8-35 multiniveaux architecture base sur le Web 25-36 architecture des applications 25-5, 25-6 multiniveaux, applications 25-125-48 Multi-niveaux, page (Nouveaux lments, bote de dialogue) 25-3 multi-octets jeux de caractres 12-3 multiplates-formes cration des applications 10-1 multiplates-formes, applications 10-110-34 MultiSelect, proprit 3-42 multitche 10-18 multithread, applications 9-1 multitraitement threads 9-1 mutuellement exclusifs, options 6-50 MyBase 23-39
N
Name, proprit champs 19-14 lments de menu 3-31
paramtres 18-61 navigateur 15-2, 15-3315-36, 18-6, 18-7 activation/dsactivation des boutons 15-34, 15-35 boutons 15-34 dition 18-21 panneaux dinformations 15-36 partage entre ensembles de donnes 15-36 suppression de donnes 18-23 navigateur de base de donnes 15-2, 15-3315-36, 18-6, 18-7 activation/dsactivation des boutons 15-34, 15-35 boutons 15-34 dition 18-21 panneaux dinformations 15-36 suppression de donnes 18-23 NetCLX 5-13, 10-7 NetFileDir, proprit 20-27 Netscape Server, DLL 27-7 messages de requte 28-3 NewValue, proprit 20-44, 24-13 Next, mthode 18-8 NextRecordSet, mthode 18-64, 22-10 niveau disolement des transactions 17-1017-11 spcification 17-11 transactions locales 20-36 niveaux 25-1 niveaux de regroupement 23-12 agrgats maintenus 23-15 nom de dmarrage du service 5-8 nom de page 29-7 nombres 42-2 internationalisation 12-10 valeurs de proprit 42-13 noms dhte 32-4 adresses IP 32-5 noms de chemins 10-18 noms de connexion 22-522-6 changement 22-6 dfinition 22-6 suppression 22-6 noms de pilotes 20-15 non modales, fiches 6-6, 6-8
Guide du dveloppeur
norme UCS 10-25 NOT NULL UNIQUE, contrainte 24-15 NOT NULL, contrainte 24-15 notes de dernire minute 13-17 notification dvnements 6-5, 6-6, 43-8 notifications systme 10-24 NotifyID 5-27 Nouveau champ, bote de dialogue 19-6 dfinition de champs 19-8, 19-10, 19-12 Dfinition de la rfrence 19-7 Champ rsultat 19-11 Champs cl 19-10 Cls de rfrence 19-10 Ensemble de donnes 19-10 Proprits du champ 19-6 Type 19-7 Type de champ 19-7 Nouveau, commande 40-12 Nouveaux lments, dialogue 5-22, 5-23, 5-24 Nouvel objet thread, bote de dialogue 9-2 Nouvelle application WebSnap 29-2 NSAPI, applications 27-7 dboguer 27-9 messages de requte 28-3 NumericScale, proprit 18-54, 18-61 numros de contexte (aide) 3-48 NumGlyphs, proprit 3-39
O
Object , balise HTML (<OBJECT>) 28-15 ObjectBroker, proprit 25-28, 25-29, 25-30, 25-32 ObjectName, proprit TCorbaConnection 25-31 Objects, proprit 3-49 listes de chane 7-17 listes de chanes 3-59 ObjectView, proprit 15-26, 18-43, 19-27 objet de mise jour fournisseurs et 20-12 objet, champs 19-2619-32 types 19-26 objets 3-1, 3-53-13, 4-1
accs 3-93-10 cration 3-12 dclarations de type 3-11 dfinition 3-5 destruction 3-12 vnements et 3-8 glisser-dplacer 7-1 hritage 3-93-13 image 45-4 instances multiples 3-6 instanciation 3-6 non visuels 3-12 personnalisation 3-9 proprits 3-5 temporaires 45-7 TObject 3-15 utilitaires 3-53 Voir aussi objets COM objets abonns 35-1635-17 abonnements par utilisateur 35-17 abonnements permanents 35-17 abonnements temporaires 35-16 objets Active Server 37-137-9 crer 37-237-8 dbogage 37-9 recenser 37-837-9 serveurs en processus 37-8 serveurs hors processus 37-8 objets adapts aux threads 9-5 objets ADO 21-1 DataSpace RDS 21-19 Recordset 21-10 objets Automation 33-12 composants enveloppe 35-7 35-8 exemple 35-1035-13 experts 36-436-9 Voir aussi objets COM objets ayant un propritaire 49-549-8 initialisation 49-7 objets COM 33-3, 33-5, 33-9, 36-136-19 composants enveloppe 35-1, 35-2, 35-3, 35-735-13 conception 36-2 crer 36-136-18 dbogage 36-19 dfinition 33-3 experts 36-236-4, 36-9 gestion de la dure de vie 4-22
interfaces 36-936-16 mise jour 33-6 recenser 36-1836-19 vrification de type 33-16, 33-18 objets externes 33-9 objets internes 33-9 objets mise jour 20-45, 20-53, 23-22 excution 20-5220-54 instructions SQL 20-46 20-51 multiples 20-5120-54 paramtres 20-4820-49, 20-53, 20-5420-55 requtes 20-5420-55 objets non visuels 3-12 objets orients threads 9-5 objets partags 10-25 objets requte informations den-tte 28-4 objets sans tat 39-12 objets scriptables 29-12 objets socket Windows clients 32-6 sockets client 32-6 sockets serveur 32-7 objets temporaires 45-7 objets thread initialisation 9-3 objets transactionnels 33-11, 33-15, 39-139-25 activits 39-1939-20 administrer 33-15, 39-25 bibliothques de types 39-3 callbacks 39-23 caractristiques 39-239-3 contraintes 39-3 crer 39-1639-20 dbogage 39-2339-24 expert 39-1739-20 gestion des ressources 39-4 39-9 installer 39-2439-25 regroupement des connexions de base de donnes 39-6 scurit 39-1539-16 transactions 39-5 .OCX, fichiers 13-5 ODBC, pilotes utilisation avec ADO 21-1, 21-2, 21-3 utilisation avec le BDE 20-18
Index
I-33
ODL (Object Description Language) 33-16, 34-1 OEM, jeux de caractres 12-3 OEMConvert, proprit 3-35 OldValue, proprit 20-44, 24-13 OLE conteneurs 3-26 fusion de menus 6-46 OLE Automation voir Automation OLE DB 21-1, 21-2, 21-3 OleObject, proprit 38-14, 38-15 OLEView 33-19 OnAccept, vnement 32-8 serveur, sockets 32-10 sockets serveur 32-10 OnAction, vnement 28-8 OnAfterPivot, vnement 16-10 OnBeforePivot, vnement 16-10 OnBeginTransComplete, vnement 17-7, 21-9 OnCalcFields, vnement 18-26, 19-8, 19-9, 23-13 OnCellClick, vnement 15-31 OnChange, vnement 19-18, 45-7, 49-7, 50-12, 51-12 OnClick, vnement 3-39, 43-1, 43-3, 43-5 boutons 3-7 menus 3-31 OnClientDisconnect, vnement 32-8 OnColEnter, vnement 15-31 OnColExit, vnement 15-31 OnColumnMoved, vnement 15-23, 15-31 OnCommitTransComplete, vnement 17-9, 21-9 OnConnect, vnement client, sockets 32-9 OnConnectComplete, vnement 21-8 OnConnecting, vnement sockets serveur 32-9 OnConstrainedResize, vnement 6-5 OnCreate, vnement 40-14 OnDataChange, vnement 15-5, 51-7, 51-11 OnDataRequest, vnement 23-38, 24-4, 24-14
OnDblClick, vnement 15-31, 43-5 OnDecisionDrawCell, vnement 16-14 OnDecisionExamineCell, vnement 16-14 OnDeleteError, vnement 18-23 OnDisconnect, vnement 21-9 client, sockets 32-7 OnDragDrop, vnement 7-3, 15-31, 43-5 OnDragOver, vnement 7-2, 15-31, 43-5 OnDrawCell, vnement 3-48 OnDrawColumnCell, vnement 15-30, 15-31 OnDrawDataCell, vnement 15-31 OnDrawItem, vnement 7-17 OnEditButtonClick, vnement 15-25, 15-31 OnEditError, vnement 18-20 OnEndDrag, vnement 7-3, 15-31, 43-5 OnEndPage, m thode 37-3 OnEnter, vnement 15-31, 43-5 OnError, vnement sockets 32-9 OnExecuteComplete, vnement 21-9 OnExit, vnement 15-31, 51-13 OnFilterRecord, vnement 18-15, 18-1718-18 OnGetData, vnement 24-9 OnGetDataSetProperties, vnement 24-7 OnGetTableName, vnement 20-12, 23-26, 24-14 OnGetText, vnement 19-18 OnGetThread, vnement 32-10 onglets draw-item, vnements 7-17 styles dessins par le propritaire 7-14 OnHandleActive, vnement client, sockets 32-9 OnHTMLTag, vnement 25-48, 28-16, 28-17, 28-18 OnIdle, gestionnaire dvnement 9-5 OnInfoMessage, vnement 21-9 OnKeyDown, vnement 15-31, 43-5, 51-10
OnKeyPress, vnement 15-31, 43-5 OnKeyUp, vnement 15-31, 43-5 OnLayoutChange, vnement 16-10 OnLogin, vnement 17-5 OnMeasureItem, vnement 7-16 OnMouseDown, vnement 8-25, 8-26, 43-5, 51-9 paramtres transmis 8-25 OnMouseMove, vnement 8-25, 8-27, 43-5 paramtres transmis 8-25 OnMouseUp, vnement 8-15, 8-25, 8-27, 43-5 paramtres transmis 8-25 OnNewDimensions, vnement 16-10 OnNewRecord, vnement 18-21 OnPaint, vnement 3-51, 8-2 OnPassword, vnement 20-15, 20-26 OnPopup, vnement 7-12 OnPostError, vnement 18-24 OnReceive 32-11 OnReconcileError, vnement 10-33, 20-37, 23-25, 23-28 OnRefresh, vnement 16-8 OnRequestRecords, vnement 25-43 OnResize, vnement 8-3 OnRollbackTransComplete, vnement 17-10, 21-9 OnScroll, vnement 3-36 OnSend 32-11 OnSetText, vnement 19-18 OnStartDrag, vnement 15-31 OnStartPage, mthode 37-3 OnStartup, vnement 20-20 OnStateChange, vnement 15-5, 16-10, 18-4 OnSummaryChange, vnement 16-10 OnTerminate, vnement 9-7 OnTitleClick, vnement 15-31 OnTranslate, vnement 26-8 OnUpdateData, vnement 15-5, 24-9, 24-10
I-34
Guide du dveloppeur
OnUpdateError, vnement 10-33, 20-37, 20-4320-45, 23-27, 24-13 OnUpdateRecord, vnement 20-38, 20-42 20-43, 20-46, 20-53 OnValidate, vnement 19-18 OnWillConnect, vnement 17-6, 21-8 Open, mthode composants de connexion 17-3 ensembles de donnes 18-5 requtes 18-56 serveur, sockets 32-8 sessions 20-20 OpenDatabase, mthode 20-20, 20-22 OpenSession, mthode 20-33 OpenString 4-46 oprateurs de chane 4-55 oprations avec effet 45-7 oprations groupes 20-820-9, 20-5520-60 ajout de donnes 20-57 bases de donnes diffrentes 20-58 copie densembles de donnes 20-58 excution 20-59 gestion derreur 20-60 mappage des types de donnes 20-5820-59 mise jour de donnes 20-57 mise en place 20-5520-56 modes 20-9, 20-57 suppression denregistrements 20-58 optimisation des ressources systme 40-4 optimisation du code 8-16 interfaces 4-27 options modules dapplication Web 29-3 Options de dploiement Web, bote de dialogue 38-17 Options de page du module dapplication 29-3 options du compilateur 5-3 options du projet 5-3 par dfaut 5-3 Options du projet, bote de dialogue 5-3 Options, proprit 3-49
fournisseurs 24-624-7 grilles de dcision 16-14 grilles de donnes 15-28 TSQLClientDataSet 23-20 Oracle, pilotes dploiement 13-10 Oracle8 limites de cration des tables 18-46 ORDER BY, clause 18-30 ordre de tri 12-10 dcroissant 23-10 dfinition 18-32 ensembles de donnes client 23-9 TSQLTable 22-8 ordre des tabulations 3-24 Orientation, proprit barres gradues 3-37 grilles de donnes 15-33 Origin, proprit 8-29, 19-14 outils de conception 2-2 outils de dessin 45-2, 45-8, 49-5 affectation par dfaut 6-50 changement 8-14, 49-7 gestion de plusieurs outils dans une application 8-13 test 8-13 outils de traduction 12-1 ouverture de session connexions SOAP 25-31 Web, connexions 25-30 Overload, proprit 20-13 override, directive 41-9 Owner, proprit 3-13, 40-14 OwnerDraw proprit 7-14
P
$P, directive de compilation 4-54 PacketRecords, proprit 10-33, 20-38, 23-31 pages Active Server 37-9 documents HTML 37-1 interface utilisateur 37-1 pages de code 12-3 pages de proprits 38-15 actualiser 38-14 actualiser les contrles ActiveX 38-15 ajouter des contrles 38-14 38-15 associer aux proprits dun contrle ActiveX 38-14
contrles ActiveX 35-7, 38-4, 38-15 contrles imports 35-5 crer 38-1338-15 expert 38-13 pages Web producteur de page InternetExpress 25-44 25-48 PageSize, proprit 3-37 Paint, mthode 45-7, 49-8, 49-9 palette de composants 3-32 AccsBD, page 14-2, 25-3 ADO, page 14-2, 21-2 ajout de composants 11-6, 47-1, 47-4 BDE, page 14-1 cadres 6-16 ContrleBD, page 14-17 dbDirect, page 14-2 Decision Cube, page 14-18 InterBase, page 14-2 page AccsBD 3-32 page ActiveX 3-34 page ADO 3-33 page BDE 3-33 page ContrleBD 15-1, 15-2 page DataSnap 3-33, 25-3, 25-7 page dbExpress 3-32, 22-2 page Decision Cube 16-1 page Dialogues 3-33 page Exemples 3-33, 3-34 page FastNet 3-33 page Indy - Clients 3-33 page Indy - Divers 3-34 page Indy - Serveurs 3-34 page InterBase 3-33 page Internet 3-33 page InternetExpress 3-33 page QReport 3-33 page Serveurs 3-33, 3-34 page Standard 3-32 page Supplment 3-32 page Systme 3-32 page Win 3.1 3-33 page Win32 3-32 pages 3-32 PaletteChanged, mthode 45-6 PaletteChanged, proprit 10-24 palettes 45-545-6 comportement par dfaut 45-6 spcification 45-5 PanelHeight, proprit 15-33 I-35
Index
Panels, proprit 3-48 PanelWidth, proprit 15-33 panneaux dinformations 3-48, 15-36 PAnsiChar 4-46 PAnsiString 4-51 paquet chargement dynamique 11-4 paquets 11-111-16, 47-21 collections 11-14 compilation 11-1111-13 options 11-11 composants 47-21 conception 11-1, 11-511-7 cration 5-10, 11-711-13 dploiement dapplications 11-3, 11-14 directives de compilation 11-11 DLL 11-1, 11-2 excution 11-1, 11-311-5, 11-8 extensions de noms de fichiers 11-1 fichiers source 11-2, 11-13 installation 11-611-7 internationalisation 12-12, 12-14 liste Contains 11-7, 11-10, 47-21 liste Requires 11-7, 11-8, 11-10, 47-21 modification 11-8 options 11-8 paramtres par dfaut 11-8 personnaliss 11-5 rfrencement 11-4 rfrences dupliques 11-10 Seulement en conception, option 11-8 utilisation 5-10 utilisation dans des applications 11-311-5 paquets derreur SOAP 31-7 paquets de donnes 26-5 actualiser les enregistrements modifis 24-7 champs 24-5 conversion en documents XML 26-126-9 copie 23-1623-17 informations dfinies par lapplication 23-18, 24-7 lecture 23-3123-32, 24-8 24-9 I-36
lecture seule 24-6 limitation des modifications client 24-6 mappage vers des documents XML 26-2 modification 24-8 proprits des champs 24-7 unicit des enregistrements 24-5 XML 25-36, 25-38, 25-42 dition 25-43 lecture 25-4225-43 paquets delta 24-9, 24-10 filtrage des mises jour 24-12 modification 24-9, 24-10 24-11 XML 25-42, 25-4325-44 paquets MTS 39-7, 39-24 par dfaut classe anctre 41-4 gestionnaires message 46-3 options du projet 5-3 valeurs 15-12 valeurs de proprit 42-7 modification 48-2, 48-3 spcification 42-13 spcification des valeurs proprit par dfaut 42-13 par rfrence seulement proprits dinterface COM 34-10 Paradox, tables 20-6 ajout denregistrements 18-22, 18-23 rcupration des index 18-31 renommer 20-8 ParamBindMode, proprit 20-13 ParamByName, mthode procdures stockes 18-62 requtes 18-54 ParamCheck, proprit 18-52, 22-13 Parameters, proprit 21-22 TADOCommand 21-22 TADOQuery 18-52 TADOStoredProc 18-60 paramtrage des requtes 18-50, 18-5218-54 cration lexcution 18-54 la conception 18-53
paramtres classes comme 41-10 de courtiers XML 25-43 de proprit 42-6, 42-7 de lecture 42-6, 42-9 de tableau 42-9 criture 42-9 ensembles de donnes client 23-3223-35 filtrage denregistrements 23-34 23-35 entre 18-59 entre/sortie 18-60 vnements souris 8-25, 8-26 gestionnaires dvnements 43-3, 43-8, 43-9 HTML, balises 28-15 interfaces doubles 36-18 messages 46-2, 46-6 modes de liaison 20-13 rsultat 18-60 sortie 18-59, 23-33 TXMLTransformClient 26-10 paramtres de connexion 20-1620-17 ADO 21-4 dbExpress 22-4, 22-6 informations de connexion 17-5, 21-4 paramtres de localisation 4-48 paramtres optionnels 23-18, 24-8 ParamName, proprit 25-46 Params, proprit ensembles de donnes client 23-33, 23-34 procdures stockes 18-60 requtes 18-52, 18-54 TDatabase 20-16 TSQLConnection 22-4 XML, courtiers 25-43 ParamType, proprit 18-53, 18-61 ParamValues, proprit 18-54 Parent, proprit 40-14 ParentColumn, proprit 15-28 ParentShowHint, proprit 3-48 partage des fiches et des dialogues 5-225-25 partage des fichiers source 10-15 partie publie des classes 41-7 Pascal Objet 10-25 prsentation 3-4
Guide du dveloppeur
PasteFromClipboard, mthode 7-10 contrles mmo orients donnes 15-10 graphiques 15-11 PathInfo, proprit 28-6 .PCE, fichiers 11-14 PChar 4-46 conversions chane 4-52 PDOXUSRS.NET 20-27 Pen, proprit 8-4, 8-6, 45-3 PenPos, proprit 8-4, 8-8 PENWIN.DLL 11-12 priphriques mdia 8-33 permanence fournisseurs de ressources 39-6 permissions de fichiers 10-17 persistantes, colonnes 15-18, 15-2015-21 cration 15-2115-25 insertion 15-22 modification de lordre 15-22 suppression 15-19, 15-22 personnalisation de composants 42-1 PickList, proprit 15-24, 15-25 picture, objets 8-3 Picture, proprit 3-50, 8-18 dans les cadres 6-17 Pie, mthode 8-5 pilote de base de donnes BDE 20-3 pilotes de bases de donnes BDE 20-1, 20-15 pilotes ODBC utilisation avec le BDE 20-1, 20-17 pinceaux 8-88-10, 49-5 bitmap, proprit 8-9 changement 49-7 couleurs 8-8 styles 8-9 pivots de dcision 16-1016-11 boutons de dimension 16-11 comportement lexcution 16-20 orientation 16-11 proprits 16-11 Pixel, proprit 8-4, 45-3 pixels lecture et dfinition 8-10 Pixels, proprit 8-5, 8-10 pmCopy, constante 8-30 pmNotXor, constante 8-30
pointeur dinterface 33-5 pointeur de la souris glisser-dplacer 7-4 pointeurs classe 41-10 mthode 43-3 valeurs de proprit par dfaut 42-13 pointeurs de m thodes 43-2, 43-3, 43-9 points de suspension (...) bouton, dans les grilles 15-25 Polygon, m thode 8-5, 8-12 polygones 8-12 dessin 8-12 polylignes 8-10, 8-11 dessin 8-10 Polyline, mthode 8-5, 8-11 polymorphisme 3-2, 3-6 PopupMenu, composant 6-34 PopupMenu, proprit 7-12 Port, proprit serveur, sockets 32-7 TSocketConnection 25-29 portable code 10-19 portage dapplications 10-1 10-34 porte (objets) 3-93-10 portes 18-3518-40 annulation 18-40 application 18-40 filtres ou 18-35 index et 18-35 limites 18-38 modification 18-39 spcification 18-3618-39 valeurs null 18-37, 18-38 ports 32-5 client, sockets 32-6, 32-7 connexions multiples 32-5 serveur, sockets 32-7 services et 32-2 Position, proprit 3-37, 3-48 Post, mthode 18-24 Edit et 18-21 pourtours, dessiner 8-6 Precision, proprit champs 19-14 paramtres 18-54, 18-61 Prepared, proprit ensembles de donnes unidirectionnels 22-10 procdures stockes 18-63 requtes 18-56
Presse-papiers 7-9, 15-10 effacement de la slection 7-11 formats ajout 47-17, 47-20 graphiques et 8-228-24 objets graphiques 15-11 test du contenu 7-11 PRIMARY KEY, contrainte 24-15 Prior, mthode 18-8 priorits utilisation de threads 9-3 utilisation des threads 9-1 Priority, proprit 9-3 private 3-10 private, section 4-2 PrivateDir, proprit 20-28 ProblemCount, proprit 20-60 ProblemTableName, proprit 20-60 ProcedureName, proprit 18-59 procdures 40-7, 43-3 nommer 44-2 paramtres de proprit 47-13 procdures stockes 14-6, 18-28, 18-5818-64 affichage des listes 17-15 BDE 20-3, 20-1320-14 liaison des paramtres 20-13 cration 22-12 dbExpress 22-822-9 excution 18-63 paramtres 18-5918-62 la conception 18-60 18-62 densembles de donnes client 23-34 excution 18-62 proprits 18-6118-62 prparation 18-63 redfinies 20-13 spcification de la base de donnes 18-58 procdures stockes redfinies 20-13 processus 10-18 processus lents utilisation de threads 9-1 processus parallles threads 9-1 producteurs de page I-37
Index
orients donnes 25-44 25-48 profondeur de couleurs 13-13 programmation 13-15 programmation oriente objet 3-53-13, 41-141-10 dclarations 41-3, 41-10 classes 41-6, 41-7 mthodes 41-8, 41-9, 41-10 dfinition 3-5 hritage 3-9 programmation oriente objet (POO) 3-2 programmation, modles 5-3 programmes CGI crer 28-2, 29-2 programmes dinstallation 13-2 programmes Win-CGI crer 28-2, 29-2 projets ajout de fiches 6-16-2 Proportional, proprit 8-3 proprits 3-3, 42-142-14 accs 42-542-7 aide sur 47-4 ajouter aux interfaces 36-10 botes de dialogue standard 52-2 chargement 42-14 COM 33-3, 34-10 par rfrence seulement 34-10 comme classes 42-3 composants enveloppe 52-3 contrles ActiveX 38-13 contrles de texte format 3-35 dclaration 42-3, 42-442-7, 42-8, 42-14, 49-4 stockes 42-14 types dfinis par lutilisateur 49-3 criture seule 42-7 en lecture seule 51-3 et objets 3-5 vnements et 43-1, 43-2 grilles de dcision 16-13 hrites 42-3, 49-2, 50-2 publication 42-3 HTML, tables 28-20 initialisation 3-273-28 interfaces 42-11 lecture seule 41-6, 41-7, 42-7 mise jour 40-8 I-38
modification 47-7, 48-2, 48-3 du texte 47-9 nodefault 42-8 prsentation 40-6 prives 42-5 publication 50-2 read et write 42-5 redclaration 42-13, 43-6 sous-composants 42-9 spcification des valeurs 42-13, 47-9 stockage 42-13 stockage de donnes interne 42-4, 42-7 stockage et chargement des proprits non publies 42-1542-16 tableau 42-3, 42-8, 42-9 types 42-2, 42-9, 47-9, 49-3 valeurs par dfaut 42-7, 42-13 redfinition 48-2, 48-3 visualisation 47-9 proprits bidirectionnelles 10-10 proprits de type chane 4-45 proprits du parent 3-21 protected directive 43-6 vnements 43-6 mot cl 42-3, 43-6 protected, section 4-2 protg 3-10 protge partie des classes 41-6 protocole (Digital) 32-1 protocoles choix 25-10 composants connexion 25-1025-12 connexion, composants 25-27 connexions de rseau 20-17 Internet 27-3, 32-1 slection 25-1025-12 Provider, proprit 21-4 ProviderFlags, proprit 24-5, 24-12 ProviderName, proprit 14-14, 23-30, 24-4, 25-27, 25-42, 26-10 proxy 33-8 objets transactionnels 39-3 PString 4-51 public 3-10 directive 43-6 mot cl 43-6
proprits 42-12 public, section 4-2 publication proprits exemple 49-2, 50-2 publi 3-10 publique partie de classes 41-6 published 42-3 directive 42-3, 43-6, 52-4 mot cl 43-6 proprits 42-12, 42-13 PVCS Version Manager 2-6 PWideChar 4-46 PWideString 4-51
Q
QReport, page de la palette de composants 3-33 Qt, bibliothque 10-25 qualificateurs 3-93-10 Query, proprit objets mise jour 20-54 QueryInterface, mthode 4-22, 4-26, 4-28, 33-9 IUnknown 33-4
R
raccourcis ajout aux menus 6-38 raccourcis clavier 3-37 ajout aux menus 6-38 raise, mot rserv 4-18 rappels applications multiniveaux 25-20 limitation 25-12 rapports 14-18 .RC, fichiers 6-47 RDSConnection, proprit 21-19 Read, mthode TFileStream 4-62 read, m thode 42-6 read, mot rserv 42-9, 49-4 ReadBuffer, mthode TFileStream 4-62 ReadCommitted 17-10 README 13-16, 13-17 ReadOnly, proprit 3-35, 51-3, 51-9, 51-10 champs 19-14 contrles mmo orients donnes 15-10
Guide du dveloppeur
contrles orients donnes 15-6 contrles orients donnes de texte format 15-11 grilles de donnes 15-24, 15-30 tables 18-44 ralisation de palettes 45-5, 45-6 ReasonString, proprit 28-12 ReceiveBuf, mthode 32-8 Receiveln, mthode 32-8 recensement applications serveur 25-13 composants 40-13 diteurs de composants 47-20 diteurs de proprits 47-13 47-14 familles de conversion 4-65 objets Active Server 37-8 37-9 objets COM 36-1836-19 recensement des objets de laide 5-31 rcepteurs dvnements 36-13 recherche incrmentale 15-12 recherches indexes 18-13, 18-14, 18-3218-35 RecNo, proprit ensembles de donnes client 23-3 Reconcile, mthode 10-33, 20-38 RecordCount, proprit TBatchMove 20-59 Recordset, proprit 21-11, 21-21 RecordsetState, proprit 21-12 RecordStatus, proprit 21-14, 21-15 Rectangle, mthode 8-5, 8-11, 45-3 rectangles coins arrondis 8-12 dessin 8-11, 49-9 Rcuprer les paramtres, commande 23-33 redclaration des proprits 43-6 redfinition des mthodes 41-8, 41-9 redessin des contrles 50-5 redimensionnement de contrles graphiques 45-7
redimensionnement des contrles 13-14, 50-4 Reduced XML Data file Voir XDR, fichier rfrence, champs 19-26 affichage 15-28 rfrences fiches 6-2 paquets 11-4 rfrences circulaires 6-3 rfrences croises 16-216-3, 16-11 plusieurs dimensions 16-3 une dimension 16-3 dfinition 16-2 valeurs rcapitulatives 16-3 rfrences scurises 39-22 rfrentiel 5-225-25, 6-14 ajout dlments 5-22 utiliser des lments 5-23 5-24 rfrentiel dobjets 5-225-25, 6-14 ajout dlments 5-22 composants base de donnes 20-18 sessions 20-20 spcification dun rpertoire partag 5-23 utiliser des lments 5-23 5-24 Rfrentiel, dialogue 5-22 Refresh, m thode 15-8, 23-36 RefreshLookupList, proprit 19-11 RefreshRecord, mthode 23-37, 24-4 Register, mthode 8-3 Register, procdure 40-13, 47-2 RegisterComponents, procdure 11-6, 40-13, 47-2 RegisterConversionType, fonction 4-65, 4-66 RegisterHelpViewer 5-35 RegisterNonActiveX, procdure 38-3 RegisterPooled, procdure 25-9 RegisterPropertyEditor, procdure 47-13 RegisterTypeLib, fonction bibliothques de types 33-18 RegisterViewer, fonction 5-31 registre 10-17, 12-10 registre dinvocation 31-4, 31-7
registre des classes distantes 31-5, 31-8 registre EBX 10-11 rgles dentreprise 25-2, 25-14 rgles de gestion ASP 37-1 objets transactionnels 39-2 regroupement dobjets 39-9 modules de donnes distants 25-9 regroupement de composants 3-443-46 regroupement de ressources 39-539-8 REGSERV32.EXE 13-5 relations matre/dtail 15-17, 18-4018-43, 18-5518-56 applications multiniveaux 25-22 ensembles de donnes client 23-22 ensembles de donnes unidirectionnels 22-13 index 18-41 intgrit rfrentielle 14-6 mises jour en cascade 24-7 suppressions en cascade 24-7 tables imbriques 18-43, 25-22 Release, m thode 4-22, 4-26, 4-27 IUnknown 33-4 TCriticalSection 9-8 RemotePort, proprit client, sockets 32-6 RemoteServer, proprit 23-30, 25-27, 25-32, 25-40, 25-42, 26-10 RemoveAllPasswords, mthode 20-25 RemovePassword, mthode 20-25 RenameFile, fonction 4-58, 4-59 rpartiteur dadaptateur 29-4 rpartiteur de page 29-4 rpartiteur Web 28-2, 28-428-6 objets rpartition automatique 28-5 objets auto-rpartis 25-43 rpartiteurs de page 29-19 lments action 29-18 rpartiteurs de page 29-19 rpartiteurs Web lments action 29-18 I-39
Index
rpartition des requtes WebSnap 29-13 RepeatableRead 17-11 rpertoire initial 10-17 rpertoires Linux 10-18 rponse action 29-17 rponses actions 29-17 adaptateurs 29-16 images rponses HTTP images 29-18 rponses HTTP actions 29-17 RepositoryID, proprit 25-28 Request for Comment (RFC), documents 27-3 RequestLive, proprit 20-11 RequestRecords, mthode 25-43 requte, partie (URL) 27-3 requtes 18-27, 18-4918-58 adaptateurs 29-16 BDE 20-2, 20-920-12 ensembles de rsultats dynamiques 20-11 20-12 simultanes 20-19 curseurs bidirectionnels 18-57 curseurs unidirectionnels 18-58 ensembles de rsultats 18-57 excution 20-53 excution des instructions 18-57 filtrage et 18-15 htrognes 20-1020-11 HTML tables 28-22 images requtes HTTP images 29-17 objets mise jour 20-54 20-55 optimisation 18-56, 18-58 paramtres 18-50 paramtres 18-5218-54 densembles de donnes client 23-34 dfinition lexcution 18-54 dfinition la conception 18-53 liaison 18-52 nomms 18-52 non nomms 18-52 I-40
proprits 18-5318-54 relations matre/ dtail 18-5518-56 prparation 18-56 relations matre/ dtail 18-5518-56 rpartition 29-13 spcification 18-5018-52, 22-7 spcification de la base de donnes 18-49 Web, applications 28-22 requtes action HTML 29-16 requtes dimage 29-17 requtes de dcision dfinition 16-6 requtes htrognes 20-10 20-11 Local SQL 20-10 requtes SQL 18-5018-52 chargement depuis un fichier 18-51 copie 18-51 ensembles de rsultats 18-57 excution des instructions 18-57 modification 18-51 objets mise jour 20-53 optimisation 18-58 paramtres 18-5218-54, 20-4820-49 dfinition lexcution 18-54 dfinition la conception 18-53 liaison 18-52 relations matre/ dtail 18-5518-56 prparation 18-56 Requires, liste (paquets) 11-7, 11-8, 11-10 rseaux connexion aux bases de donnes 20-17 ResetEvent, mthode 9-10 rsolution 24-1, 25-4 ResolveToDataSet, proprit 24-5 resourcestring, mot rserv 12-11 Ressource DLL basculement dynamique 12-13 expert 12-11
ressource, fichiers 6-476-48 ressources 40-8, 45-1 chanes 12-11 isolement 12-11 libration 52-5 localisation 12-11, 12-12, 12-14 systme, conservation 40-4 systme, optimisation 40-4 ressources en mmoire cache 45-2 RestoreDefaults, mthode 15-25 Result, paramtre 46-7 rsultat HTML, vue 29-1 rsultat, paramtres 18-60 Resume, mthode 9-12 retour la ligne 7-8 retour automatique 7-8 ReturnValue, proprit 9-10 RevertRecord, mthode 10-33, 20-38, 23-7 RFC, documents 27-3 RightPromotion, m thode 4-34, 4-36 rles scurit en fonction des rles 39-15 Rollback, mthode 17-10 RollbackTrans, mthode 17-10 root rpertoire 10-18 RoundRect, mthode 8-5, 8-12 RowAttributes, proprit 28-21 RowCount, proprit 15-15, 15-33 RowHeights, proprit 3-49, 7-16 RowRequest, mthode 24-4 Rows, proprit 3-49 RowsAffected, proprit 18-57 RPC 33-9 RTL 10-7 RTTI 41-7 interfaces invocables 31-2 $RUNONLY, directive de compilation 11-11
S
SafeArray 34-14 safecall, convention dappel 38-10 SafeRef, mthode 39-22 SaveConfigFile, mthode 20-29 SavePoint, proprit 23-7 SaveToFile, mthode 8-21
Guide du dveloppeur
chanes 3-54 ensembles de donnes ADO 21-16 ensembles de donnes client 14-11, 23-41, 23-42 graphiques 45-4 SaveToStream, mthode ensembles de donnes client 23-42 ScaleBy, proprit TCustomForm 13-14 Scaled, proprit TCustomForm 13-14 ScanLine, proprit bitmap 8-10 bitmap, exemple 8-19 ScktSrvr.exe 25-10, 25-15, 25-29 SCM 5-4 Screen, variable 6-4, 12-9 scriptage 29-10 ScriptAlias, directive 13-12 scripts actifs 29-10 gnration dans WebSnap 29-11 modifier 29-11 scripts (URL) 27-3 scripts actifs 29-10 scripts ct serveur, scripts serveur 29-10 scripts de connexion 17-417-6 scripts shell 10-16 scripts Web 29-10 ScrollBars, proprit 3-49, 7-8 contrles mmo orients donnes 15-10 SDI, applications 5-15-3 sections critiques 9-8 prcaution dutilisation 9-8, 9-9 Sections, proprit 3-46 scurit applications multiniveaux 25-2 bases de donnes 14-414-5, 17-417-6 tables locales 20-2420-27 connexions SOAP 25-30 connexions Web 25-11, 25-30 DCOM 25-41 modules de donnes transactionnels 25-7, 25-10 objets transactionnels 39-15 39-16
recensement pour les connexions socket 25-10 Seek, mthode ensembles de donnes ADO 18-32 segments de ligne connects 8-10, 8-11 SELECT, instructions 18-50 SelectAll, mthode 3-36 SelectCell, mthode 50-13, 51-4 Slection de menu, bote de dialogue 6-43 Selection, proprit 3-49 Slectionner un menu, commande (menu Concepteur) 6-42 slectionneur daide 5-34 slectionneurs daide 5-31 SelectKeyword 5-30 SelEnd, proprit 3-37 Self, paramtre 40-14 SelLength, proprit 3-36, 7-10 SelStart, proprit 3-36, 3-37, 7-10 SelText, proprit 3-36, 7-10 SendBuf, mthode 32-8 Sender, paramtre 3-30 exemple 8-7 Sendln, mthode 32-8 SendStream, mthode 32-8 sensibilit la casse 10-16 sparateur de chemin de recherche 10-18 sparateurs 3-38 sparateurs de classeur 3-46 ServerGUID, proprit 25-27 ServerName, proprit 25-27 ServerType, proprit 32-10 serveur dapplications architecture 25-6 serveur, applications interfaces 32-2 services 32-1 serveur, connexions 32-2, 32-3 numros de port 32-5 serveur, sockets 32-7 acceptation de clients 32-10 acceptation de requtes client 32-7 gestion dvnements 32-9 messages derreur 32-8 spcification 32-6 serveurs 20-17 Internet 27-127-10 serveurs ActiveX
bibliothques de types 33-16 optimisation 33-18 vrification de type 33-18 serveurs Automation 33-10, 33-12 voir aussi objets COM accder aux objets 36-15 serveurs COM 33-3, 33-5, 36-1 36-19 conception 36-2 distants 33-7 en processus 33-7 hors processus 33-7 serveurs dapplications 14-16, 25-1, 25-1325-21 criture 25-14 fermeture des connexions 25-33 identification 25-27 interface 25-1925-21 interfaces 25-33 modules de donnes distants 5-21 modules de donnes multiples 25-2425-25 ouverture des connexions 25-32 rappels 25-20 recensement 25-2525-26 serveurs de base de donnes 5-11, 17-3 connexion 14-914-10 contraintes 19-24, 19-25 19-26, 24-15 description 17-3 types 14-3 serveurs de base de donnes distants 14-3 serveurs distants 20-10, 33-7 accs non autoris 17-4 maintenir les connexions 20-21 serveurs en processus 33-7 ActiveX 33-13 ASP 37-8 MTS 39-2 serveurs hors processus 33-7 ASP 37-8 serveurs SQL connexion aux 14-4 serveurs types 29-2 serveurs Web 37-7 dboguer dboguer 28-2, 29-2 types I-41
Index
types de Web 29-2 Serveurs, page de la palette de composants 3-33, 3-34 Service Control Manager 5-4 service de liste dutilisateurs 29-5 services 5-45-9 code exemple 5-5, 5-7 demande de 32-6 dsinstallation 5-4 exemple 5-7 implmentation 32-132-2, 32-7 installation 5-4 ports et 32-2 proprits de nom 5-8 rseau, serveurs 32-1 service 5-6 services de support 1-3 services Web 31-131-11 classes dimplmentation 31-6 31-7 recenser 31-7 clients 31-931-11 domaine dappellation 31-5 exceptions 31-731-8 expert 31-3 serveurs 31-231-9 conception 31-231-3 types complexes 31-531-6 Session, variable 20-4, 20-18 SessionName, proprit 20-4, 20-14, 20-32, 28-19 sessions 20-1820-34 activation 20-2020-21 applications multithreads 20-14, 20-32 20-34 bases de donnes associes 20-23 bases de donnes et 20-14 20-15 connexions aux bases de donnes implicites 20-15 cration 20-31, 20-33 dfaut 20-14, 20-1820-19 dnomination 28-19 ensemble de donnes 20-4 tat en cours 20-20 fermeture 20-20 fermeture des connexions 20-22 gestion des alias 20-28 gestion des connexions 20-22 I-42
mthodes 20-15 mots de passe 20-24 multiples 20-14, 20-31, 20-3220-34 nom 20-32 ouverture de connexions 20-22 par dfaut 20-4 proprits de la connexion par dfaut 20-21 ractivation 20-21 rcupration des informations 20-3020-31 Web, applications 28-19 Sessions variable 20-33 Sessions, proprit 20-33 Sessions, variable 20-19 SetAbort 39-8 SetAbort, mthode 39-5, 39-12 SetBrushStyle, mthode 8-9 SetComplete 39-8 SetComplete, mthode 25-20, 39-5, 39-12 SetData, mthode 19-20 SetEvent, mthode 9-10 SetFields, mthode 18-25 SetFloatValue, mthode 47-9 SetKey, mthode 18-33 EditKey ou 18-35 SetLength, procdure 4-51 SetMethodValue, mthode 47-9 SetOptionalParam, mthode 23-18 SetOrdValue, mthode 47-9 SetPenStyle, mthode 8-7 SetProvider, mthode 23-30 SetRange, mthode 18-38 SetRangeEnd, mthode 18-37 SetRange ou 18-38 SetRangeStart, mthode 18-36 SetRange ou 18-38 SetSchemaInfo, mthode 22-14 SetStrValue, mthode 47-9 SetValue, mthode 47-9 SGBD 25-1 SGBDR 14-3, 25-1 Shape, proprit 3-51 shift, tat des touches 8-25 ShortCut, proprit 6-38 ShortString 4-44 Show, mthode 6-7, 6-9 ShowAccelChar, proprit 3-47 ShowButtons, proprit 3-43 ShowFocus, proprit 15-33 ShowHint, proprit 3-48, 15-36
ShowHintChanged, proprit 10-24 ShowLines, proprit 3-43 ShowModal, mthode 6-7 ShowRoot, proprit 3-43 ShutDown 5-27 signalement dvnements 9-10 signaux 10-17 signets 18-1118-12 filtrage denregistrements 21-12 21-13 prise en charge par type densembles de donnes 18-11 Simple Object Access Protocol voir SOAP site dancrage 7-6 site Web (support Delphi) 1-3 Size, proprit champs 19-14 paramtres 18-54, 18-61 SOAP 31-1 applications multiniveaux 25-12 connexion des serveurs dapplications 25-30 connexions 25-12, 25-30 modules de donnes 25-6 socket connexions 25-29 socket, composants 32-5 socket, connexions ouverture 32-7 socket, objets clients 32-7 sockets 32-132-11 acceptation des requtes client 32-3 affectation dhtes 32-4 connexions 25-1025-11 description 32-3 criture dans 32-11 fourniture dinformations 32-4 gestion dvnements 32-8 32-10 gestion des erreurs 32-9 gestionnaire dvnement 32-11 implmentation des services 32-132-2, 32-7 lecture depuis 32-11 lecture/criture 32-1032-11 rseau, adresses 32-3, 32-4
Guide du dveloppeur
sockets client objets socket Windows 32-6 sockets serveur objets socket Windows 32-7 SoftShutDown 5-27 Sorted, proprit 3-42, 15-13 SortFieldNames, proprit 22-8 sortie, paramtres 18-59, 23-33 sources de dcision 16-10 vnements 16-10 proprits 16-10 sources de donnes 14-7, 15-3 15-5 activation 15-4 dsactivation 15-4 vnements 15-5 SourceXml, proprit 26-7 SourceXmlDocument, proprit 26-7 SourceXmlFile, proprit 26-7 souris vnements 8-258-27 souris, vnements glisser-dplacer 7-1 sous-classement des contrles Windows 40-5 sous-composants proprits 42-9 sous-menus 6-38 Spacing, proprit 3-39 SparseCols, proprit 16-10 SparseRows, proprit 16-10 SPX/IPX 20-17 SQL 14-3, 20-9 excution des commandes 17-1117-13 local 20-10 normes 24-15 standards diteur de requte de dcision 16-7 SQL Links 13-9, 20-1 dploiement 13-10, 13-17 fichiers de pilote 13-10 pilotes 20-10, 20-17, 20-35 SQL local 20-11 SQL transparent 20-34, 20-35 20-36 SQL, instructions excution 22-1022-12 SQL, proprit 18-5018-51 modification 18-56 SQLConnection, proprit 22-3, 22-20 SQLPASSTHRUMODE 20-35
Standard, page de la palette de composants 3-32 StartTransaction, mthode 17-7, 17-8 State, proprit 3-40 colonnes de grille 15-19 ensembles de donnes 18-3, 19-9 grilles 15-18, 15-21 StatusCode, proprit 28-12 StatusFilter, proprit 10-33, 20-37, 21-14, 23-7, 23-23, 24-10 StdConvs, unit 4-65, 4-67 Step, proprit 3-48 StepBy, mthode 3-48 StepIt, mthode 3-48 stockages de donnes 21-3 stored, directive 42-14 StoredProcName, proprit 18-59 StrByteType 4-48 Stretch, proprit 15-11 StretchDraw, mthode 8-5, 45-3, 45-7 string, mot rserv 4-45 type par dfaut 4-44 types de proprit 4-45 Strings, proprit 3-57 StrNextChar, fonction 10-20 Structured Query Language Voir SQL stThreadBlocking, constante 32-10 stubs objets transactionnels 39-3 Style, proprit 3-42 botes options 3-42, 15-13 botes liste 3-42 boutons outil 6-53 crayons 8-6 lments Web 25-46 pinceaux 3-51, 8-9 variants dessins par le propritaire 7-14 StyleChanged, proprit 10-24 StyleRule, proprit 25-47 styles 10-7 Styles, proprit 25-47 StylesFile, proprit 25-47 Subtotals, proprit 16-13 Supplment, page de la palette de composants 3-32 support de stockage 3-63 support dveloppeur 1-3 support technique 1-3
SupportCallbacks, proprit 25-20 Suppression de modles, bote de dialogue 6-44 suppressions en cascade 24-7 Supprimer des modles, commande (menu Concepteur) 6-42, 6-44 Supprimer une table, commande 18-47 Supprimer, commande (menu Concepteur) 6-42 surcharge mthodes 41-9, 46-3, 50-12 Suspend, mthode 9-12 Sybase, pilote dploiement 13-10 synchronisateur criture exclusive et lecture multiple 9-9 prcaution dutilisation 9-9 synchronisation dappel 39-19 39-20 synchronisation des donnes sur plusieurs fiches 15-4 Synchronize, mthode 9-5 systme daide 5-25, 47-4 fichiers 47-4 interfaces 5-26 mots cls 47-5 recensement des objets 5-31 systme de gestion de bases de donnes distant 14-3 systme, vnements 10-24 Systme, page de la palette de composants 3-32 systmes daide boutons outil 6-55 systmes de gestion de bases de donnes 25-1
T
Table , balise HTML (<TABLE>) 28-15 TableAttributes, proprit 28-20 tableau, champs 19-26, 19-29 19-30 affichage 15-26, 19-27 aplanissement 15-26 champs persistants 19-29 19-30 tableaux 42-3, 42-8 protgs 34-15 TableName, proprit 18-29, 18-45, 22-8
Index
I-43
TableOfContents 5-30 tables 18-27, 18-2918-48 affichage dans les grilles 15-19 affichage des listes 17-15 bases sur BDE recherches indexes 18-32 BDE 20-2, 20-520-9 ajout denregistrements 20-9 copie denregistrements 20-9 droits daccs 20-620-7 fermeture 20-5 liaisons 20-5 mise jour denregistrements 20-9 oprations groupes 20-820-9 suppression denregistrements 20-9 verrouillage exclusif 20-7 composants daide la dcision et 16-3 cration 18-4418-47 champs persistants 18-45 index 18-45 dbExpress 22-722-8 dfinition 18-4518-46 dfinitions de champs et dindex 18-45 prchargement 18-46 grilles non orientes donnes 3-48 imbriques 18-43 index 18-3018-43 insertion denregistrements 18-21 18-23, 18-25 lecture seule 18-44 portes 18-3518-40 recherche 18-3218-35 relations matre/ dtail 18-4018-43 spcification de la base de donnes 18-29 suppression 18-47 synchronisation 18-48 tri 18-30, 22-8 vidage 18-4718-48 tables Access transactions locales 20-36 tables dBASE accs aux donnes 20-10 DatabaseName 20-4 I-44
index 20-7 protection par mot de passe 20-2420-27 renommer 20-8 transactions locales 20-36 tables de problmes 20-60 tables en lecture seule 18-44 tables FoxPro transactions locales 20-36 tables imbriques 18-43, 19-30 19-31, 25-22 tables InterBase 20-10 tables Oracle 20-13 tables Paradox 20-4 accs aux donnes 20-10 actions groupes 20-60 DatabaseName 20-4 fichiers de contrle de rseau 20-27 protection par mot de passe 20-2420-27 rpertoires 20-2720-28 transactions locales 20-36 TableType, proprit 18-45, 20-6 TabOrder, proprit 3-24 Tabs, proprit 3-46 TabStop, proprit 3-24 TabStopChanged, proprit 10-25 TAction 6-23 TActionClientItem 6-25 TActionList 6-20, 6-21 TActionMainMenuBar 6-18, 6-20, 6-21, 6-22, 6-24 TActionManager 6-18, 6-21, 6-22 TActionToolBar 6-18, 6-20, 6-21, 6-22, 6-24 TActiveForm 38-3, 38-6 TAdapterDispatcher 29-14 TAdapterPageProducer 29-11 TADOCommand 21-2, 21-8, 21-10, 21-1921-22 TADOConnection 14-9, 17-1, 21-2, 21-321-9, 21-11 se connecter aux stockages de donnes 21-321-5 TADODataSet 21-2, 21-10, 21-1721-19 TADOQuery 21-2, 21-10 commande SQL 21-19 TADOStoredProc 21-2, 21-10 TADOTable 21-2, 21-10 Tag, proprit 19-14
TApacheApplication 27-7 TApacheRequest 27-7 TApacheResponse 27-7 TApplication 5-26, 5-33, 10-7 TApplicationEvents 6-4 TASM code 10-20 TASPObject 37-2 TBatchMove 20-5520-60 gestion derreur 20-60 TBCDField formatage par dfaut 19-18 TBDEClientDataSet 20-3 TBDEDataSet 18-2 TBevel 3-51 TBitmap 45-4 TBrush 3-51 tbsCheck, constante 6-53 TCalendar 50-1 TCanvas utilisation 3-61 TCGIApplication 27-7 TCGIRequest 27-7 TCGIResponse 27-7 TCharProperty, type 47-8 TClassProperty, type 47-8 TClientDataSet 5-21, 23-22 TClientSocket 32-6 TColorProperty, type 47-8 TComObject agrgation 4-26 TComponent 3-13, 3-16, 40-5 TComponentProperty, type 47-8 TControl 3-18, 3-20, 40-4, 43-5, 43-6 vnements communs 3-22 proprits communes 3-20 TConvType, valeurs 4-65 TConvTypeInfo 4-69 TCoolBand 3-41 TCoolBar 6-48 TCorbaConnection 25-31 TCorbaDataModule 25-6 TCP/IP 20-17, 32-1 applications multiniveaux 25-1025-11 clients 32-6 connexion au serveur dapplications 25-29 serveurs 32-7 TCurrencyField formatage par dfaut 19-18 TCustomADODataSet 18-2 TCustomClientDataSet 18-2
Guide du dveloppeur
TCustomContentProducer 28-14 TCustomControl 40-4 TCustomEdit 10-9 TCustomGrid 50-1, 50-2 TCustomIniFile 3-59 TCustomizeDlg 6-24 TCustomListBox 40-4 TCustomVariantType 4-314-39 TDatabase 14-9, 17-1, 20-3, 20-1420-18 instances temporaires 20-23 interruption 20-23 proprit DatabaseName 20-3 TDataSet 18-1 descendants 18-218-3 TDataSetProvider 24-1, 24-2 TDataSetTableProducer 28-21 TDataSource 15-315-5 TDateField formatage par dfaut 19-18 TDateTime, type 50-6 TDateTimeField formatage par dfaut 19-18 TDBChart 14-18 TDBCheckBox 15-2, 15-15 15-16 TDBComboBox 15-2, 15-12, 15-1215-13 TDBCtrlGrid 15-3, 15-3215-33 proprits 15-33 TDBEdit 15-2, 15-915-10 TDBGrid 15-2, 15-1815-32 vnements 15-31 proprits 15-23 TDBGridColumns 15-18 TDBImage 15-2, 15-11 TDBListBox 15-2, 15-12, 15-12 15-13 TDBLookupComboBox 15-3, 15-12, 15-1315-15 TDBLookupListBox 15-3, 15-12, 15-1315-15 TDBMemo 15-2, 15-10 TDBNavigator 15-2, 15-33 15-36, 18-6, 18-7 TDBRadioGroup 15-3, 15-16 15-17 TDBRichEdit 15-3, 15-11 TDBText 15-2, 15-9 TDCOMConnection 25-28 TDecisionCube 16-1, 16-5, 16-7 vnements 16-8 TDecisionDrawState 16-14
TDecisionGraph 16-1, 16-2, 16-14 instanciation 16-14 TDecisionGrid 16-1, 16-2, 16-11 vnements 16-14 instanciation 16-11 proprits 16-13 TDecisionPivot 16-1, 16-2, 16-3, 16-1016-11 proprits 16-11 TDecisionQuery 16-1 TDecisionQuery, composant 16-5, 16-6 TDecisionSource 16-1, 16-10 vnements 16-10 proprits 16-10 TDefaultEditor 47-17 TDependency_object 5-8 TDragObject 7-3, 7-4 TDragObjectEx 7-4 technologie MSI 13-4 TEnumProperty, type 47-8 termes du contrat de licence logicielle 13-16 Terminate, mthode 9-6 Terminated, proprit 9-6 test composants 40-14, 40-15 valeurs 42-7 tests composants 52-6 TEvent 9-10 Text, proprit 3-35, 3-42, 3-48 texte contrles dessins par le propritaire 7-13 copier, couper, coller 7-10 dans les contrles 7-7 impression 3-36 internationalisation 12-9 lecture de la droite vers la gauche 12-6 rechercher 3-36 slection 7-9, 7-10 suppression 7-11 travail sur le texte 7-77-13 texte statique 3-47 TextHeight, mthode 8-5, 45-3 TextOut, mthode 8-5, 45-3 TextRect, mthode 8-5, 45-3 TextWidth, mthode 8-5, 45-3 TField 18-2, 19-119-32 vnements 19-18 mthodes 19-19 proprits 19-2, 19-1319-18
excution 19-15 TFieldDataLink 51-5 TFiler 4-60 TFileStream 3-63, 4-60 E/S de fichier 4-604-64 TFloatField formatage par dfaut 19-18 TFloatProperty, type 47-8 TFMTBcdField formatage par dfaut 19-18 TFontNameProperty, type 47-8 TFontProperty, type 47-8 TForm proprits des barres de dfilement 3-36 TForm, composant 3-6 TFrame 6-15 TGraphic 45-4 TGraphicControl 40-4, 49-2 THeaderControl 3-46 thread neutre 36-9 thread VCL principal 9-4 OnTerminate, vnement 9-7 Thread, bote dtat 9-13 thread, fonction 9-4 thread, objets 9-2 dfinition 9-2 limites 9-2 ThreadID, proprit 9-13 threads 9-19-13 activits 39-19 arrt 9-6, 9-12 attente dvnements 9-10 attente de 9-10 BDE et 20-14 blocage de lexcution 9-8 boucle des messages et 9-5 composants daccs aux donnes 9-5 coordination 9-4, 9-79-11 cration 9-12 espace de processus 9-4 viter les accs simultans 9-8 exceptions 9-6 excution 9-12 graphiques, objets 9-5 identificateurs 9-13 initialisation 9-3 ISAPI/NSAPI, programmes 28-3, 28-19 libration 9-3, 9-4 limites du nombre de 9-12 priorits 9-1, 9-3 redfinition 9-12 I-45
Index
renvoi de valeurs 9-10 sections critiques 9-8 utilisation de listes 9-5 VCL, thread 9-4 verrouillage des objets 9-8 threads de service 5-6 threads en suspens 9-12 threads multiples attente de 9-10 threadvar 9-6 THTMLTableAttributes 28-20 THTMLTableColumn 28-21 THTTPRio 31-10 THTTPSoapDispatcher 31-2, 31-3 THTTPSOAPPascalInvoker 31-3 THTTPSoapPascalInvoker 31-2 TIBCustomDataSet 18-2 TIBDatabase 14-10, 17-1 TickMarks, proprit 3-37 TickStyle, proprit 3-37 TIcon 45-4 TImage dans les cadres 6-17 TImageList 6-52 timers 3-26 TIniFile 3-59 TIntegerProperty, type 47-8, 47-10 TInterfacedObject 4-26 drivation de 4-23 implmentation de IInterface 4-22 liaison dynamique 4-23 TInvokableClass 31-6 TInvokeableVariantType 4-41 4-42 TISAPIApplication 27-7 TISAPIRequest 27-7 TISAPIResponse 27-7 Title, proprit grilles de donnes 15-24 TKeyPressEvent, type 43-4 TLabel 3-47, 40-4 .TLB, fichiers 33-17, 34-3 TLIBIMP 33-19, 35-6, 36-16 tlibimp.exe 35-2 TListBox 40-3 TLocalConnection 23-30 TMainMenu 6-21 TMemIniFile 3-59, 10-9 TMemoryStream 3-63 TMessage 46-4, 46-6 TMetafile 45-4 TMethodProperty, type 47-8 I-46
TMsg 6-6 TMTSDataModule 25-6 TMultiReadExclusiveWriteSync hronizer 9-9 TNestedDataSet 18-43 TNotifyEvent 43-8 TObject 3-13, 4-1, 41-4 ToCommon 4-69 ToggleButton 10-9 TOleContainer 35-1735-18 documents Active 33-14 TOleControl 35-6, 35-7 TOleServer 35-6 Top, proprit 3-20, 3-23, 3-24, 6-4, 6-49 TopRow, proprit 3-49 TOrdinalProperty, type 47-8 touches daccs rapide 3-37 TPageControl 3-46 TPageDispatcher 29-14 TPageProducer 28-14 TPaintBox 3-51 TPanel 3-45, 6-48 tpHigher, constante 9-3 tpHighest, constante 9-3 TPicture, type 45-4 tpIdle, constante 9-3 tpLower, constante 9-3 tpLowest, constante 9-3 tpNormal, constante 9-3 TPopupMenu 6-55 TPrinter 3-61 utilisation 3-61 TPropertyAttributes 47-12 TPropertyEditor, classe 47-7 TPropertyPage 38-13 tpTimeCritical, constante 9-3 TPublishableVariantType 4-42 TQuery 20-2, 20-920-12 ensembles de donnes de dcision et 16-6 TQueryTableProducer 28-22 traduction 12-9 outils 12-1 traduction des chanes de caractres 12-2, 12-9, 12-11 conversions sur 2 octets 12-3 traitement distribu des donnes 25-2 transaction, param tres niveau disolement 17-11 transactions 14-514-6, 17-6 17-11 achvement 17-917-10 ADO 21-721-8, 21-9
conservation des annulations 21-7 conservation des validations 21-7 annulation 17-917-10 application des mises jour 17-7, 25-21 applications multiniveaux 25-21 atomicit 14-5 automatiques 39-13 BDE 20-3420-36 contrle 20-3420-36 implicites 20-34 cohrence 14-5 composes de plusieurs objets 39-10 contrles par le client 39-13 contrles par le serveur 39-13, 39-14 contrler 39-13 dlai maximum 39-15, 39-23 dmarrage 17-717-8 durabilit 14-5 IAppServer 25-21 imbriques 17-7 validation 17-9 isolation 14-5 isolement niveaux 17-1017-11 locales 20-36 mises jour en mmoire cache 20-39 modules de donnes MTS 25-17 modules de donnes transactionnels 25-8, 25-21 MTS et COM+ 39-939-15 objets transactionnels 39-5 se chevauchant 17-8 sur plusieurs bases de donnes 39-9 tables locales 17-7 terminer 39-1239-13 transaction, composants 17-8 utilisation de commandes SQL 17-6, 20-35 validation 17-9 transactions locales 20-36 transfert services Web 31-5 transfert denregistrements 52-2 TransformGetData, proprit 26-10 TransformRead, proprit 26-9
Guide du dveloppeur
TransformSetParams, proprit 26-11 TransformWrite, proprit 26-9 TransIsolation, proprit 17-11 transactions locales 20-36 Transliterate, proprit 19-14, 20-56 transparence des barres doutils 6-52, 6-54 Transparent, proprit 3-47 TReader 4-60 TRegIniFile 10-9 TRegistry 3-59 TRegistryIniFile 3-59 TRegSvr 13-5, 33-19 TRemotable 31-5 TRemoteDataModule 25-6 triangles 8-12 try, mot rserv 45-7, 52-5 TScrollBox 3-36, 3-45 TSearchRec 4-56 TService_object 5-8 TSession 20-1820-34 ajout 20-31, 20-32 TSetElementProperty, type 47-8 TSetProperty, type 47-8 TSharedConnection 25-35 TSoapDataModule 25-6 TSocketConnection 25-29 TSpinEdit, contrle 3-37 TSQLClientDataSet 22-2 TSQLConnection 14-10, 17-1, 22-322-6 contrle des messages 22-20 liaison 22-322-6 TSQLDataSet 22-2, 22-7, 22-8 TSQLMonitor 22-20 TSQLQuery 22-2, 22-7 TSQLStoredProc 22-2, 22-8 TSQLTable 22-2, 22-8 TSQLTimeStampField formatage par dfaut 19-18 TStoredProc 20-3, 20-1320-14 TStream 3-63 TStringList 3-543-59, 5-28 TStringProperty, type 47-8 TStrings 3-543-59 TStringStream 3-63 TTabControl 3-46 TTable 20-2, 20-520-9 ensembles de donnes de dcision et 16-6 TTcpServer 32-7 TThread 9-2 TThreadList 9-5, 9-8
TTimeField formatage par dfaut 19-18 TToolBar 6-21, 6-48, 6-51 TToolButton 6-48 TTreeView 3-43 TTypedComObject bibliothques de types ncessaires 33-17 TUpdateSQL 20-45 fournisseurs et 20-12 turboboutons 3-39 affectation de glyphes 6-50 ajout aux barres doutils 6-51 centrage 6-49 tat initial, dfinition 6-50 gestionnaires dvnements 8-14 modes de fonctionnement 6-49 pour les outils de dessin 8-14 regroupement 6-51 utilisation comme bascules 6-51 tutoriel WebSnap 29-20 TVarData, enregistrement 4-30 TWebActionItem 28-3 TWebAppDataModule 29-5 TWebApplication 27-6 TWebAppPageModule 29-5 TWebConnection 25-30 TWebContext 29-13 TWebDataModule 29-5, 29-8 TWebDispatcher 29-14, 29-18 TWebPageModule 29-5, 29-8 TWebRequest 27-6 TWebResponse 27-6, 28-3 TWidgetControl 10-7 TWinCGIRequest 27-7 TWinCGIResponse 27-7 TWinControl 3-19, 10-7, 12-9, 40-4, 43-5 vnements communs 3-25 proprits communes 3-23 TWriter 4-60 TWSDLHTMLPublish 31-8 TXMLDocument 30-330-4, 30-9 TXMLTransform 26-726-9 documents source 26-7 TXMLTransformClient 26-10 26-12 paramtres 26-10 TXMLTransformProvider 24-1, 24-2, 26-926-10
type de terminal 10-17 type, mot rserv 8-13 typeinfo 34-1 types bibliothques de types 34-1334-15 Char 12-3 dfinis par lutilisateur 49-3 enregistrement de message 46-6 ensemble 42-2 numrs 42-2, 49-3 dclaration 8-13 gestionnaires dvnements 43-3 modules Web 29-5 proprits 42-2, 42-9, 47-9 services Web 31-531-6 simples 42-2 types caractre 4-43, 12-3 types compatibles Automation 36-1736-18 types de champs conversion 19-2119-22 surcharge 19-18 types de donnes champs persistants 19-7 types num rs diteur de bibliothques de types 34-11, 34-19, 34-26
U
UDP, protocole 32-1 un--plusieurs, relations 18-41, 22-13 UnaryOp, mthode 4-36 UndoLastChange, mthode 23-7 Unicode, caractres 4-43, 12-4 chanes 4-45, 4-47 UniDirectional, proprit 18-58 unions diteur de bibliothques de types 34-1134-12, 34-20, 34-27 unit de base 4-65, 4-67 units accs depuis dautres units 3-10 ajout de composants 40-12 existantes ajout de composants 40-12 inclusion de paquets 11-4 units de conversion 4-65 units de mesure 4-66 units de temprature 4-67
Index
I-47
Unlock, mthode 9-8 UnlockList, mthode 9-8 UnregisterPooled, procdure 25-9 UnRegisterTypeLib, fonction dsinstallation des bibliothques de dsinstallation 33-18 UPDATE, instruction 20-46, 20-50 UPDATE, instructions 24-11 UpdateBatch, mthode 10-33, 21-14, 21-15 UpdateCalendar, mthode 51-4 UpdateMode, proprit 24-11 ensembles de donnes client 23-26 UpdateObject, mthode 38-14, 38-15 UpdateObject, proprit 20-12, 20-37, 20-46, 20-51 UpdatePropertyPage, mthode 38-14 UpdateRecordTypes, proprit 10-33, 20-37, 23-23 UpdatesPending, proprit 10-33, 20-37 UpdateStatus, proprit 10-33, 20-37, 21-14, 23-23, 24-10 UpdateTarget, mthode 6-32 URI URL ou 27-4 URL 27-3 bibliothques javascript 25-40, 25-41 connexions SOAP 25-31 connexions Web 25-30 IP, adresses 32-4 noms dhte 32-4 URI ou 27-4 Web, navigateurs 27-5 URL, proprit 25-30, 25-31, 28-10, 31-10 USEPACKAGE, macro 11-8 uses, clause 3-10 ajout de modules de donnes 5-21 viter les rfrences circulaires 6-3 inclusion de paquets 11-4 UTF-8 jeu de caractres 10-20 utilisateur, interfaces enregistrement unique 15-8 isolation 14-7 I-48
plusieurs enregistrements 15-17 Utiliser lunit, commande 5-21, 6-2 utilitaire dadministration BDE 20-16, 20-63 utilitaire make 10-17 utilitaires de conversion 4-64
V
$V, directive de compilation 4-55 valeurs 42-2 boolennes 42-2, 42-13 default, proprit 42-13 donnes par dfaut 15-12 proprit par dfaut 42-7 redfinition 48-2, 48-3 test 42-7 valeurs boolennes 51-4 valeurs de rfrence 15-21 valeurs des axes 16-16 valeurs logiques 15-2, 15-15 valeurs null portes 18-37 valeurs rcapitulatives 16-21 agrgats maintenus 23-16 graphes de dcision 16-16 rfrences croises 16-3 validation des saisies de donnes 19-19 validation en deux phases 25-21 Value, proprit agrgats 23-16 champs 19-20 paramtres 18-53, 18-54, 18-61, 18-62 ValueChecked, proprit 15-15 Values, proprit groupes radio 15-16 ValueUnchecked, proprit 15-15, 15-16 var, mot rserv gestionnaires dvnements 43-3 variables dclaration exemple 3-11 et objets 3-11 objet 3-11 variables locales aux threads 9-6 OnTerminate, vnement 9-7 variables objet 3-11 variants personnaliss 4-294-42
variants personnaliss 4-29 4-42 activation 4-39 chargement et enregistrement des valeurs 4-384-39 copie 4-37 cration 4-29, 4-314-39 criture dutilitaires 4-39 4-40 effacement 4-374-38 mmoire 4-37 mthodes 4-404-42 oprateurs de comparaison 4-354-36 oprateurs unaires 4-364-37 oprations binaires 4-33 4-35 proprits 4-404-42 stockage des donnes 4-30 4-31, 4-34, 4-37 transtypage 4-314-33, 4-34, 4-40 VCL 40-140-2 branche TComponent 3-16 branche TControl 3-18 branche TObject 3-15 branche TPersistent 3-16 branche TWinControl 3-19 objets 3-1 portage dapplications 10-3 10-18 prsentation 3-13-25 thread principal 9-4 VCL30, paquet PENWIN.DLL 11-12 VCL30, paquets 11-1 VCL40, paquet 11-10 vcl60.bpl 13-6 VendorLib, proprit 22-4 verrouillage des objets imbrication des appels 9-8 threads 9-8 verrouillage exclusif tables 20-7 VertScrollBar 3-36 vido analogique 8-34 violations daccs chanes 4-50 violations dintgrit 20-60 violations de cls 20-60 virtual directive 41-9 tables de mthode 41-9 virtuelles
Guide du dveloppeur
mthodes 41-8, 44-4 diteurs de proprits 47-9 proprits comme 42-2 visibilit 3-10 Visible, proprit 3-3 barres doutils 6-55 barres multiples 6-55 champs 19-14 menus 6-46 VisibleButtons, proprit 15-34, 15-35 VisibleChanged, proprit 10-25 VisibleColCount, proprit 3-49 VisibleRowCount, proprit 3-49 VisiBroker ORB 25-15 VisualCLX 10-6 visualiseurs daide 5-25 VisualSpeller Control 13-5 volets 3-38 ajout de turboboutons 6-49 aligns sur le haut de la fiche 6-49 biseauts 3-51 redimensionnement 3-38 turboboutons 3-39 volets biseauts 3-51 vtable 33-5 vtables classes crateur 35-6, 35-14 composants enveloppe 35-7 dispinterfaces 34-11 interfaces doubles 36-14 pointeur dinterface COM 33-5 vues arborescentes 3-43
W
W3C 30-2 WaitFor, mthode 9-10, 9-11 WantReturns, proprit 3-35 WantTabs, proprit 3-35 contrles mmo orients donnes 15-10 contrles orients donnes de texte format 15-11 .WAV, fichiers 8-35 wchar_t widechar 10-25 $WEAKPACKAGEUNIT, directive de compilation 11-11 Web modules de donnes 29-3 serveurs 27-127-10
Web Service Definition Language voir WSDL Web, applications ASP 33-13 dploiement 13-11 Web, connexions 25-30 Web, dploiement applications multiniveaux 25-38 Web, modules ajout de sessions de base de donnes 28-19 DLL et, prcaution 28-3 Web, navigateurs 27-4 URL 27-5 Web, pages 27-4 Web, rpartiteur gestion des requtes 28-3, 28-9 slection dlments daction 28-6, 28-7 Web, serveurs 25-38 client, requtes et 27-5 WebContext 29-13 WebDispatch, proprit 25-43 WebPageItems, proprit 25-45 WebSnap 27-127-2 tutoriel 29-20 WideChar 4-43, 4-45 widechar 10-25 widestrings 10-25 widget Qt 10-15 WidgetDestroyed, proprit 10-25 widgets 3-19, 10-7, 10-25 Width, proprit 3-20, 3-48, 6-4 colonnes de grille de donnes 15-19 crayons 8-6 grilles de donnes 15-24 TScreen 13-14 Win 3.1, page de la palette de composants 3-33 WIN32 10-21 Win32, page de la palette de composants 3-32 WIN64 10-21 Win-CGI, programmes 27-5, 27-6, 27-7 INI, fichiers 27-7 Windows botes de dialogue standard 52-2 cration 52-2 excution 52-4
contextes de priphriques 40-8, 45-1 contrles, sous-classement 40-5 fonctions API 40-4, 45-1 GDI (Graphics Device Interface) 8-1 messages 10-19 portage dapplications 10-3 10-18 support de la largeur du crayon 8-7 Windows NT dbogage dapplications serveur Web 27-10 wininet.dll 25-30, 25-31 WM_APP, constante 46-6 WM_KEYDOWN, message 51-9 WM_LBUTTONBUTTON, message 51-9 WM_MBUTTONDOWN, message 51-9 WM_PAINT, message 46-4 WM_PAINT, messages 8-2 WM_RBUTTONDOWN, message 51-9 WM_SIZE, message 50-4 WndProc, mthode 46-5 WordWrap, proprit 3-35, 7-8, 48-1 contrles mmo orients donnes 15-10 wParam, paramtre 46-2 Wrap, proprit 6-52 Wrapable, proprit 6-52 Write, mthode TFileStream 4-62 write, mthode 42-7 write, mot rserv 42-9, 49-4 WriteBuffer, mthode TFileStream 4-62 WSDL 31-2 fichiers 31-8 importer 31-931-10 publier 31-831-9
X
$X, directive de compilation 4-55 XDR, fichier 30-2 Xerox Network System (XNS) 32-1 .xfm, fichiers 10-2 fichiers .xfm 3-8 XML 25-4225-44, 26-1, 30-1
Index
I-49
analyseurs 30-2 applications de bases de donnes 26-126-12 dclaration de type de document 30-2 mappages 26-226-4 dfinition 26-4 schma 30-2 SOAP 31-1 traitement des instructions 30-1
XML Schema Data file Voir XSD, fichier XML, courtiers 25-39 messages HTTP 25-43 XMLBroker, proprit 25-46 XMLDataFile, proprit 24-3, 26-9 XMLDataSetField, proprit 25-46 XMLMapper 26-2, 26-426-7 XSD, fichier 30-2
Y
Year, proprit 50-6
Z
-Z, directive de compilation 11-13 zro terminal chanes tendues 4-45
I-50
Guide du dveloppeur