Introduction▲
NB : La programmation des objets automation requiert un bon niveau de programmation. Une mauvaise utilisation de ces objets ou une erreur de la part du programmeur peut créer une grande instabilité du système d’exploitation et une perte irrémédiable des données présentes sur le disque dur. Les programmeurs non expérimentés et ne maîtrisant pas Delphi, VBA pour Excel et la base de registre ne devraient pas étudier ce tutoriel.
L’auteur ne saurait être tenu responsable des dégradations de toute sorte se produisant sur n’importe quel ordinateur suite à la lecture et à l’utilisation des techniques présentées dans ce document.
Requis (il me semble) : Excel 97, Delphi 3 ou supérieur, IE 4, win 95.
Idéal : Excel 97 - 2000, Delphi 5 ou 6, win XP, NT ou 2000, IE 5 ou supérieur.
Attention : lors d’un débogage sous win 95, 98 ou Me l’interruption avec Ctrl-F2 fera planter votre machine systématiquement. L’utilisation de Ctrl-F7 sur un tableau de variant ou l’un de ses éléments aussi… Et la liste des problèmes de ce type est très longue.
Aucune aide supplémentaire ne sera fournie par l’auteur. Inutile donc de me contacter pour savoir comment faire telle ou telle chose par exemple créer un serveur automation d’accès à une base de données. Le site https://www.developpez.com/ ou le forum nzn.fr.delphi du newsgroup news.vienneinfo.org devraient vous apporter pratiquement toutes les solutions à vos problèmes.
I. Programmation de l’objet Automation▲
Les objets automation sont contenus dans des bibliothèques de types, elles-mêmes faisant partie de bibliothèque ActiveX. Il est donc nécessaire avant de créer un tel objet de créer une bibliothèque ActiveX et une bibliothèque de types.
I-A. Création de la bibliothèque ActiveX▲
Cliquez sur le menu Fichier puis nouveau puis sur Autre.
Sur l’onglet ActiveX, sélectionnez l’icône de la bibliothèque ActiveX et cliquez sur OK.
Il apparaît alors un nouveau projet de type library :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
library
Project1;
uses
ComServ;
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
{$R *.RES}
begin
end
.
Remarquez ici l’exportation des fonctions DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer. Toutes bibliothèques ActiveX doit présenter ces fonctions qui vont permettre le recensement des objets dans la base de registre. Ne vous en préoccupez pas pour l’instant.
I-B. Création de la bibliothèque de types▲
Il faut à présent créer la bibliothèque de types. Cliquez sur le menu Fichier puis nouveau puis sur Autre. Sur l’onglet ActiveX, sélectionnez l’icône de la bibliothèque de types et cliquez sur OK.
Ceci lance un wizard et la fenêtre suivante apparaît :
Changez le champ nom en PTest et la chaîne d’aide en « Test – Tutoriel ActiveX ».
I-C. Création de l’objet automation▲
Il faut à présent créer l’objet Automation. Cliquez sur le menu Fichier puis nouveau puis sur Autre. Sur l’onglet ActiveX, sélectionnez l’icône de l’objet Automation et cliquez sur OK.
Une fenêtre de renseignements apparaît. Tapez pour nom de Coclass : « TestAuto ». Laissez les autres valeurs de champs par défaut. Cliquez sur OK.
I-D. Ajout de propriétés▲
Avant d’ajouter les propriétés, cliquez droit sur la barre des icônes de la fenêtre de la bibliothèque de types et sélectionnez les libellés texte. Cela affichera le texte sous les icônes de la barre des tâches.
Sélectionnez l’interface de l’objet ITestAuto(1). Cliquez sur l’icône « Propriété » pour ajouter une nouvelle property à votre objet. Donnez-lui comme nom Donnees et sélectionnez le type VARIANT. Cette propriété permettra de faire passer un variant array de double.
I-E. Ajout de méthode▲
À présent, nous allons créer une méthode permettant de calculer la moyenne des données passées dans la property. Dans le cadre de ce tutoriel, il eut été possible de passer les données en paramètres de la méthode. Cliquez sur l’icône « méthode » et renommez la méthode « Moyenne ».
Cette méthode doit renvoyer sous la forme d’un double la valeur moyenne. Dans l’onglet « Paramètres », créez une variable de nom R de type « double * » (tapez-le en toutes lettres, car ce type - aussi incroyable que cela puisse paraître – n’est pas listé). Double-cliquez sur la cellule du modificateur et sélectionnez la case « Valeur renvoyée » ce qui sélectionnera automatiquement la case « sortie ». Le type renvoyé HRESULT ne doit pas être modifié.
I-F. Rafraîchissement▲
Il est temps de rafraîchir l’implémentation du code. Cliquez sur le bouton « Rafraîchir ». Ceci va créer le code de la structure de l’objet dans les fichiers « .pas ».
Parfois cette méthode rafraîchit mal le code. Sous Delphi 6 le nombre de bogues du wizard a été nettement diminué par rapport à Delphi 5. Si votre code est mal rafraîchi, l’enregistrement des fichiers permet souvent de résoudre les problèmes de rafraîchissement. Les messages d’erreur qui peuvent survenir risquent de vous laisser perplexe. Personnellement, l’apprentissage a été long et difficile.
Une fois rafraîchit le code source apparaît :
I-G. Programmation de l’objet▲
Toute l’architecture a été créée. Il reste à coder l’objet aussi simplement que n’importe quel objet Pascal à quelques différences près.
I-G-1. Rajout de variables private▲
Dans la partie private, ajoutez les variables FDonnees et FNbDonnees comme suit :
Rajoutez l’unité Variants dans la clause des uses.
I-G-2. Programmation de Get et Set Données▲
L’objet Automation doit savoir communiquer avec l’extérieur. Les propriétés permettent de simplifier la transmission des paramètres. Dans le cas des objets les property n’existent pas et sont remplacées directement par deux méthodes « set » et « get ». Le code est présenté et commenté ci-dessous :
I-G-3. Programmation de la méthode Moyenne▲
Le calcul de la méthode moyenne est des plus simples :
I-H. Initialisation et destructeur▲
Il est « interdit » de surcharger le constructor de l’objet Automation. L’objet parent TautoObject implémente le constructor Create et la dernière méthode appelée par celui-ci est la procédure Initialize. C’est cette procédure que l’on réintroduit dans notre objet pour initialiser correctement les différentes variables de l’objet. L’implémentation du destructor Destroy est en revanche identique à celle d’un objet Pascal usuel.
L’implémentation du destructor et de l’initialize est immédiate :
I-I. Enregistrement▲
Suivez la procédure suivante pour enregistrer votre projet et unité pascal.
L’unit1 devient : DefTestAuto et le Project1 devient PTestAuto :
I-J. Recensement de l’objet▲
Afin que les autres logiciels connaissent l’existence des objets Automation, il est nécessaire de les recenser au sein de la base de registre.
Après avoir fini l’exercice, n’oubliez pas de dérecenser votre serveur ActiveX afin de ne pas polluer inutilement votre base de registre.
En fait il est possible de recenser le serveur à l’aide de la ligne de commande du type suivant :
Regsvr32 « Chemin\NomProjet.dll »
Et de le dérecenser avec la ligne de commande similaire à :
Regsvr32 -u « Chemin\NomProjet.dll »
II. Interface avec Excel▲
Sous Excel, créez un bouton dans une feuille, mettez dans son événement OnClick un appel à une subroutine CallTest que vous implémentez dans un module(2).
Sous VBA, il faut importer l’objet Automation. Cliquez sur le menu Outils puis référence.
Dans la liste, sélectionnez l’objet Automation :
puis cliquez sur OK.
Si vous avez bien fait les choses lorsque vous déclarez les variables, vous devez voir dans la liste le nouvel objet TestAuto :
Enfin, tapez le code exemple ci-dessous :
C’est terminé. Cliquez sur le bouton et testez.
III. Interface avec Delphi▲
L’interface avec Delphi est très différente de celle de Visual Basic.
Il est nécessaire d’importer la bibliothèque de types et d’éventuellement wrapper les objets sous la forme de composants. Pour ma part, je ne crée pas de composants afin de ne pas alourdir inutilement mes programmes lorsque les objets ne sont pas visuels.
III-A. Importation de la bibliothèque de types▲
Fermez toutes vos applications sous Delphi (ce n’est pas vraiment nécessaire, mais c’est plus sûr). Puis cliquez sur Projet et importez une bibliothèque de types :
Sélectionnez l’objet Automation dans la liste
Décochez la case à cocher du bas « Générer le wrapper de composant »(3) et cliquez sur le bouton Installer. Mettez l’unité dans l’un de vos paquets de composants qui va être recompilé pour l’occasion. Fermez tout et créez une nouvelle application. L’unité a pour nom PTest_TLB et se trouve dans le répertoire Imports de Delphi 6.
III-B. Création des objets▲
Apposez un bouton et créez un événement OnClick. Que vous coderez dans l’exemple comme suit :
N’oubliez pas de rajouter dans vos uses l’unité importée : Ptest_TLB.
ATTENTION : ajoutez à la fin de la procédure la commande :
varClear(v);
afin de libérer la mémoire allouée à l’OleVariant v.
IV. Conclusion▲
À partir de ce tutoriel, il devrait vous être possible de programmer n’importe quel objet Automation ou COM. L’apprentissage sera assez long, mais les possibilités de vos applications seront nettement étendues. Vous pourrez programmer sous l’architecture n-tiers et vos programmes pourront communiquer entre eux sur un réseau sans trop de difficultés. Au sein des objets automation on peut gérer des TForm assez facilement. Il suffira que vous découvriez la technique pour le faire sans bogue ce qui m’a pris bien deux jours de travail à l’époque.