Developpez.com - 4D
X

Choisissez d'abord la catégorieensuite la rubrique :


Liste incluse avec 4D View

Date de publication : Juillet 2003

Par Bertrand SOUBEYRAND (Développeur Indépendant 4D)
 

Pour afficher des enregistrements liés à une table, les contempteurs des traditionnels formulaires inclus peuvent à présent se réjouir puisqu’il existe, depuis la version 6.8, le plug-in 4D View. Le but de cette note est de vous permettre d’implémenter très rapidement un système d’affichage d’enregistrements liés avec en prime quelques petits raffinements…

I. Avant de commencer
II. Les raisons qui pourraient vous inciter à passer à View
La préparation de la zone
La gestion des événements
Porté du $0 de la méthode d'événement
III. À chaque bonne chose sa conclusion
IV. Base exemple


I. Avant de commencer

Si vous êtes habitué à la programmation d'autres plug-ins de productivité de 4D – pensez à 4D Write – la mise en œuvre de 4D View ne devrait pas vous poser beaucoup de soucis car vous y retrouverez les mêmes modes de pensées que sous 4D Write : propriété de la zone, exécuter des commandes, appeler sur événement, le hors-écran, etc.

Si vous n'êtes pas familier de 4D Write, seul un peu de temps d'acclimatation vous sera demandé.


II. Les raisons qui pourraient vous inciter à passer à View

Nous avons réalisé une liste non exhaustive de ce qui est possible de faire avec 4D View (que le formulaire inclus ne pouvait pas faire) :

   • Sélection de lignes multiples en contiguë ou disjointes ;
   • Redimensionnement des colonnes ;
   • Connaître la colonne cliquée ;
   • Connaître la ligne cliquée ;
   • Changer les polices, les couleurs, les alignements dans chaque cellule et en faire des conditions à traitement ;
   • Trier par colonne ;
   • Glisser déposer ;
   • Nombre de champs sur une ligne infini avec les ascenseurs horizontaux ou l'usage de volets ;
   • Naviguer avec les flèche up et down du clavier.

Vous trouverez en annexe une mini-base exemple. Le code y est présenté de manière simple de façon à avoir un rapide coup d'œil sur l'ensemble des commandes mises en œuvre.


La préparation de la zone

