Présentation du Glisser-Déposer

4D - Documentation   Français   English   German   4e Dimension, Commandes par thèmes   4e Dimension, Liste alphabétique des commandes   4e Dimension, Constantes par thèmes   Retour   Précédent   Suivant

version 2004.2 (Modifiée)


4e Dimension dispose de fonctions intégrées vous permettant de gérer le glisser-déposer ("drag and drop") parmi les objets de vos formulaires. Vous pouvez glisser-déposer un objet sur un autre objet situé dans la même fenêtre ou dans une autre fenêtre. Autrement dit, vous pouvez effectuer des glisser-déposer à l'intérieur d'un même process ou entre différents process.

4e Dimension ne comporte pas de fonctions intégrées permettant le glisser-déposer d'objets entre 4D et le bureau ou une autre application. Cependant, cette fonctionnalité est disponible via des plug-ins développés par les Partenaires 4D ou le glisser-déposer "système" (pour plus d'informations sur ce point, reportez-vous à la fin de cette section).

Note : Pour ne pas alourdir cette introduction, nous admettrons ici que le glisser-déposer permet de "transporter" des données d'un point à un autre. Nous verrons plus loin qu'un glisser-déposer peut aussi être la métaphore (c'est-à-dire la représentation au niveau de l'interface utilisateur) de toute opération, quelle qu'elle soit.

Propriétés d'objets "Glissable" et "Déposable"


Si vous souhaitez qu'un objet soit glissable, c'est-à-dire que vous puissiez le faire glisser et le déposer sur un autre objet, vous devez sélectionner la propriété "Glissable" pour cet objet dans la Liste des propriétés. L'objet que vous faites glisser est appelé objet source de l'opération de glisser-déposer.

Si vous souhaitez qu'un objet soit déposable, c'est-à-dire que l'objet puisse être la destination d'une opération de glisser-déposer, vous devez sélectionner la propriété "Déposable" pour cet objet dans la Liste des propriétés. L'objet qui reçoit les données est appelé objet de destination de l'opération de glisser-déposer.

Par défaut, les objets nouvellement créés ne possèdent aucune de ces propriétés. Il est de votre ressort de les sélectionner explicitement.

Tous les objets situés dans un formulaire entrée ou dans une boîte de dialogue peuvent être définis comme glissables et déposables. Les éléments individuels d'un tableau (par exemple une zone de défilement), les éléments d'une liste hiérarchique ou les lignes d'une list box peuvent être glissé(e)s et déposé(e)s. Inversement, vous pouvez faire glisser et déposer tout objet sur un élément individuel d'un tableau ou d'une liste hiérarchique, ou encore une ligne de list box. Il n'est toutefois pas possible de faire glisser et de déposer des objets depuis la zone de corps d'un formulaire sortie.

Afin de vous laisser "carte blanche" lors de la construction d'une interface utilisateur exploitant le glisser-déposer, 4D vous permet d'utiliser tout type d'objet actif (champ ou variable) en tant qu'objet source ou destination. Par exemple, si vous le souhaitez, vous pouvez glisser-déposer des boutons.

Notes :

Pour faire glisser un bouton ayant la propriété "glissable", vous devez au préalable appuyer sur la touche Alt (Windows) ou Option (Mac OS).

Lorsque, pour un objet de type List box, les propriétés "Glissable" et "Ligne déplaçable" sont définies simultanément, la propriété "Ligne déplaçable" est prioritaire en cas de déplacement d'une ligne. Le glisser n'est pas possible dans ce cas.

Notez qu'un objet "glissable" et "déposable" peut être déposé sur lui-même (à moins que vous n'interdisiez cette opération, reportez-vous aux paragraphes suivants).

Voici la Liste des propriétés, dans laquelle les propriétés "Glissable" et "Déposable" ont été définies pour l'objet sélectionné :

Gérer une interface utilisateur exploitant le glisser-déposer


4e Dimension gère l'aspect "interface utilisateur" du glisser-déposer. Si vous cliquez sur un objet glissable — et maintenez le bouton de la souris enfoncé — puis déplacez la souris, 4D représente à l'écran le déplacement de l'objet par un cadre pointillé suivant les mouvements de la souris. Dans l'écran ci-dessous, un élément de liste hiérarchique est sur le point d'être déposé dans un champ de type Texte :

Notez le cadre grisé actif qui entoure alors le champ de texte. Cette activation indique l'objet de destination (ici le champ de texte). Si vous relâchez le bouton de la souris à cet instant, 4D comprend que vous voulez déposer l'objet que vous avez fait glisser sur l'objet activé.

La représentation à l'écran de l'activation d'une zone de déposer peut être paramétrée dans la boîte de dialogue des Préférences de la base :

