Voici le composant que Borland n'est pas arrivé à faire correctement depuis Delphi 2.0 et C++ Builder 1.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é DDECP 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 C++ Builder 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
class PACKAGE TDDEManager : public TComponent
{
private:
int
CFLink;
protected:
public:
DWORD
IdInstance;
TList
*Clients;
__fastcall TDDEManager(TComponent* Owner);
virtual __fastcall ~TDDEManager(void);
int __fastcall PasteLink(char *Service, char *Topic, char *Item);
int __fastcall PasteLinkEx(int cfFormat, char *Service, char *Topic, char *Item);
__published:
};
class TClient
{
public:
TDDEClient
*DDEClient;
__fastcall TClient(TDDEClient *DDEC);
};
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.
TDDEClient
class PACKAGE TDDEClient : public TComponent
{
private:
AnsiString
FService,
FTopic;
HSZ
HSZService,
HSZTopic;
int
FFormat,
FTimeOut;
void __fastcall SetService(const AnsiString Value);
void __fastcall SetTopic(const AnsiString Value);
void __fastcall SetFormat(int Value);
void __fastcall SetTimeOut(int Value);
protected:
public:
HCONV
HConv;
TOnDataChange
FOnDataChange;
__fastcall TDDEClient(TComponent* Owner);
virtual __fastcall ~TDDEClient(void);
int __fastcall OpenConversation(void);
int __fastcall CloseConversation(void);
int __fastcall IsOpen(void);
char * __fastcall RequestData(char *Item, int *DataSize);
int __fastcall AdviseData(char *Item);
int __fastcall UnadviseData(char *Item);
int __fastcall Execute(char *Item, char *Command);
int __fastcall Poke(char *Item, void *pData, int DataLength);
int __fastcall PokeEx(int cfFormat, char *Item, void *pData, int
DataLength);
__published:
__property AnsiString Service = {read = FService, write = SetService};
__property AnsiString Topic = {read = FTopic, write = SetTopic};
__property int Format = {read = FFormat, write = SetFormat, default
= CF_TEXT};
__property int TimeOut = {read = FTimeOut, write = SetTimeOut, default
= 1000};
__property TOnDataChange OnDataChange = {read = FOnDataChange, write
= FOnDataChange};
};
typedef void __fastcall (__closure *TOnDataChange)(TDDEClient *DDEClient,
char *Item, const char *Value, int ValueSize);
Le composant TDDEClient représente la conversation
entre l'application cliente et le serveur.