Dans la période de chargement du formulaire, nous fixons l'aspect de la zone view : afin d'imiter les formulaires inclus anciens nous enlevons toutes les palettes de styles, de calcul etc.


   ` ----------------------------------------------------
   ` Méthode : View_InitZone
   ` Description
   ` La zone view dessinée dans le formulaire est nommmée L_ZoneView
   ` Vous la déclarerez comme entier long
   `
   ` Paramètres : [aucun]
   ` ----------------------------------------------------
   ` Auteur : Bertrand SOUBEYRAND <soub@soub.org>
   ` Date et heure : Ven 22 aoû 2003, 16:36
   ` ----------------------------------------------------


   C_POINTEUR($P_PointeLaZone)

   $P_PointeLaZone:=->L_ZoneView

   PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv dialogue enregistrement ;pv valeur faux )
   PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv mode de sélection ;pv sélection ligne unique )
   PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv surbrillance de sélection ;pv valeur vrai )
   PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv trigger de saisie ;pv trigger sur alt clic )
   PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer entêtes lignes ;pv valeur faux )
   PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer entêtes colonnes ;pv valeur vrai )
   PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer barre bordures ;pv valeur faux )
   PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer barre déf hor ;pv valeur faux )
   PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer barre déf vert ;pv valeur vrai )
   PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer barre formules ;pv valeur faux )
   PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer barre menu ;pv valeur faux )
   PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer barre nombres ;pv valeur faux )
   PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer barre standard ;pv valeur faux )
   PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer barre style ;pv valeur faux )
   PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv colonnes redimensionnables ;pv valeur faux )


Vous noterez que la même commande PV FIXER PROPRIETE ZONE est utilisée et que c'est le couple des paramètres 2 et 3 qui déterminera la fonctionnalité.

La constante pv dialogue enregistrement associée à pv valeur faux annule le dialogue de 4D view si la zone est modifiée. Dans la mesure où la zone n'est que le reflet des enregistrements liés, il est inutile de la mémoriser.

La constante pv mode de sélection précise comment vous pourrez sélectionner les lignes dans la zone view. En modifiant la constante associée pv sélection ligne unique vous pourrez aussi, pour des usages particuliers, sélectionner des lignes contiguës (pv sélection lignes contiguës) ou disjointes (pv sélection lignes multiples).

La constante pv trigger de saisie associée à pv trigger sur alt clic indique au programme que pour modifier la zone en liste il faut se positionner sur une cellule et faire un alt clic pour la modifier.

Toujours lors du chargement, nous précisons les colonnes qui doivent figurer dans notre zone liée. Quant aux lignes nous n'en mettons pas car une commande de 4D view PV AJOUTER CHAMPS DYNAMIQUES établira un lien direct entre les enregistrements et la zone.


   ` ----------------------------------------------------
   ` Méthode : View_Init_LigneColonne
   ` Description
   `
   `
   ` Paramètres : [aucun]
   ` ----------------------------------------------------
   ` Auteur : Bertrand SOUBEYRAND <soub@soub.org>
   ` Date et heure : Ven 22 aoû 2003, 16:37
   ` ----------------------------------------------------


   C_POINTEUR($P_PointeLaZone)

   $P_PointeLaZone:=->L_ZoneView

   PV FIXER PROPRIETE DOCUMENT ($P_PointeLaZone->;pv nombre colonnes ;3)
   PV FIXER PROPRIETE DOCUMENT ($P_PointeLaZone->;pv nombre lignes ;0)
   PV FIXER HAUTEUR LIGNES ($P_PointeLaZone->;0;0;15)
   PV FIXER LARGEUR COLONNES ($P_PointeLaZone->;1;1;400)
   PV FIXER LARGEUR COLONNES ($P_PointeLaZone->;2;2;200)
   PV FIXER LARGEUR COLONNES ($P_PointeLaZone->;3;3;100)
   PV FIXER ENTETE COLONNE ($P_PointeLaZone->;1;"Trouvez l'intrus")
   PV FIXER ENTETE COLONNE ($P_PointeLaZone->;2;"Pays")
   PV FIXER ENTETE COLONNE ($P_PointeLaZone->;3;"Code")


Pour finir l'initialisation de 4D View, nous remplissons la zone avec les enregistrements liés. 4D View établit un lien dynamique entre les enregistrements liés et sa zone. Pour ce faire, il utilise 3 tableaux synchronisés. Les tableaux maintiendront pour chaque colonne :

   • Le numéro du champ à insérer ;
   • Le numéro de sa table ;
   • Une éventuelle méthode de calcul sur le champ.

Notez que dans l'exemple, pour la colonne 3 aucun champ n'est inséré par conséquent :

   • La table est mise à zéro
   • Le champ est initialisé en fonction du résultat à recevoir : texte, heure, numérique, etc.
   • Les tableaux sont initialisés avec autant de lignes qu'il y a de colonnes.


   ` ----------------------------------------------------
   ` Méthode : View_Remplissage_Inclus
   ` Description
   `
   `
   ` Paramètres : [aucun]
   ` ----------------------------------------------------
   ` Auteur : Bertrand SOUBEYRAND <soub@soub.org>
   ` Date et heure : Ven 22 aoû 2003, 16:40
   ` ----------------------------------------------------


   C_POINTEUR($P_PointeLaZone)

   $P_PointeLaZone:=->L_ZoneView

   TABLEAU ENTIER($TabTables;3) `N°s des tables
   TABLEAU ENTIER($TabChamps;3) `N°s des champs
   TABLEAU ALPHA(30;$TabMéthodes;3) `Noms des méthodes de rétro-appel

   `Colonne 1 : nom du contact
   $TabTables{1}:=Table(->[Table2])
   $TabChamps{1}:=Champ(->[Table2]Nom)
   $TabMéthodes{1}:=""

   `Colonne 2 : pays du contact
   $TabTables{2}:=Table(->[Table2])
   $TabChamps{2}:=Champ(->[Table2]Pays)
   $TabMéthodes{2}:=""

   `Colonne 3 : zone calculée
   $TabTables{3}:=0
   $TabChamps{3}:=Est un texte
   $TabMéthodes{3}:="FormuleChampPV"
   ` FormuleChampPV est une méthode "callback"qui calcule la valeur des champs de la 3e colonne

   PV AJOUTER CHAMPS DYNAMIQUES ($P_PointeLaZone->;Table(->[Table2]);$TabTables;$TabChamps;$TabMéthodes)


Pour que la commande PV AJOUTER CHAMPS DYNAMIQUES fonctionne il faudra que vous ayez créé une sélection dans la table liée.

