Liste incluse avec 4D View

Bertrand SOUBEYRAND

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

- Titre : Liste incluse avec 4D View

- Auteur : Bertrand SOUBEYRAND

- Parution : 1 juillet 2003

- Licence : 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.

Sommaire

- 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 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.

1. ` ----------------------------------------------------

2. ` Méthode : View_InitZone

3. ` Description

4. ` La zone view dessinée dans le formulaire est nommée L_ZoneView

5. ` Vous la déclarerez comme entier long

6. `

7. ` Paramètres : [aucun]

8. ` ----------------------------------------------------

9. ` Auteur : Bertrand SOUBEYRAND <soub@soub.org>

10. ` Date et heure : Ven 22 aoû 2003, 16:36

11. ` ----------------------------------------------------

13. C_POINTEUR($P_PointeLaZone)

15. $P_PointeLaZone:=->L_ZoneView

17. PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv dialogue enregistrement ;pv valeur faux )

18. PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv mode de sélection ;pv sélection ligne unique )

19. PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv surbrillance de sélection ;pv valeur vrai )

20. PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv trigger de saisie ;pv trigger sur alt clic )

21. PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer entêtes lignes ;pv valeur faux )

22. PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer entêtes colonnes ;pv valeur vrai )

23. PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer barre bordures ;pv valeur faux )

24. PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer barre déf hor ;pv valeur faux )

25. PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer barre déf vert ;pv valeur vrai )

26. PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer barre formules ;pv valeur faux )

27. PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer barre menu ;pv valeur faux )

28. PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer barre nombres ;pv valeur faux )

29. PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer barre standard ;pv valeur faux )

30. PV FIXER PROPRIETE ZONE ($P_PointeLaZone->;pv montrer barre style ;pv valeur faux )

31. 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.

1. ` ----------------------------------------------------

2. ` Méthode : View_Init_LigneColonne

3. ` Description

4. `

5. `

6. ` Paramètres : [aucun]

7. ` ----------------------------------------------------

8. ` Auteur : Bertrand SOUBEYRAND <soub@soub.org>

9. ` Date et heure : Ven 22 aoû 2003, 16:37

10. ` ----------------------------------------------------

12. C_POINTEUR($P_PointeLaZone)

14. $P_PointeLaZone:=->L_ZoneView

16. PV FIXER PROPRIETE DOCUMENT ($P_PointeLaZone->;pv nombre colonnes ;3)

17. PV FIXER PROPRIETE DOCUMENT ($P_PointeLaZone->;pv nombre lignes ;0)

18. PV FIXER HAUTEUR LIGNES ($P_PointeLaZone->;0;0;15)

19. PV FIXER LARGEUR COLONNES ($P_PointeLaZone->;1;1;400)

20. PV FIXER LARGEUR COLONNES ($P_PointeLaZone->;2;2;200)

21. PV FIXER LARGEUR COLONNES ($P_PointeLaZone->;3;3;100)

22. PV FIXER ENTETE COLONNE ($P_PointeLaZone->;1;"Trouvez l'intrus")

23. PV FIXER ENTETE COLONNE ($P_PointeLaZone->;2;"Pays")

24. 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.

1. ` ----------------------------------------------------

2. ` Méthode : View_Remplissage_Inclus

3. ` Description

4. `

5. `

6. ` Paramètres : [aucun]

7. ` ----------------------------------------------------

8. ` Auteur : Bertrand SOUBEYRAND <soub@soub.org>

9. ` Date et heure : Ven 22 aoû 2003, 16:40

10. ` ----------------------------------------------------

12. C_POINTEUR($P_PointeLaZone)

14. $P_PointeLaZone:=->L_ZoneView

16. TABLEAU ENTIER($TabTables;3) `N°s des tables

17. TABLEAU ENTIER($TabChamps;3) `N°s des champs

18. TABLEAU ALPHA(30;$TabMéthodes;3) `Noms des méthodes de rétro-appel

