I. Introduction

Le DDE permet à deux applications de communiquer entre elles. Les applications doivent être lancées. L'une des applications est alors serveur tandis que les autres sont clients. Le serveur peut aussi être le client d'autres applications. La façon dont communiquent les applications peut être de deux types. Soit les clients appellent le serveur à chaque fois qu'ils ont besoin d'une information, soit le serveur informe le client des nouvelles informations disponibles.

Image non disponible
Liaison DDE - Vue d'ensemble des liaisons possibles.

I-A. Composants

Dans Delphi, vous trouverez les composants dans l'onglet Système. Ils sont au nombre de quatre et permettent de réaliser des applications utilisant le DDE.

Image non disponible
Composant_DDE

Dans l'ordre, on trouve : DdeServerConv, DdeServerItem, DdeClientConv et DdeClientItem.

I-B. Utilisation

Le DdeServerConv et le DDeClientConv permet d'établir la conversation entre un client et son serveur. Mais il faut en plus ajouter les DdeServerItem et DdeClientItem pour permettre l'échange de donnée. En fonction du nombre de donnée à échanger, on ajoute autant de DdeServerItem que de DdeCLientItem.

Les deux composants DdeServerItem et DdeClientItem proposent les propriétés suivantes : Lines de type TStrings et Text de type TString.

L'une ou l'autre des propriétés est à utiliser en fonction de la taille de la donnée à échanger (la propriété Text de type TString est limitée à 255 caractères).

II. Partie Serveur

Nous allons commencer par la partie Serveur pour deux choses. La première, une fois le serveur réalisé, nous saurons quel type de donnée, nous voulons échanger. La deuxième lors de l'exécution ou du débogage du client, le serveur peut être chargé automatiquement.

Dans votre projet, ajouter un composant DdeServerConv et autant de DdeServerItem que de donnée à échanger.

Attention, point important :
Vous n'êtes pas obligé d'ajouter de Composant DdeServerConv, dans ce cas c'est la fiche contenant les DdeServerItem qui sert de serveur. Le problème est que c'est le titre de la fiche qui est utilisé pour identifier le serveur. Si par malheur vous changer le titre de la fiche, vous rompez la communication. Ce genre de gag, peut vous faire passer des nuits blanches à chercher l'origine du problème. Donc à moins que vous ne vouliez tenter le diable, utilisez toujours un DdeServerConv pour identifier le serveur.

Pour mettre les nouvelles données dans les DdeServerItem, une simple affectation suffit.

 
Sélectionnez
procedure TForm1.Edit1OnChange(Sender : TObject);
begin
    DdeServerItem1.Text := Edit1.Text;
end;

Il ne reste plus qu'à changer les propriétés des DdeServerItem et la partie serveur sera terminée. Donc ne perdons pas un instant et modifions la propriété ServerConv, en indiquant soit le nom du composant DdeServerConv, soit le nom du projet sans l'extension.

Image non disponible
Propriété de DdeClientItem1

III. Partie Cliente

Passons maintenant à la partie client. Ajoutez un composant DdeClientConv (obligatoire cette fois-ci) et autant de composant DdeClientItem que de DdeServerItem dont vous voulez récupérer la valeur.

Modifiez ensuite les propriétés du DdeClientConv.

Image non disponible
DdeClientConv
  • Positionnez la propriété ConnectMode à DdeManual
  • Double cliquez sur DdeService.