Pictures 0596x0314
Voici à quoi ressemble notre zone view.

La gestion des événements

Notre zone view serait bien triste si nous la laissions en l'état. Nous allons l'enrichir des fonctionnalités de tri et d'ajout des enregistrements.

Avant toute chose, il nous faut installer une méthode de gestion des événements PV APPELER SUR EVENEMENT qui nous renseignera sur la façon de cliquer de l'usager de la base.

Un PV APPELER SUR EVENEMENT est une commande qui installe un process en tache de fond et qui va détecter… l'événement. Elle peut être installée avant d'appeler le formulaire ou lors de l'ouverture de la base. Dans notre cas, nous souhaitons intercepter le double clic ou le clic sur la zone et celui-ci sera traité par la méthode evt.

À l'heure où ces lignes sont écrites il était difficile d'associer deux événements à une méthode car la première "cannibalise" la seconde. Mais gageons que sous peu cela soit possible et que nous pourrons fusionner le code de evt et evt2.

   PV APPELER SUR EVENEMENT ($P_PointeLaZone->;pv sur double clic;"evt")
   PV APPELER SUR EVENEMENT ($P_PointeLaZone->;pv sur clic;"evt2")

Une méthode de gestion d'événement reçoit toujours 6 paramètres et retourne un $0. La documentation de 4D View insiste bien sur le fait que tous les paramètres doivent être déclarés même si certains ne sont pas utilisés. Ne pas le faire vous expose à des problèmes en utilisation compilée.

Chaque paramètre reçoit des informations qui nous renseignent sur la manière de cliquer de l'utilisateur. À nous de les traiter en conséquence. Le $0 sera mis à Vrai ou à Faux.


Porté du $0 de la méthode d'événement

