[WinDev] Réaliser un Drag&Drop simple

Vincent Lecomte

Grâce au WLangage, il est possible de créer un “drag & drop” (ou plutôt “glisser-déposer” de manière programmée). La source peut être un champ de saisie, une table, une liste (avec image ou non), ou même une image. Au contraire tous les champs peuvent être la cible du “glisser-déposer” sauf certains types comme les jauges, les objets ActiveX et OLE, les formes, les barres d’outils, et enfin les champs “HTML”, “Webcam” et “Visioconférence”.

Dans notre exemple, nous allons permettre de déplacer une valeur d’une table à une autre. Les deux tables seront à la fois “source” et “cible”, et devront donc toutes les deux générer trois événements.

Les tables sources nécessitent la création de l’événement pour permettre de glisser l’objet. Tandis que les tables cibles doivent gérer à la fois l’événement pour le survol du champ, ainsi que celui déclenché lorsque l’on lâche l’objet, dans cet ordre précis. On n’oubliera pas non plus de préciser que l’on va utiliser un “drag & drop” programmé.

1 – “Glisser-déposer” programmé

NOM_TABLE..DndSource = dndProgrammé
NOM_TABLE..DndCible = dndProgrammé

Comme expliqué ci-dessus, les tables seront à la fois source et cible, ce qui nous force alors à utiliser les deux lignes de code précédente, dans la partie “Initialisation de la table”. Pour les deux cas, on utilise donc un “drag & drop” programmé, donc entièrement géré par le développeur.

2 – Événements et fonctions associées

// Événements pour table Cible
DnDEvénement("Survol", TABLE_CIBLE, dndSurvol)
DnDEvénement("InsereDansTable", TABLE_CIBLE, dndLâcher)

// Événements pour table Source
DnDEvénement("Glisser", TABLE_SOURCE, dndDébutGlisser)

L’appel de la fonction “DNDEvénement” requiert l’utilisation de 3 paramètres :

  • Le nom de la fonction qui sera appelée lors du déclenchement de l’événement.
  • Le nom du champ concerné par cet événement.
  • Le type de l’événement (glisser, lâcher, survol, entrée dans le champ (ou sortie), etc.).

Dans notre cas tous les événements sont définis dans chacune des tables puisqu’elles sont à la fois source et cible. Mais voyons à présent ce qui se cache dans les fonctions “Survol”, “Glisser” et “InsereDansTable”.

3 – Fonctions appelées

// Résumé : Active la gestion du drag & drop pour le 
// déplacement.
//
PROCEDURE Glisser()

	DnDAccepte(dndDéplacer)

La fonction “Glisser” doit simplement activer et autoriser l’opération “glisser”. Elle n’exécute aucune autre action dans ce cas-ci mais libre à vous d’en définir de nouvelles. La fonction “DnDAccepte” reçoit donc une constante en paramètre qui dans notre cas vaut “dndDéplacer“. Sans cela, glisser un objet sera interdit.

// Résumé : Détermine si le déplacement peut être 
// autorisé ou non. // Le déplacement sera interdit 
// si la table dans laquelle on veut // déplacer le 
// colis est identique.
//
PROCEDURE Survol()

	SI _DND.ChampCible = _DND.ChampSource ALORS
		Message()
		DnDAccepte(dndInterdit)
	SINON
		Message("Table cible " + _DND.ChampCible)
		DnDAccepte(dndDéplacer)
	FIN

La fonction “Survol” réalise quelque chose de plus intéressant, mais encore une fois il est libre de ne pas procéder ainsi : tout d’abord, elle utilise des variables spécifiques qui ne peuvent être utilisées que lorsqu’il y a un événement de “glisser-déposer” qui se produit.

On peut retrouver les différentes variables dans la documentation officielle de WinDev, mais celles que nous retiendrons ici sont “_DND.ChampCible” et “_DND.ChampSource“, qui ont respectivement pour valeur le nom des tables cible et source (dans cet exemple). Ensuite, grâce à ces variables, on peut interdire de déplacer l’objet si l’on se trouve dans la table initiale, ce qui évite donc des déplacements inutiles.

// Fonction pour insérer dans la table cible.
//
PROCEDURE InsereDansTable()

	// Code avant...
	TableAjoute(_DND.ChampCible, {_DND.ChampSource + sColTab,indChamp}[nIndiceSource])
	TableSupprime(...)
	// Code après...

Les variables “sColTab” et “nIndiceSource” ont été déclarées en début de fonction. L’indice de la source est récupéré grâce à la fonction “TableSelect“, dans laquelle on passe en paramètre “_DND.ChampSource“.

On récupère donc l’indice de la sélection dans la table source! Tandis que dans “sColTab“, on y a stocké le nom de la colonne qui stocke la valeur à déplacer. La fonction “TableSupprime” enlève l’enregistrement de la table source : à vous de deviner ce qu’il faut y écrire.

Conclusion

On l’a bien compris et c’est totalement indéniable : le “drag & drop” ou “glisser-déposer” est une fonctionnalité plus qu’intéressante et très puissante, quel que soit le langage utilisé (C#, Java, WLangage, etc).

Elle permet d’améliorer la convivialité de votre application afin que l’utilisateur puisse gagner du temps lorsqu’il effectue ses opérations… Que vous l’utilisiez ou non, bonne programmation !

Un commentaire sur « [WinDev] Réaliser un Drag&Drop simple »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Copy link