20. `Colonne 1 : nom du contact

21. $TabTables{1}:=Table(->[Table2])

22. $TabChamps{1}:=Champ(->[Table2]Nom)

23. $TabMéthodes{1}:=""

25. `Colonne 2 : pays du contact

26. $TabTables{2}:=Table(->[Table2])

27. $TabChamps{2}:=Champ(->[Table2]Pays)

28. $TabMéthodes{2}:=""

30. `Colonne 3 : zone calculée

31. $TabTables{3}:=0

32. $TabChamps{3}:=Est un texte

33. $TabMéthodes{3}:="FormuleChampPV"

34. ` FormuleChampPV est une méthode "callback"qui calcule la valeur des champs de la 3e colonne

36. 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.

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.

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

2. 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.

1. ` ----------------------------------------------------

2. ` Méthode : evt

3. ` Description

4. ` evt : Double clic pour ajouter ou ouvrir une fiche

5. `

6. ` Paramètres :

7. ` $1 : Référence de la zone 4D Vie

8. ` $2 : Événement

9. ` $3 : Code de touche de modificat

10. ` $4 : Numéro de la colonne(*)

11. ` $5 : Numéro de la ligne(**)

12. ` $6 : Code ASCII de la touche(si l'événement est un clic,

13. ` un clic droit ou un double clic,$6 vaut 0)

14. ` ----------------------------------------------------

15. ` Auteur : Bertrand SOUBEYRAND <soub@soub.org>

16. ` Date et heure : Jeu 21 aoû 2003, 22:17

17. ` ----------------------------------------------------

19. C_ENTIER LONG($1;$2;$3;$4;$5;$6)

20. C_BOOLEEN($0)

21. C_ENTIER($numTable;$numChamp;$I_Ergt)

22. C_ENTIER($I_Gauche;$I_Haut;$I_Droit;$I_Bas)

23. C_ENTIER LONG($L_LaZone;$L_Colonne;$L_Ligne)

25. $L_LaZone:=$1

26. $L_Evenement:=$2

27. $L_modifier:=$3

28. $L_Colonne:=$4

29. $L_Ligne:=$5

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

33. Au cas ou

34. : ($5=0) `Si le clic a eu lieu dans un en-tête

35. Au cas ou

36. : ($2=pv sur double clic ) `ajout d'une fiche

37. NOMMER ENSEMBLE([Table2];"temp")

38. AJOUTER ENREGISTREMENT([Table2])

39. ADJOINDRE ELEMENT([Table2];"temp")

40. UTILISER ENSEMBLE("temp")

41. ALLER DANS SELECTION([Table2];Enregistrements trouves([Table2]))

42. Fin de cas

44. PV MISE A JOUR ZONE DYNAMIQUE ($L_LaZone)

46. $I_Gauche:=1 `colonne de gauche

47. $I_Haut:=Enregistrements trouves([Table2])

48. $I_Droit:=3 `on a 3 colonnes

49. $I_Bas:=Enregistrements trouves([Table2])

50. PV SELECTIONNER PLAGE ($L_LaZone;$I_Gauche;$I_Haut;$I_Droit;$I_Bas;pv sélection définir )

52. : ($5>0) `Si le clic a eu lieu sur une ligne

53. PV LIRE CHAMP CELLULE ($L_LaZone;$L_Colonne;1;$numTable;$numChamp)

54. TABLEAU ENTIER LONG($rL_temp;0)

55. TABLEAU ENTIER LONG SUR SELECTION(Table($numTable)->;$rL_temp)

56. ALLER DANS SELECTION(Table($numTable)->;$L_Ligne)

57. MODIFIER ENREGISTREMENT(Table($numTable)->)

58. CREER SELECTION SUR TABLEAU(Table($numTable)->;$rL_temp)

59. TABLEAU ENTIER LONG($rL_temp;0)

60. PV MISE A JOUR ZONE DYNAMIQUE ($L_LaZone)

62. Fin de cas

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

1. ` ----------------------------------------------------

2. ` Méthode : evt2

3. ` Description

4. `

5. `

6. ` Paramètres :

7. ` $1 : Référence de la zone 4D View

8. ` $2 : Événement

9. ` $3 : Code de touche de modification

10. ` $4 : Numéro de la colonne(*)

11. ` $5 : Numéro de la ligne(**)

12. ` $6 : Code ASCII de la touche(si l'événement est un clic, un clic droit ou un double clic,$6 vaut 0)

13. ` ----------------------------------------------------

14. ` Auteur : Bertrand SOUBEYRAND <soub@soub.org>

15. ` Date et heure : Jeu 21 aoû 2003, 22:17

16. ` ----------------------------------------------------

18. C_ENTIER LONG($1;$2;$3;$4;$5;$6)

19. C_BOOLEEN($0)

20. C_ENTIER($numTable;$numChamp;$I_Ergt)

21. C_ENTIER($I_Gauche;$I_Haut;$I_Droit;$I_Bas)

22. C_ENTIER LONG($L_LaZone;$L_Colonne;$L_Ligne)

24. $L_LaZone:=$1

25. $L_Evenement:=$2

26. $L_modifier:=$3

27. $L_Colonne:=$4

28. $L_Ligne:=$5

30. Au cas ou

31. : ($5=0) `Si le clic a eu lieu dans un en-tête

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

33. Au cas ou

34. : ($2=pv sur clic ) ` trier

35. Si ($L_Colonne=3) `clic sur la 3e colonne

36. ALERTE("Cette colonne calculée n'est pas un Champ triable")

37. Sinon

38. PV LIRE CHAMP CELLULE ($L_LaZone;$L_Colonne;1;$numTable;$numChamp)

39. Si ($L_Colonne#3)

40. View_couleurColonne ($L_Colonne)

41. Fin de si

42. Au cas ou

43. : ($3=0) ` aucun modifiers

44. TRIER(Table($NumTable)->;Champ($numTable;$numChamp)-<;<) `Tri des données 4D

45. : ($3=512) ` majuscule enfoncée

46. TRIER(Table($NumTable)->;Champ($numTable;$numChamp)-<;<) `Tri des données 4D

47. Fin de cas

48. Fin de si

49. Fin de cas

50. PV MISE A JOUR ZONE DYNAMIQUE ($L_LaZone)

52. $I_Gauche:=1

53. $I_Haut:=Enregistrements trouves([Table2])

54. $I_Droit:=3

55. $I_Bas:=Enregistrements trouves([Table2])

56. PV SELECTIONNER PLAGE ($L_LaZone;$I_Gauche;$I_Haut;$I_Droit;$I_Bas;pv sélection définir )

58. 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.

1. C_ENTIER($1)

3. $P_PointeLaZone:=->L_ZoneView

4. $I_CountLignes:=PV Lire propriete document ($P_PointeLaZone->;pv nombre lignes )

5. $I_CountColonnes:=PV Lire propriete document ($P_PointeLaZone->;pv nombre colonnes )

7. $I_Colonne2couleur:=$1

8. $I_Gris:=PV Index vers couleur ((15*16)+3)

9. $I_White:=PV Index vers couleur (1)

11. Boucle ($k;1;$I_CountColonnes)

12. Au cas ou

13. : ($k=$I_Colonne2couleur)

15. Boucle ($i;1;$I_CountLignes)

16. PV FIXER PROPRIETE CELLULE ($P_PointeLaZone->;$k;$i;pv style couleur fond impair ;$I_Gris)

17. PV FIXER PROPRIETE CELLULE ($P_PointeLaZone->;$k;$i;pv style couleur fond pair ;$I_Gris)

18. Fin de boucle

20. Sinon

22. Boucle ($i;1;$I_CountLignes)

23. PV FIXER PROPRIETE CELLULE ($P_PointeLaZone->;$k;$i;pv style couleur fond impair ;$I_White)

24. PV FIXER PROPRIETE CELLULE ($P_PointeLaZone->;$k;$i;pv style couleur fond pair ;$I_White)

25. Fin de boucle

27. Fin de cas

28. Fin de boucle

30. 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