DDE Client
Version 1.3
composant Delphi
Vincent LESAUVAGE
26, allée Darius Milhaud - 75019 PARIS - FRANCE
vincent@lesauvage.com
http://www.lesauvage.com
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.
-
Ces composants sont utilisables complètement lorsque
Delphi est ouvert. En payant la somme de 100 Francs ou l'équivalent
en devise étrangère, vous recevrez la version totale ainsi
que toutes les mises à jours. Aucune garantie n'est liée
à ces composants. Les remarques sont les bienvenues.
TDDEManager
TDDEManager = class(TComponent)
Clients: TList;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function PasteLink(var Service, Topic, Item: string): Boolean;
function PasteLinkEx(cfFormat: Integer; 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. Utilise le
format cfLink.
-
La fonction PasteLinkEx
a la même fonction que PasteLink
mais utilise le format cfFormat.
-
Le destructeur Destroy
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;
function Poke(Item: string; pData: Pointer; DataLength: Integer): Boolean;
function PokeEx(cfFormat: Integer; Item: string; pData: Pointer; DataLength: Integer): 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.
-
CloseConversation ferme la
conversation, c'est à dire interrompt toutes les communications
avec le serveur, et la retire de la liste du gestionnaire DDE.
-
IsOpen indique si la conversation
est établie.
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.
-
La fonction Poke
envoie une donnée à l'item Item
du serveur avec le format Format,
et retourne True en cas de succès.
La donnée est définie le pointeur pData
qui pointe sur elle, et sa longueur en octets DataLength.
-
La fonction PokeEx
a la même fonction que Poke
mais utilise le format cfFormat.