La méthode d'événement est prioritaire sur le reste. En y mettant $0 à Vrai, la portée de vos clics serait limitée à cette méthode. En revanche en mettant $0 à Faux, si dans votre base vous avez à analyser en plusieurs endroits des clics et des touches enfoncées, ceux-ci seront encore analysés. $0 est un feu vert ou un feu rouge pour clic souris.


   ` ----------------------------------------------------
   ` Méthode : evt
   ` Description
   ` evt : Double clic pour ajouter ou ouvrir une fiche
   `
   ` Paramètres :
   ` $1 : Référence de la zone 4D Vie
   ` $2 : Événement
   ` $3 : Code de touche de modificat
   ` $4 : Numéro de la colonne(*)
   ` $5 : Numéro de la ligne(**)
   ` $6 : Code ASCII de la touche(si l'événement est un clic,
   ` un clic droit ou un double-clic,$6 vaut 0)
   ` ----------------------------------------------------
   ` Auteur : Bertrand SOUBEYRAND <soub@soub.org>
   ` Date et heure : Jeu 21 aoû 2003, 22:17
   ` ----------------------------------------------------

   C_ENTIER LONG($1;$2;$3;$4;$5;$6)
   C_BOOLEEN($0)
   C_ENTIER($numTable;$numChamp;$I_Ergt)
   C_ENTIER($I_Gauche;$I_Haut;$I_Droit;$I_Bas)
   C_ENTIER LONG($L_LaZone;$L_Colonne;$L_Ligne)

   $L_LaZone:=$1
   $L_Evenement:=$2
   $L_modifier:=$3
   $L_Colonne:=$4
   $L_Ligne:=$5

   $0:=Faux  `Filtrer l'événement

   Au cas ou
      : ($5=0) `Si le clic a eu lieu dans un en-tête
         Au cas ou
            : ($2=pv sur double clic ) `ajout d'une fiche
               NOMMER ENSEMBLE([Table2];"temp")
               AJOUTER ENREGISTREMENT([Table2])
               ADJOINDRE ELEMENT([Table2];"temp")
               UTILISER ENSEMBLE("temp")
               ALLER DANS SELECTION([Table2];Enregistrements trouves([Table2]))
         Fin de cas
         PV MISE A JOUR ZONE DYNAMIQUE ($L_LaZone)

         $I_Gauche:=1 `colonne de gauche
         $I_Haut:=Enregistrements trouves([Table2])
         $I_Droit:=3 `on a 3 colonnes
         $I_Bas:=Enregistrements trouves([Table2])
         PV SELECTIONNER PLAGE ($L_LaZone;$I_Gauche;$I_Haut;$I_Droit;$I_Bas;pv sélection définir )

      : ($5>0) `Si le clic a eu lieu sur une ligne
         PV LIRE CHAMP CELLULE ($L_LaZone;$L_Colonne;1;$numTable;$numChamp)
         TABLEAU ENTIER LONG($rL_temp;0)
         TABLEAU ENTIER LONG SUR SELECTION(Table($numTable)->;$rL_temp)
         ALLER DANS SELECTION(Table($numTable)->;$L_Ligne)
         MODIFIER ENREGISTREMENT(Table($numTable)->)
         CREER SELECTION SUR TABLEAU(Table($numTable)->;$rL_temp)
         TABLEAU ENTIER LONG($rL_temp;0)
         PV MISE A JOUR ZONE DYNAMIQUE ($L_LaZone)

   Fin de cas


evt2 : gère le clic pour trier la table liée


   ` ----------------------------------------------------
   ` Méthode : evt2
   ` Description
   `
   `
   ` Paramètres :
   ` $1 : Référence de la zone 4D View
   ` $2 : Événement
   ` $3 : Code de touche de modification
   ` $4 : Numéro de la colonne(*)
   ` $5 : Numéro de la ligne(**)
   ` $6 : Code ASCII de la touche(si l'événement est un clic, un clic droit ou un double-clic,$6 vaut 0)
   ` ----------------------------------------------------
   ` Auteur : Bertrand SOUBEYRAND <soub@soub.org>
   ` Date et heure : Jeu 21 aoû 2003, 22:17
   ` ----------------------------------------------------


   C_ENTIER LONG($1;$2;$3;$4;$5;$6)
   C_BOOLEEN($0)
   C_ENTIER($numTable;$numChamp;$I_Ergt)
   C_ENTIER($I_Gauche;$I_Haut;$I_Droit;$I_Bas)
   C_ENTIER LONG($L_LaZone;$L_Colonne;$L_Ligne)

   $L_LaZone:=$1
   $L_Evenement:=$2
   $L_modifier:=$3
   $L_Colonne:=$4
   $L_Ligne:=$5

   Au cas ou
      : ($5=0) `Si le clic a eu lieu dans un en-tête
         $0:=Faux  `Filtrer l'événement
         Au cas ou
            : ($2=pv sur clic ) ` trier
               Si ($L_Colonne=3) `clic sur la 3e colonne
                  ALERTE("Cette colonne calculée n'est pas un Champ triable")
               Sinon
                  PV LIRE CHAMP CELLULE ($L_LaZone;$L_Colonne;1;$numTable;$numChamp)
                  Si ($L_Colonne#3)
                     View_couleurColonne ($L_Colonne)
                  Fin de si
                  Au cas ou
                     : ($3=0) ` aucun modifiers
                        TRIER(Table($NumTable)->;Champ($numTable;$numChamp)-<;<) `Tri des données 4D
                     : ($3=512) ` majuscule enfoncée
                        TRIER(Table($NumTable)->;Champ($numTable;$numChamp)-<;<) `Tri des données 4D
                  Fin de cas
               Fin de si
         Fin de cas
         PV MISE A JOUR ZONE DYNAMIQUE ($L_LaZone)

         $I_Gauche:=1
         $I_Haut:=Enregistrements trouves([Table2])
         $I_Droit:=3
         $I_Bas:=Enregistrements trouves([Table2])
         PV SELECTIONNER PLAGE ($L_LaZone;$I_Gauche;$I_Haut;$I_Droit;$I_Bas;pv sélection définir )

   Fin de cas


Dans notre méthode de tri nous ajoutons un cadeau "Bonux" (au vu de ce qui est faisable en standard à ce jour) : View_couleurColonne ($L_Colonne) qui modifiera la couleur de la colonne qui est triée.

$1 est la colonne dont on souhaite changer la couleur. Nous comptons le nombre de colonnes et de lignes, nous prenons une des 256 couleurs indexées de la palette 4D que nous convertissons en couleur RVB et selon la colonne qui est traitée dans la boucle nous la passons en gris ou en blanc.


   C_ENTIER($1)

   $P_PointeLaZone:=->L_ZoneView
   $I_CountLignes:=PV Lire propriete document ($P_PointeLaZone->;pv nombre lignes )
   $I_CountColonnes:=PV Lire propriete document ($P_PointeLaZone->;pv nombre colonnes )

   $I_Colonne2couleur:=$1
   $I_Gris:=PV Index vers couleur ((15*16)+3)
   $I_White:=PV Index vers couleur (1)

   Boucle ($k;1;$I_CountColonnes)
      Au cas ou
         : ($k=$I_Colonne2couleur)

            Boucle ($i;1;$I_CountLignes)
               PV FIXER PROPRIETE CELLULE ($P_PointeLaZone->;$k;$i;pv style couleur fond impair ;$I_Gris)
               PV FIXER PROPRIETE CELLULE ($P_PointeLaZone->;$k;$i;pv style couleur fond pair ;$I_Gris)
            Fin de boucle

         Sinon

            Boucle ($i;1;$I_CountLignes)
               PV FIXER PROPRIETE CELLULE ($P_PointeLaZone->;$k;$i;pv style couleur fond impair ;$I_White)
               PV FIXER PROPRIETE CELLULE ($P_PointeLaZone->;$k;$i;pv style couleur fond pair ;$I_White)
            Fin de boucle

      Fin de cas
   Fin de boucle

   PV REDESSINER ($P_PointeLaZone->)


Comme vous l'aurez remarqué dans l'interface, des boutons supplémentaires à cette démonstration vous indiquent comment :

   • Modifier à la volée la hauteur des lignes de la zone : globalement ou sélectivement ;
   • Masquer ou montrer la grille de la zone View ;
   • Naviguer à l'aide des flèches up et down de votre clavier.


III. À chaque bonne chose sa conclusion

Comme vous le voyez, utiliser 4D View n'est pas vraiment difficile à programmer et le bénéfice de l'opération est l'apport de nombre de fonctionnalités qui vont vite vous faire penser que ces bons vieux formulaires inclus arrivent en fin de parcours.


IV. Base exemple

Téléchargez la base exemple :

Base pour Windows

Base pour Mac OS

__________________________________________________
Copyright © 1985-2009 4D SA - Tous droits réservés
Tous les efforts ont été faits pour que le contenu de cette note technique présente le maximum de fiabilité possible.
Néanmoins, les différents éléments composant cette note technique, et le cas échéant, le code, sont fournis sans garantie d'aucune sorte. L'auteur et 4D S.A. déclinent donc toute responsabilité quant à l'utilisation qui pourrait être faite de ces éléments, tant à l'égard de leurs utilisateurs que des tiers.
Les informations contenues dans ce document peuvent faire l'objet de modifications sans préavis et ne sauraient en aucune manière engager 4D SA. La fourniture du logiciel décrit dans ce document est régie par un octroi de licence dont les termes sont précisés par ailleurs dans la licence électronique figurant sur le support du Logiciel et de la Documentation afférente. Le logiciel et sa documentation ne peuvent être utilisés, copiés ou reproduits sur quelque support que ce soit et de quelque manière que ce soit, que conformément aux termes de cette licence.
Aucune partie de ce document ne peut être reproduite ou recopiée de quelque manière que ce soit, électronique ou mécanique, y compris par photocopie, enregistrement, archivage ou tout autre procédé de stockage, de traitement et de récupération d'informations, pour d'autres buts que l'usage personnel de l'acheteur, et ce exclusivement aux conditions contractuelles, sans la permission explicite de 4D SA.
4D, 4D Calc, 4D Draw, 4D Write, 4D Insider, 4ème Dimension ®, 4D Server, 4D Compiler ainsi que les logos 4e Dimension, sont des marques enregistrées de 4D SA.
Windows,Windows NT,Win 32s et Microsoft sont des marques enregistrées de Microsoft Corporation.
Apple, Macintosh, Power Macintosh, LaserWriter, ImageWriter, QuickTime sont des marques enregistrées ou des noms commerciaux de Apple Computer,Inc.
Mac2Win Software Copyright © 1990-2002 est un produit de Altura Software,Inc.
4D Write contient des éléments de "MacLink Plus file translation", un produit de DataViz, Inc,55 Corporate drive,Trumbull,CT,USA.
XTND Copyright 1992-2002 © 4D SA. Tous droits réservés.
XTND Technology Copyright 1989-2002 © Claris Corporation.. Tous droits réservés ACROBAT © Copyright 1987-2002, Secret Commercial Adobe Systems Inc.Tous droits réservés. ACROBAT est une marque enregistrée d'Adobe Systems Inc.
Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.
__________________________________________________
 



Valid XHTML 1.1!Valid CSS!

Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.
Contacter le responsable de la rubrique 4D