PROPRIETES GLISSER DEPOSER

4D - Documentation   Français   English   German   Español   4D v11 SQL, Commandes par thèmes   4D v11 SQL, Liste alphabétique des commandes   4D v11 SQL, Constantes par thèmes   Retour   Précédent   Suivant

version 2004.2 (Modifiée)


PROPRIETES GLISSER DEPOSER (srcObjet; srcElément; srcProcess)

ParamètreTypeDescription
srcObjetPointeurPointeur vers l'objet source du glisser-déposer
srcElémentNumériqueNumé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
srcProcessNumériqueNuméro du process source

Description

La commande PROPRIETES GLISSER DEPOSER vous permet de récupérer des informations sur l'objet source lorsque l'événement Sur glisser ou Sur déposer est déclenché pour un objet "complexe" (tableau, list box ou liste hiérarchique).

Généralement, la commande PROPRIETES GLISSER DEPOSER se place dans la méthode objet (ou une des sous-méthodes qu'elle appelle) de l'objet pour lequel l'événement Sur glisser ou Sur déposer 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 Sur déposer et/ou Sur glisser 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 Sur déposer ou Sur glisser 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 LIRE VARIABLE PROCESS pour récupérer les données source à partir de l'instance de l'objet du process source. Si l'objet source est un champ, vous devez récupérer sa valeur dans le process source via les outils de communication interprocess ou traiter ce cas particulier pendant que vous répondez à l'événement Sur glisser (reportez-vous aux paragraphes ci-dessous). Notez cependant 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).

Si vous appelez PROPRIETES GLISSER DEPOSER 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 PROPRIETES GLISSER DEPOSER lors de l'événement formulaire Sur glisser 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.

Astuce : Pendant l'événement Sur glisser, la méthode de l'objet de destination est exceptionnellement exécutée dans le contexte du process de l'objet source. Si le glisser-déposer est interprocess et si l'objet source est un champ, vous pouvez profiter de l'occasion pour copier les données source dans une variable interprocess. Ainsi, vous n'aurez pas besoin par la suite, pendant l'événement Sur déposer, d'ouvrir une communication interprocess avec le process source pour récupérer la valeur du champ glissé. Si l'objet source du glisser-déposer interprocess est une variable, vous pouvez utiliser la commande LIRE VARIABLE PROCESS pendant l'événement Sur déposer.

Exemples

(1) 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 glisser-déposer interne dans un tableau
   ` Traitement de glisser-déposer interne dans un tableau ( Pointeur ) -> Booléen
   ` Traitement de glisser-déposer interne dans un tableau ( -> Tableau ) -> Est un glisser-déposer interne dans
     un tableau

   Au cas ou
      : (Evenement formulaire=Sur glisser)
         PROPRIETES GLISSER DEPOSER ($vpSrcObj;$vlSrcElem;$vlPID)
         Si ($vpSrcObj=$1)
               `Accepter le glisser-déposer s'il est interne au tableau
            $0:=0
         Sinon
            $0:=-1
         Fin de si
      : (Evenement formulaire=Sur déposer)
            ` Récupérer les informations sur l'objet source du glisser-déposer
         PROPRIETES GLISSER DEPOSER ($vpSrcObj;$vlSrcElem;$vlPID)
            ` Récupérer le numéro de l'élément de destination
         $vlDstElem := Position deposer 
            ` Si l'élément n'a pas été glissé-déposé sur lui-même
         Si ($vlDstElem # $vlSrcElem)
               ` Stocker l'élément glissé dans l'élément 0 du tableau    
            $1->{0}:=$1->{$vlSrcElem}
               ` Effacer l'élément glissé
            SUPPRIMER DANS TABLEAU ($1->;$vlSrcElem)
               ` Si l'élément de destination est au-delà de l'élément glissé
            Si ($vlDstElem>$vlSrcElem)
                  ` Décrémenter le numéro de l'élément de destination
               $vlDstElem:=$vlDstElem-1
            Fin de si 
                  ` Si le glisser-déposer s'est produit au-delà du dernier élément    
            Si ($vlDstElem=-1)
                  ` Définir le numéro de l'élément de destination comme un nouvel élément ajouté à la fin du tableau
               $vlDstElem:=Taille tableau ($1->)+1
            Fin de si 
                  ` Insérer ce nouvel élément
            INSERER DANS TABLEAU ($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
         Fin de si 
   Fin de cas 

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

      ` Méthode objet Zone de défilement unTableau

   Au cas ou 
            `...
      : (Evenement formulaire=Sur glisser )
             $0:=Traitement de glisser-déposer interne dans un tableau (Self)
       : (Evenement formulaire=Sur déposer )
         Traitement de glisser-déposer interne dans un tableau (Self))
            `...
   Fin de cas 

(2) 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 )

   Au cas ou
      ` Utilisation de cet événement pour accepter ou refuser le glisser-déposer
      : (Evenement formulaire=Sur glisser)
            ` Initialiser $0 pour le refus
         $0:=-1
            ` Récupérer les informations sur l'objet source du glisser-déposer
         PROPRIETES GLISSER DEPOSER($vpSrcObj;$vlSrcElem;$vlPID)
            ` Dans cet exemple, nous refusons le glisser-déposer d'un objet sur lui-même
         Si ($vpSrcObj#$1)
                  ` Récupérer le type des données glissées
            $vlSrcType:=Type($vpSrcObj->)
            Au cas ou 
               : ($vlSrcType=Est un champ alpha)
                     ` OK pour les champs alphanumériques
                  $0:=0
                     ` Copie immédiate de la valeur dans une variable interprocess
                  <>vtDonnéesGlissées:=$vpSrcObj->
               : ($vlSrcType=Est un texte)
                     ` OK pour les champs ou variables texte
                  $0:=0
                  RESOUDRE POINTEUR($vpSrcObj;$vsVarName;$vlTableNum;$vlFieldNum)
                     ` Si c'est un champ
                  Si (($vlTableNum>0) & ($vlFieldNum>0))
                     ` Copie immédiate de la valeur dans une variable interprocess
                     <>vtDonnéesGlissées:=$vpSrcObj->
                  Fin de si
               : ($vlSrcType=Est une variable chaîne)
                     ` OK pour les variables chaîne
                  $0:=0
               : (($vlSrcType=Est un tableau chaîne) | ($vlSrcType=Est un tableau texte))
                     ` OK pour les tableaux chaîne et texte
                  $0:=0
               : (($vlSrcType=Est un entier long) | ($vlSrcType=Est un numérique))
                  Si (Liste existante($vpSrcObj->))
                     ` OK pour les liste hiérarchiques
                     $0:=0
                  Fin de si
            Fin de cas 
         Fin de si

            ` Utilisation de cet événement pour effectuer réellement l'action de glisser-déposer
      : (Evenement formulaire=Sur déposer)
         $vtDonnéesGlissées:=""
            ` Récupérer les informations sur l'objet source du glisser-déposer
         PROPRIETES GLISSER DEPOSER($vpSrcObj;$vlSrcElem;$vlPID)
         RESOUDRE POINTEUR($vpSrcObj;$vsVarName;$vlTableNum;$vlFieldNum)
            `Si c'est un champ
         Si (($vlTableNum>0) & ($vlFieldNum>0))
               ` Récupérons la variable interprocess créée lors du Sur glisser
            $vtDonnéesGlissées:=<>vtDonnéesGlissées
         Sinon   
               ` Récupérer le type des données glissées
            $vlSrcType:=Type($vpSrcObj->)
            Au cas ou 
                  ` Si c'est un tableau
               : (( $vlSrcType=Tableau chaîne) | ($vlSrcType=Tableau texte))
                  Si ($vlPID#Numero du process courant)
                        ` Lire l'élément depuis l'instance de la variable dans le process source
                     LIRE VARIABLE PROCESS ($vlPID;$vpSrcObj->{$vlSrcElem};$vtDraggedData)
                  Sinon 
                        ` Glisser-déposer depuis le même process, copions juste la valeur        
                     $vtDraggedData:=$vpSrcObj->{$vlSrcElem}
                  Fin de si
                  ` Si c'est une liste
               : (($vlSrcType=Est un numérique ) | ($vlSrcType=Est un entier long ))
                     ` Si c'est une liste en provenance d'un autre  process
                  Si ($vlPID#Numero du process courant)
                        `Récupérer la référence de la liste dans l'autre process
                     LIRE VARIABLE PROCESS ($vlPID;$vpSrcObj->;$vlList)
                  Sinon
                     $vlList:=$vpSrcObj->
                  Fin de si
                     ` Si la liste existe
                  Si (Liste existante($vpSrcObj->))
                        `Récupérer le texte de l'élément dont on a obtenu la position
                     INFORMATION ELEMENT($vlList;$vlSrcElem;$vlItemRef;$vsItemText)
                     $vtDraggedData:=$vsItemText
                  Fin de si 
            Sinon 
                  ` C'est une variable chaîne ou texte
                  Si ($vlPID#Numero du process courant)
                     LIRE VARIABLE PROCESS ($vlPID;$vpSrcObj->;$vtDraggedData)
                  Sinon 
                     $vtDraggedData:=$vpSrcObj->
                  Fin de si 
            Fin de cas 
         Fin de si 
            ` S'il y a effectivement quelque chose à déposer (l'objet source pourrait être vide)
         Si ($vtDraggedData # "")
            ` Vérifions que la longueur de la variable texte ne dépasse pas 32 000 caractères  
            Si ((Longueur($1->)+Longueur($vtDraggedData))<=32000)
               $1->:=$1->+$vtDraggedData
            Sinon 
               BEEP
               ALERTE("Le glisser-déposer ne peut être effectué car il y aurait trop de texte.")
            Fin de si 
         Fin de si   
   Fin de cas 

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

   ` Méthode objet du champ de texte [uneTable]unTexte
   
   Au cas ou 
            ` ...
   : (Evenement formulaire=Sur glisser )
      $0:=Traitement du déposer dans variable texte  (Self)

   : (Evenement formulaire=Sur déposer )
      Traitement du déposer dans variable texte  (Self)
            ` ...

   Fin de cas 

(3) 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 :

   Au cas ou
   :(Evenement formulaire=Sur glisser )
      PROPRIETES GLISSER DEPOSER($source;$lignetab;$numprocess)
      Si ($source=Pointeur vers("list box1"))
         $0:=0   `On accepte le glisser
      Sinon
         $0:=-1 `On refuse le glisser
      Fin de si
   :(Evenement formulaire=Sur déposer )
      PROPRIETES GLISSER DEPOSER($source;$lignetab;$numprocess)
      CHERCHER([Adhérents];[Adhérents]Nom=tNoms{$lignetab})
      Si (Enregistrements trouves([Adhérents])#0)
         etiq1:=[Adhérents]Nom+" "+[Adhérents]Prénom+Caractere(Retour chariot )+[Adhérents]Adresse
                           +Caractere(Retour chariot )+[Adhérents]Code postal+" "+[Adhérents]Ville
      Fin de si 
   Fin de cas 

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

Référence

Evenement formulaire, LIRE VARIABLE PROCESS, Liste existante, Position deposer, Présentation du Glisser-Déposer, RESOUDRE POINTEUR.


4D - Documentation   Français   English   German   Español   4D v11 SQL, Commandes par thèmes   4D v11 SQL, Liste alphabétique des commandes   4D v11 SQL, Constantes par thèmes   Retour   Précédent   Suivant