DDE Client
Version 1.1
composant Delphi
Vincent LESAUVAGE
26, allée Darius Milhaud - 75019 PARIS - FRANCE
Voici le composant que Borland n'est pas arrivé à faire correctement depuis Delphi 2.0, et qui est enfin disponible aujourd'hui: un composant DDE qui permet de se connecter à une source de données comme Excel ou Reuter afin de récupérer en temps réel des informations.
L'unité
DDE implémente dans 2 composants (TDDEManager et TDDEClient) le protocole d'échange dynamique de données (Dynamic Data Exchange) pour la partie client. Elle peut s'utiliser avec toutes les versions de Delphi en 16 et 32 bits.En effet lorsque 2 applications communiquent entre elles en utilisant le protocole DDE, celle qui fournit les données est appelée serveur, et celle qui reçoit les données est appelée client. Le processus d'échange entre les 2 applications s'appelle une conversation. C'est l'application cliente qui engage la conversation.
Les données sont répérées par des adresses (comme les personnes). Une adresse est structurée en 3 catégories (Service, Topic, Item): Service désigne la source de données, en général le nom du programme; Topic désigne un groupe de données qui ont les mêmes propriétés; Item désigne une donnée parmi ce groupe. Ainsi quand une application cliente désire recevoir des données d'une application serveur, elle envoie une requête <Service, Topic> au serveur qui accepte ou refuse la conversation. Puis le client demande une donnée particulière avec une requête <Item>. Le client peut aussi demander au serveur de l'avertir lorsqu'une donnée change de valeur.
Une application cliente peut avoir plusieurs conversations simultanées avec plusieurs serveurs.
TDDEManager
TDDEManager = class(TComponent) Clients: TList; constructor Create(AOwner: TComponent); override; destructor Destroy; override; function PasteLink(var Service, Topic, Item: string): Boolean; end; TClient = class DDEClient: TDDEClient; constructor Create(DDEC: TDDEClient); end;
Le composant
TDDEManager initialise le protocole DDE pour l'application cliente. Une application qui désire utiliser le DDE doit avoir un et un seul composant TDDEManager. Une erreur EDDEError est générée en cas de problème.Le gestionnaire DDE repère toutes les conversations avec le champ
Clients, liste de TClient. Ce champ ne doit normalement pas servir.La fonction
PasteLink sert à récupérer des informations sur la conversation. Une conversation entre 2 application est définie par 2 chaînes de caractères, Service et Topic. Service est en général le nom du programme qui joue le rôle de serveur. Topic est le nom d'une plage de données qui ont les mêmes caractéristiques. Item désigne la donnée qui est susceptible d'être récupérée.Le destructeur s'occupe de libérer tous les conversations si elles n'ont pas été terminées normalement.
TDDEClient
TDDEClient = class(TComponent) constructor Create(AOwner: TComponent); override; destructor Destroy; override; function OpenConversation: Boolean; function CloseConversation: Boolean; function IsOpen: Boolean; function RequestData(Item: string; var DataSize: Integer): PChar; function AdviseData(Item: string): Boolean; function UnadviseData(Item: string): Boolean; function Execute(Item: string; Command: string): Boolean; property Service: string; property Topic: string; property Format: Integer; property TimeOut: Integer; property OnDataChange: TOnDataChange; end; TOnDataChange = procedure(DDEClient: TDDEClient; Item: string; const Value: PChar; ValueSize: Integer) of object;
Le composant TDDEClient représente la conversation entre l'application cliente et le serveur.
Pour établir une conversation, il faut préciser les champs
Service et Topic, puis appeler la fonction OpenConversation qui répond True si la conversation est ouverte. La conversation est alors ajoutée à la liste du gestionnaire DDE.Une fois la conversation établie, la récupération des données peut commencer en renseignant au préalable les champs
Format et TimeOut.Format
indique au serveur dans quel format il doit envoyer les données (voir dans l'aide les constantes CF_xxx, par défaut égal à CF_TEXT ou 1).TimeOut
limite le temps de réponse d'une requête. Après TimeOut millisecondes, la fonction rend la main. Toutes les fonctions sont synchrones: la fonction rend la main après avoir terminé son devoir.Une donnée peut être demandée de manière discrète au serveur avec la fonction
RequestData en précisant Item, qui désigne cette donnée. Le résultat de RequestData est un pointeur sur la donnée dont la taille en octets est donnée par DataSize. Il faut désallouer le résultat avec StrDispose.Il est aussi possible de demander au serveur d'avertir le client quand une donnée change de valeur, et de recevoir cette donnée, avec la fonction
AdviseData, en précisant Item. Si le serveur accepte, la fonction renvoie True. Si le champ OnDataChange est défini, alors la méthode associée est appelée chaque fois que la valeur d'une donnée change. Une même méthode OnDataChange peut servir à récupérer plusieurs données différentes: il suffit d'appeler AdviseData en précisant Item autant de fois qu'il y a de données à récupérer.La fonction
UnadviseData stoppe cette notification pour un Item donné, et retourne True en cas de succès.La fonction Execute envoie une commande sous la forme d’une chaîne de caractères au serveur, et retourne
True en cas de succès.