4D v16.3

DRAG AND DROP PROPERTIES

Accueil

 
4D v16.3
DRAG AND DROP PROPERTIES

DRAG AND DROP PROPERTIES 


 

DRAG AND DROP PROPERTIES ( srcObjet ; srcElément ; srcProcess ) 
Paramètre Type   Description
srcObjet  Pointeur in Pointeur vers l'objet source du glisser-déposer
srcElément  Entier long in Numéro de l'élément de tableau glissé ou Numéro de la ligne de list box glissée ou Elément de la liste hiérarchique glissé ou -1 si l'objet glissé n'est ni un élément de tableau, ni une ligne de list box ni un élement de liste
srcProcess  Entier long in Numéro du process source

La commande DRAG AND DROP PROPERTIES vous permet de récupérer des informations sur l'objet source lorsque l'événement On Drag Over ou On Drop est déclenché pour un objet “complexe” (tableau, list box ou liste hiérarchique).

Généralement, la commande DRAG AND DROP PROPERTIES se place dans la méthode objet (ou une des sous-méthodes qu'elle appelle) de l'objet pour lequel l'événement On Drag Over ou On Drop se produit.

Rappel : Des données peuvent être déposées sur un objet de formulaire si la propriété Déposable lui a été assignée. De plus, la méthode qui lui est associée doit être appelée par l'événement On Drag Over et/ou On Drop si vous voulez traiter ce type d'événement.

Après l'appel de cette commande :

  • Le paramètre srcObjet est un pointeur vers l'objet source, c'est-à-dire l'objet qui a été glissé et déposé. Notez que cet objet peut être ou non identique à l'objet de destination, autrement dit l'objet pour lequel l'événement On Drag Over ou On Drop a été déclenché. Le glisser-déposer de valeurs entre des objets de même type est utile pour les tableaux et les listes hiérarchiques : cela vous fournit un moyen simple de permettre à l'utilisateur de trier manuellement un tableau ou une énumération.
  • Si les données glissées-déposées sont un élément de tableau (l'objet source étant un tableau), le paramètre srcElément est égal au numéro de cet élément. Si les données glissées-déposées sont une ligne de list box, le paramètre srcElément est égal au numéro de cette ligne. Si les données glissées-déposées sont un élément de liste hiérarchique, le paramètre srcElément retourne la position de cet élément. Sinon, si l'objet source n'appartient à aucune de ces catégories, srcElément est égal à -1.
  • Des opérations de glisser-déposer peuvent être effectuées entre différents process. Le paramètre srcProcess est égal au numéro du process auquel appartient l'objet source. Il est important de tester la valeur de ce paramètre. En effet, vous pouvez traiter un glisser-déposer “process” en copiant simplement les données source dans l'objet de destination. En revanche, lorsque vous traitez un glisser-déposer “interprocess”, vous devez utiliser la commande GET PROCESS VARIABLE pour récupérer les données source à partir de l'instance de l'objet du process source. Notez que généralement, le glisser-déposer dans une interface utilisateur s'effectue à partir de variables (tableaux et liste hiérarchiques) vers des zones de saisie de données (champs ou variables).

Note de compatibilité : Depuis la version 11 de 4D, il est recommandé de gérer les opérations de glisser-déposer, notamment interprocess, à l'aide de l'événement On Begin Drag Over et des commandes du thème Conteneur de données.

Si vous appelez DRAG AND DROP PROPERTIES alors qu'aucun événement glisser-déposer ne s'est produit, srcObjet retourne un pointeur NIL, srcElément retourne -1 et srcProcess retourne 0.

Astuce : 4D gère pour vous l'aspect graphique du glisser-déposer. Mais c'est à vous de traiter l'événement de manière appropriée. Dans les exemples ci-dessous, le traitement consiste à copier les données qui ont été glissées. Mais vous pouvez également implémenter des interfaces plus sophistiquées dans lesquelles, par exemple, le glisser-déposer d'un élément de tableau depuis une palette flottante provoque le remplissage de la fenêtre de destination (la fenêtre dans laquelle se trouve l'objet de destination) avec des données structurées (comme plusieurs champs provenant d'un enregistrement désigné par l'élément de tableau source).

Vous pouvez appeler la commande DRAG AND DROP PROPERTIES lors de l'événement formulaire On Drag Over afin de décider si l'objet de destination doit ou non accepter l'opération, en fonction du type et/ou de la nature de l'objet source (ou pour toute autre raison). Si vous acceptez le glisser-déposer, la méthode de l'objet doit retourner $0:=0. Si vous n'acceptez pas l'opération, la méthode de l'objet doit retourner $0:=-1. L'acceptation ou le refus d'un glisser-déposer est visible à l'écran : l'objet sera ou ne sera pas sélectionnable (par exemple encadré) en tant que destination du glisser-déposer.

Vous disposez, dans plusieurs formulaires de votre base, de zones de défilement. Vous voulez que l'utilisateur puisse réordonner manuellement les éléments des zones par simple glisser-déposer à l'intérieur de chaque zone. Plutôt que d'écrire du code spécifique pour chaque cas, vous voulez utiliser une méthode projet générique qui traite toutes les zones de défilement. Pour cela, vous pouvez écrire :

  ` Méthode projet de traitement de glisserdéposer interne dans un tableau
  ` Traitement de glisserdéposer interne dans un tableau ( Pointeur ) -> Booléen
  ` Traitement de glisserdéposer interne dans un tableau ( -> Tableau ) -> Est un glisser-déposer interne dans un tableau
 
 Case of
    :(Form event=On Drag Over)
       DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
       If($vpSrcObj=$1)
  `Accepter le glisser-déposer s'il est interne au tableau
          $0:=0
       Else
          $0:=-1
       End if
    :(Form event=On Drop)
  ` Récupérer les informations sur l'objet source du glisser-déposer
       DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
  ` Récupérer le numéro de l'élément de destination
       $vlDstElem :=Drop position
  ` Si l'élément n'a pas été glissé-déposé sur lui-même
       If($vlDstElem #$vlSrcElem)
  ` Stocker l'élément glissé dans l'élément 0 du tableau
          $1->{0}:=$1->{$vlSrcElem}
  ` Effacer l'élément glissé
          DELETE FROM ARRAY($1->;$vlSrcElem)
  ` Si l'élément de destination est au-delà de l'élément glissé
          If($vlDstElem>$vlSrcElem)
  ` Décrémenter le numéro de l'élément de destination
             $vlDstElem:=$vlDstElem-1
          End if
  ` Si le glisser-déposer s'est produit au-delà du dernier élément
          If($vlDstElem=-1)
  ` Définir le numéro de l'élément de destination comme un nouvel élément ajouté à la fin du tableau
             $vlDstElem:=Size of array($1->)+1
          End if
  ` Insérer ce nouvel élément
          INSERT IN ARRAY($1->;$vlDstElem)
  ` Fixer sa valeur, préalablement stockée dans l'élément zéro du tableau
          $1->{$vlDstElem}:=$1->{0}
  ` L'élément devient le nouvel élément sélectionné du tableau
          $1->:=$vlDstElem
       End if
 End case

Une fois que vous avez écrit cette méthode projet, vous pouvez l'utiliser ainsi :

  ` Méthode objet Zone de défilement unTableau
 
 Case of
  `...
    :(Form event=On Drag Over)
       $0:=Traitement de glisserdéposer interne dans un tableau(Self)
    :(Form event=On Drop)
       Traitement de glisserdéposer interne dans un tableau(Self))
  `...
 End case

Vous disposez, dans plusieurs formulaires de votre base, de zones de texte saisissables. Vous voulez que l'utilisateur puisse y saisir des données par glisser-déposer à partir de sources multiples. Plutôt que d'écrire du code spécifique pour chaque cas, vous voulez utiliser une méthode projet générique qui traite toutes les zones de texte. Pour cela, écrivez la méthode suivante :

  ` Méthode projet Traitement du déposer dans variable Texte
  ` Traitement du déposer dans variable Texte ( Pointeur )
  ` Traitement du déposer dans variable Texte ( -> variable texte ou chaîne )
 
 Case of
  ` Utilisation de cet événement pour accepter ou refuser le glisser-déposer
    :(Form event=On Drag Over)
  ` Initialiser $0 pour le refus
       $0:=-1
  ` Récupérer les informations sur l'objet source du glisser-déposer
       DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
  ` Dans cet exemple, nous refusons le glisser-déposer d'un objet sur lui-même
       If($vpSrcObj#$1)
  ` Récupérer le type des données glissées
          $vlSrcType:=Type($vpSrcObj->)
          Case of
             :($vlSrcType=Is text)
  ` OK pour les variables texte
                $0:=0
             :($vlSrcType=Is string var)
  ` OK pour les variables chaîne
                $0:=0
             :(($vlSrcType=String array)|($vlSrcType=Text array))
  ` OK pour les tableaux chaîne et texte
                $0:=0
             :(($vlSrcType=Is longint)|($vlSrcType=Is real))
                If(Is a list($vpSrcObj->))
  ` OK pour les liste hiérarchiques
                   $0:=0
                End if
          End case
       End if
 
  ` Utilisation de cet événement pour effectuer réellement l'action de glisser-déposer
    :(Form event=On Drop)
       $vtDonnéesGlissées:=""
  ` Récupérer les informations sur l'objet source du glisser-déposer
       DRAG AND DROP PROPERTIES($vpSrcObj;$vlSrcElem;$vlPID)
  ` Récupérer le type des données glissées
       $vlSrcType:=Type($vpSrcObj->)
       Case of
  ` Si c'est un tableau
          :(($vlSrcType=Tableau chaîne)|($vlSrcType=ARRAY TEXT))
             If($vlPID#Current process)
  ` Lire l'élément depuis l'instance de la variable dans le process source
                GET PROCESS VARIABLE($vlPID;$vpSrcObj->{$vlSrcElem};$vtDraggedData)
             Else
  ` Glisser-déposer depuis le même process, copions juste la valeur
                $vtDraggedData:=$vpSrcObj->{$vlSrcElem}
             End if
  ` Si c'est une liste
          :(($vlSrcType=Is real) | ($vlSrcType=Is longint))
  ` Si c'est une liste en provenance d'un autre process
             If($vlPID#Current process)
  `Récupérer la référence de la liste dans l'autre process
                GET PROCESS VARIABLE($vlPID;$vpSrcObj->;$vlList)
             Else
                $vlList:=$vpSrcObj->
             End if
  ` Si la liste existe
             If(Is a list($vpSrcObj->))
  `Récupérer le texte de l'élément dont on a obtenu la position
                GET LIST ITEM($vlList;$vlSrcElem;$vlItemRef;$vsItemText)
                $vtDraggedData:=$vsItemText
             End if
          Else
  ` C'est une variable chaîne ou texte
             If($vlPID#Current process)
                GET PROCESS VARIABLE($vlPID;$vpSrcObj->;$vtDraggedData)
             Else
                $vtDraggedData:=$vpSrcObj->
             End if
       End case
  ` S'il y a effectivement quelque chose à déposer (l'objet source pourrait être vide)
       If($vtDraggedData # "")
          $1->:=$1->+$vtDraggedData
       End if
 End case


Une fois que vous avez écrit cette méthode projet, vous pouvez l'utiliser ainsi :

  ` Méthode objet du champ de texte [uneTable]unTexte
 
 Case of
          ` ...
    :(Form event=On Drag Over)
       $0:=Traitement du déposer dans variable texte(Self)
 
    :(Form event=On Drop)
       Traitement du déposer dans variable texte(Self)
          ` ...
 
 End case

Nous souhaitons remplir une zone de texte (par exemple une étiquette) avec des données glissées depuis une list box.

Voici la méthode de l’objet etiq1 :

 Case of
    :(Form event=On Drag Over)
       DRAG AND DROP PROPERTIES($source;$lignetab;$numprocess)
       If($source=Get pointer("list box1"))
          $0:=0 `On accepte le glisser
       Else
          $0:=-1 `On refuse le glisser
       End if
    :(Form event=On Drop)
       DRAG AND DROP PROPERTIES($source;$lignetab;$numprocess)
       QUERY([Adhérents];[Adhérents]Nom=tNoms{$lignetab})
       If(Records in selection([Adhérents])#0)
          etiq1:=[Adhérents]Nom+" "+[Adhérents]Prénom+Char(Carriage return)+[Adhérents]Adresse+Char(Carriage return)+[Adhérents]Code postal+" "+[Adhérents]Ville
       End if
 End case

Il est dès lors possible d’effectuer l’action suivante :



Voir aussi  

Drop position
Form event
GET PROCESS VARIABLE
Is a list
Présentation du Glisser-Déposer
RESOLVE POINTER

 
PROPRIÉTÉS 

Produit : 4D
Thème : Glisser-Déposer
Numéro : 607

 
HISTORIQUE 

Modifié : 4D 2004.2

 
UTILISATION DE L'ARTICLE

4D - Langage ( 4D v16)
4D - Langage ( 4D v16.1)
4D - Langage ( 4D v16.2)
4D - Langage ( 4D v16.3)