IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Liste incluse avec 4D View

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… ♪

Article lu   fois.

L'auteur

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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 qu’il 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èches up et down du clavier.

Vous trouverez en annexe une minibase 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.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
` ----------------------------------------------------
` Méthode : View_InitZone
` Description
` La zone view dessinée dans le formulaire est nommé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.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
` ----------------------------------------------------
` 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 trois 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.
 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
` ----------------------------------------------------
` 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 tâche 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.

 
Sélectionnez
1.
2.
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.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
` ----------------------------------------------------
` 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

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
` ----------------------------------------------------
` 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.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
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

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Ce document est issu de https://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.