Par défaut, le type d'activation est "Cadre". Cela correspond à l'encadrement de la zone tel que présenté dans l'écran précédent : un rectangle gris inversé apparaît autour de l'objet. Si vous utilisez des couleurs d'arrière-plan ou de contours d'objets s'accommodant mal de l'activation par encadrement, vous pouvez plutôt sélectionner le type d'activation "Motif".

Dans ce cas, l'objet de destination est rempli par un motif de lignes diagonales, comme illustré ci-dessous :

Ici, un élément d'un tableau est déposé à l'intérieur du même tableau :

Vous pouvez, si vous le souhaitez, définir simultanément les deux types d'activation. Si vous n'en sélectionnez aucun, l'option par défaut sera "Cadre".

Note : L'activation de l'objet de destination "suit" chaque élément lorsque l'objet de destination est un tableau (zone de défilement), une list box ou une liste hiérarchique.

Gérer le glisser-déposer par programmation


4e Dimension gère l'aspect "interface utilisateur" du glisser-déposer et il vous revient d'en traiter l'aspect "programmation". Pour cela, 4D vous fournit deux événements formulaires : Sur glisser et Sur déposer. Ces deux événements sont envoyés à l'objet de destination. Lors d'une opération de glisser-déposer, la méthode de l'objet source n'est sollicitée en aucun cas.

Pour que l'objet de destination puisse traiter ces deux événements, il doivent avoir été sélectionnés pour l'objet dans la Liste des propriétés :

Sur glisser

L'événement Sur glisser est envoyé de manière répétée à l'objet de destination lorsque le pointeur de la souris est placé sur l'objet. Généralement, en réponse à cet événement, vous effectuez les actions suivantes :

Vous appelez la commande PROPRIETES GLISSER DEPOSER qui vous renseigne sur l'objet source.

En fonction de la nature et du type de l'objet de destination (celui duquel la méthode est en cours d'exécution) et de l'objet source, vous acceptez ou refusez le glisser.

Pour signaler que le glisser est accepté, la méthode de l'objet de destination doit retourner 0 (zéro), vous exécutez donc $0:=0. Pour signaler que le glisser est refusé, la méthode de l'objet de destination doit retourner -1 (moins un), vous exécutez donc $0:=-1. Dans ce cas, l'objet n'est pas activé graphiquement. Pendant un événement Sur glisser, 4D traite la méthode de l'objet comme une fonction. Si aucun résultat n'est retourné, 4D considère que le glisser est accepté.

Si vous acceptez le glisser, l'objet de destination est activé. Si vous le refusez, l'objet de destination reste inactivé. Accepter le glisser ne signifie pas que les données glissées vont être insérées dans l'objet de destination. Cela signifie uniquement que l'objet de destination, si le bouton de la souris était relâché à cet instant, accepterait les données.

Si vous ne gérez pas l'événement Sur glisser pour un objet dont la propriété "Déposable" a été sélectionnée, l'objet sera activé pour tous les glisser, quels que soient la nature et le type des données glissées.

La traitement de l'événement Sur glisser vous permet de contrôler la première phase d'une opération de glisser-déposer : non seulement vous pouvez tester si le type des données glissées est compatible avec l'objet de destination — et donc accepter ou refuser le glisser — mais également, vous en informez l'utilisateur, car 4D active ou non l'objet de destination en fonction de votre décision.

Le code traitant un événement Sur glisser doit être court et s'exécuter rapidement car cet événement est envoyé de manière répétée à l'objet de destination courant, en fonction des mouvements de la souris.

