Communication DDE

Tout le monde connait les hyperliens commençant par https:// qui ouvre tout naturellement le navigateur par défaut et affiche ensuite la page demandée.  Tout le monde a déjà aussi utilisé le mailto: qui, en cliquant dessus, ouvre un nouveau message du logiciel de courriel par défaut. Moins connus, il y a aussi ftp: , tel: (pour appeler un # de téléphone), file: (pour ouvrir un fichier sur le disque), … mais savez-vous qu’on peut créer un nouveau préfixe juste pour votre application ? Suivez les 3 étapes à l’aide de Betula.

Première étape

Mettez cette procédure dans la collection de procédures globale de votre application. Elle va servir à traiter la ligne de commande (celle qui est envoyée quand on clique sur l’hyperlien). Vous remarquez que l’on va mettre l’application en avant plan et qu’on va récupéré le code client pour ouvrir la fiche client correspondante.

PROCÉDURE TraiteLigneDeCommande(LOCAL sLigneDeCommande est une chaîne)
SI sLigneDeCommande>"" _ET_ Position(sLigneDeCommande,COL_DDE.gsPréfixeHyperlien+":",0,SansCasse)>0 ALORS
	sLigneDeCommande		= Remplace(sLigneDeCommande,"""","")
	sLigneDeCommande		= Milieu(sLigneDeCommande,Position(sLigneDeCommande,"://")+3)
	sModule est une chaîne 	= Minuscule(ExtraitChaîne(sLigneDeCommande,1,"/"))
	sValeur est une chaîne 	= (Position(sLigneDeCommande,"/")<1 ? "" SINON ExtraitChaîne(sLigneDeCommande,2,"/"))
	SELON sModule
		CAS "moduleclient"
			SI FenEtat(FEN_Principale)<>Inexistant ALORS
				SI FenTaille(FEN_Principale)=TailleMini ALORS FenTaille(FEN_Principale,TailleNormale)	//si l'appli est minimisée, on la restaure à l'écran
				FenEtat(FEN_Principale,ActifDevant+Dessus)
			SINON
				Ouvre(FEN_Principale)
			FIN
			FEN_Principale.OuvreClient(sValeur)
		AUTRE CAS
			ToastAffiche("Cet hyperlien n'est pas reconnu par cette version")
	FIN
SINON
	//on ignore la ligne de commande
FIN

Seconde étape

Dans l’initialisation du projet, mettez les lignes suivantes. Cela permet à votre application de réagir au clic sur l’hyperlien (c’est DDEInit qui s’occupe d’enregistrer votre application « MonAppli » dans la base de registre) et d’exécuter la procédure ci-dessus.

SI DDEInit("MonAppli",TraiteLigneDeCommande) ALORS 
	gnRepDDE est un entier = LigneCommandeExt()
	SI gnRepDDE<>0 ALORS FinProgramme(gnRepDDE)
FIN

Troisième étape

Faite un hyperlien, dans une page HTML, qui contient :

<a href="MonAppli://ModuleClient/9876">cliquer ici</a>

Que fait ce code ? Vous pouvez exécuter l’application directement en cliquant sur l’exécutable. Aucune ligne de commande (à part celle que vous pourriez mettre dans un raccourci) n’est exécuté. Si vous cliquez sur l’hyperlien illustré ci-dessus, et que l’application n’est pas déjà lancée, l’application se lance évidemment en passant le reste de l’URL comme une ligne de commande. Si vous cliquez sur l’hyperlien illustré ci-dessus, et que l’application est déjà lancée, cela va donc exécuter une seconde instance de votre programme (il faut donc paramétrer l’installation pour permettre au programme de se lancer plusieurs fois!). La seconde instance va communiquer avec la première par DDE. Grâce à ce canal de communication, la seconde instance va envoyer une commande à la première. La seconde instance se ferme juste après et la première, qui reste à l’écran (et est mise en avant plan si nécessaire), exploite la ligne de commande. Dans l’exemple ci-dessus, l’URL contient le nom d’un module (ex : le module client) et le # d’enregistrement (de la table client). Il suffit donc d’appeler une fenêtre « fiche » avec cet ID pour afficher le client correspondant. CQFD.

Voici donc un petit projet test, utilisant Betula 0.36, pour vous en démontrer le fonctionnement.