Image non disponible
DdeService
  • Dans la partie Service indiquer le nom de l'application serveur sans l'extension.
  • Dans la partie Rubrique indiquer le nom du composant DdeServerConv (ou le titre de la fiche si vous n'avez pas suivit mon conseil).
  • Dans la rubrique Service application, indiquez de nouveau le nom de l'application serveur sans l'extension. Vous pouvez indiquer le chemin complet si elle n'est pas dans le même répertoire que l'application cliente.

Modifier ensuite les propriétés de Chaque DdeClientItem.

Image non disponible
DdeClientItem
  • Dans DdeConv indiquez le DdeServerConv ou le nom de la fiche serveur.
  • Dans DdeItem indiquez le nom du composant DdeServerItem.
  • RePositionner la propriété ConnectMode à DdeAutomatic du DdeClientConv.

Si vous avez correctement fait les choses, l'application serveur doit se charger.

Dans l'événement Onchange du DdeClientItem, tapez le code suivant :

 
Sélectionnez
procedure TForm1.DdeClientItem1Change(Sender: TObject);
begin
    // Récupère les informations du serveur et les place dans Edit1

    Edit1.Text := DdeClientItem1.text;
end;

Lancez votre application cliente. Normalement l'application serveur est déjà chargée, si ce n'est pas le cas vérifier les propriétés du DdeClientConv.

Arrangez-vous pour voir les deux applications en même temps. Modifiez le texte dans l'application serveur, vous pouvez voir que les modifications sont répercutées dans l'application cliente.

IV. Cas particulier : Serveur Non-Delphi

Vous me direz c'est bien gentil mais que faire si le serveur n'est pas une application Delphi. Dans ce cas, il reste une solution à condition de 'Bien' connaître l'application serveur. En effet, pour pourvoir communiquer avec le serveur, vous devez :

  • Connaître le nom du serveur. C'est la partie facile car il s'agit du nom de l'application sans l'extension.
  • Connaître le nom du service. C'est là qu'il faut connaître l'application serveur.
  • Connaître le sujet ou topic. Correspond aux données que vous voulez récupérer.

IV-A. Serveur Non-Delphi

Exemple d'une application Cliente en Delphi communicant avec le gestionnaire de programme donc un programme Windows.

Dans votre application cliente, ajouter un DdeClientConv, DdeClientItem, une listBox.

Initialiser les propriétés de DdeClientConv :

  • à ddeManuel (permet de dire à Delphi d'attendre la fin des changements).
  • Double cliquez sur DdeService et indiquez : Progman dans service et sujet.
  • Dans service application entrez Progman
  • Modifier aussi le composant DdeClientItem,
  • Dans DdeConv, indiquez le nom du DdeClientConv,
  • Dans DdeItem, indiquez Groups
  • Remettez ConnectMode à DdeAutomatic (On a finit les modifications et Delphi peut appliquer les changements).

Dans l'événement OnChange du DdeClientItem, faire une boucle parcourant touts les éléments de DdeCLientItem.Lines et les ajouter dans la ListBox.

 
Sélectionnez
procedure TForm1.DdeClientItem1Change(Sender: TObject);
var
    i : integer;
begin
    // Récupère les informations du serveur et les placent dans ListBox1

    for i := 0 to DdeClientItem1.Lines.Count - 1 do
    begin
        ListBox1.Lines.Add(DdeClientItem1.Lines[i]);
    end;
end;

IV-B. Client Non-Delphi

L'exemple suivant, utilise HTBasic. Je doute que beaucoup de monde l'utilise mais ainsi vous verrez que vos applications peuvent communiquer avec une application conçue dans n'importe quel autre langage de programmation du moment qu'il gère les liaisons DDE. Et puis il n'y a pas que Delphi et Visual C/C++ dans la vie.

 
Sélectionnez
INTEGER Result,Ch1,Ch2
DIM Ret$[256],Htbvers$[80]
      
Htbvers$=SYSTEM$("VERSION:HTB")
IF POS(Htbvers$,"9") THEN
    Htbvers$="9"
ELSE
    Htbvers$="5"
END IF
CLEAR SCREEN
! Charge la librairie DDE correspondant à la version du HTB, seulement si elle n'est pas déjà chargée.
IF NOT INMEM("Ddeinit") THEN
    SELECT Htbvers$
        CASE "5"
            LOADSUB ALL FROM "htbdde.csb"
        CASE "9"
            LOADSUB ALL FROM "htb8dde.csb"
    END SELECT
    PRINT
    PRINT " BASIC DDE Client CSUB (R"&Htbvers$&") est chargé.."
END IF
        
CALL Ddeinit(Result)
IF Result=0 THEN
    DISP "Doing some DDE conversation.."
    ! WAIT 2
           
    ! Connexion à l'application, retourne un numéro de canal dans Ch
    CALL Ddeconnect(Ch1,"ServeurPrj","DdeServerConv1")
    IF Ch1<>0 THEN
        ! Se reconnecte avec un autre canal
        CALL Ddeconnect(Ch2,"ServeurPrj","DDeServerConv1")
        CALL Dderequest(Ch2,"DDeServerItem1",Ret$,Result) ! récupère la valeur
        CALL Ddeterminate(Ch2,Result)                     ! Termine la connexion sur le second canal
        CALL Ddeterminate(Ch1,Result)     ! Sur le premier
    ELSE
        BEEP
        Buf$="ServeurPrj DDE connexion échouée"
    END IF
              
    CALL Ddeclean(Result)      ! Libère les ressources DDE
ELSE
    BEEP
    Buf$="DDE initialisation échouée"
END IF
CLEAR SCREEN
PRINT Ddeinfo$
PRINT "Valeur du serveur: ";Ret$;
PRINT
PRINT Buf$
PRINT "DDE Test terminé"
DELSUB Ddeinit TO END
END

V. 5. Conclusion

Pour réaliser une connexion Manuel, c'est-à-dire qui demande les informations. Il suffit de placer ConnectMode à DdeManual pour le DdeClientConv. Ensuite, lors que l'on veut récupérer les données, on invoque l'instruction RequestData.

Notez qu'il n'est plus nécessaire d'avoir des DdeClientItems dans ce cas.

Avec peu d'effort, vous pouvez rendre vos applications communicantes que se soit des serveurs ou des clients d'autre application et ce quels que soient leurs langages.

Sommaire