ATTENTION : Si le glisser-déposer est un glisser-déposer interprocess, ce qui signifie que l'objet source est situé dans un process (fenêtre) différent de celui de l'objet de destination, la méthode de l'objet de destination lors de l'événement Sur glisser est exécutée dans le contexte du process source (le process de l'objet source) et non dans le process de l'objet de destination. C'est le seul cas où un tel type d'exécution a lieu (les avantages que procure ce fonctionnement sont décrits à la fin de cette section).

Sur déposer

L'événement Sur déposer est envoyé (une seule fois) à l'objet de destination lorsque le bouton de la souris est relâché alors que le pointeur se trouvait au-dessus de l'objet. Cet événement est la seconde phase d'un glisser-déposer, dans laquelle vous effectuez les véritables opérations répondant à l'action de l'utilisateur.

Cet événement n'est pas envoyé à l'objet si le glisser n'a pas été accepté dans le ou les événement(s) Sur glisser. Si vous traitez l'événement Sur glisser pour un objet et refusez le glisser, l'événement Sur déposer ne se déclenche pas. Ainsi, si pendant l'événement Sur glisser vous avez testé la compatibilité entre le type des données de l'objet source et de destination et accepté le glisser, vous n'avez pas besoin de tester de nouveau les données dans l'événement Sur déposer : vous savez déjà qu'elles sont compatibles.

L'aspect le plus intéressant de l'implémentation du glisser-déposer dans 4D est que le programme vous permet de faire ce que vous voulez. Par exemple :

Si un élément de liste hiérarchique est déposé sur un champ de type Texte, vous pouvez décider d'insérer le texte de l'élément de liste au début, au milieu ou à la fin du champ de texte.

Votre formulaire contient un bouton image à deux états représentant une corbeille vide et une corbeille pleine. Le glisser-déposer d'un objet sur ce bouton pourrait provoquer, du point de vue de l'interface utilisateur : "supprimer l'objet qui a été glissé-déposé dans la corbeille". Ici, le glisser-déposer ne transporte pas des données d'un point à un autre, mais plutôt il déclenche une action.

Glisser un élément de tableau depuis une palette flottante vers un objet dans un formulaire pourrait signifier "afficher dans cette fenêtre l'enregistrement du client dont le nom a été glissé-déposé depuis la fenêtre flottante listant les noms de tous les clients stockés dans la base".

Etc.

La gestion du glisser-déposer de 4D est une boîte à outils vous permettant d'implémenter toutes les métaphores d'interface utilisateur auxquelles vous pouvez penser.

Les commandes du thème Glisser-Déposer


La commande PROPRIETES GLISSER DEPOSER retourne :

un pointeur vers l'objet glissé (champ ou variable),

le numéro de l'élément de tableau ou de liste hiérarchique le cas échéant,

le numéro du process source.

La commande Position deposer retourne le numéro ou la position de l'élément cible si l'objet de destination est un tableau (c'est-à-dire une zone de défilement) ou une liste hiérarchique, ainsi que le numéro de colonne si l'objet est une list box.

Les commandes telles que RESOUDRE POINTEUR et Type sont utiles pour tester la nature et le type de l'objet source.

Lorsque l'opération de glisser-déposer est destinée à copier les données glissées :

Si le glisser-déposer est effectué à l'intérieur du même process, utilisez ces commandes pour effectuer les actions correspondantes (c'est-à-dire simplement assigner l'objet source à l'objet de destination).

Si le glisser-déposer est interprocess, soyez vigilant lorsque vous accédez aux données glissées : vous devez récupérer l'instance des données située dans le process source. Si les données glissées proviennent d'une variable, utilisez la commande LIRE VARIABLE PROCESS pour obtenir la valeur correcte. Si les données glissées proviennent d'un champ, il est probable que l'enregistrement courant de la table n'est pas le même d'un process à l'autre, vous devez donc accéder au bon enregistrement.

Dans ce dernier cas, plusieurs solutions sont envisageables :

Puisque l'événement Sur glisser de la méthode de l'objet de destination est exécuté dans le contexte du process source, vous pouvez copier, au moment de son exécution, les données du champ ou le numéro de l'enregistrement dans une variable interprocess, que vous réutiliserez lors de l'événement Sur déposer.

Pendant l'événement Sur déposer, vous pouvez établir une communication interprocess avec le process source dans le but de récupérer les données requises.

Lorsque le glisser-déposer n'est pas destiné à déplacer des données mais plutôt à créer des métaphores d'interface pour des opérations particulières, vous pouvez virtuellement réaliser tout ce que vous voulez.

Glisser-Déposer "Système"


Les objets texte gérés en natif par 4D (champs, variables et List box) autorisent le glisser-déposer "système", c'est-à-dire le déplacement ou la copie direct(e) de la sélection de texte d'une zone à une autre. Il peut être employé dans la même zone 4D, entre deux zones 4D, ou entre 4D et une autre application, par exemple WordPad. Ce principe ne fonctionne que lorsque la zone de départ et la zone d'arrivée sont en gestion native.

Lorsque le glisser-déposer système est utilisé, les mécanismes de gestion du glisser-déposer internes de 4e Dimension décrits ci-dessus NE SONT PAS mis en oeuvre.

Par conséquent, les événements formulaire Sur glisser et Sur déposer ne sont PAS déclenchés et la zone de déposer n'est pas activée comme défini dans les Préférences.

Si vous souhaitez "forcer" l'utilisation du glisser-déposer interne de 4e Dimension avec des objets en gestion native, appuyez sur la touche Alt (Windows) ou Option (Mac OS) avant d'effectuer un glisser-déposer.

Référence

Evenement formulaire, LIRE VARIABLE PROCESS, Liste existante, Position deposer, PROPRIETES GLISSER DEPOSER, RESOUDRE POINTEUR, Type.


4D - Documentation   Français   English   German   4e Dimension, Commandes par thèmes   4e Dimension, Liste alphabétique des commandes   4e Dimension, Constantes par thèmes   Retour   Précédent   Suivant