Code source de l'éditeur d'États Rapides - Partie 2 (4D 2004)

Olivier DESCHANELS

Cette note est la seconde partie d'une note technique commencée au mois d'août, vous fournissant le code source de l'Editeur d'États Rapides de 4D. ♪

- Titre : Code source de l'éditeur d'États Rapides - Partie 2 (4D 2004)

- Auteur : Olivier DESCHANELS

- Parution : 1 septembre 2004

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

- II. Appel de l’assistant de création de rapport

- III. Gestion des pages de l’assistant

- IV. Étape du choix du type d’état

- V. Étape de choix de la table

- VI. Étape du choix des champs (rapport en liste)

- VII. Étape du choix des champs (tableau croisé)

- VIII. Étapes du choix des tris

- IX. Étape de définition des opérations (rapport en liste)

- X. Étape de définition des opérations (tableau croisé)

- XI. Étape de choix de la sortie

- XII. Étape de choix d’une présentation (tableau croisé)

- XIII. Étape de choix d’une présentation (rapport en liste)

- XIV. Étape de finalisation

- XV. Comment aller plus loin ?

- XVI. Base exemple

I - Introduction

Les états rapides ont été révisés pour la version 2003 avec notamment un assistant permettant de créer plus aisément et rapidement les états désirés.

Cet assistant est entièrement réalisé grâce à 4e Dimension, vous pouvez donc réaliser par vous-même un assistant similaire. Cependant, comme cet assistant nécessite un certain travail nous avons décidé de vous donner dans la présente note technique le code source. Vous pourrez donc l'intégrer dans vos bases et y apporter les modifications souhaitées. Ce code source est en 4D 2004.

Vous trouverez ci-dessous la seconde partie de cette note technique, commencée au mois d'août.

II - Appel de l’assistant de création de rapport

Si la variable nqr_wirzard est forcée à 1 lors de l'ouverture du dialogue, alors le bouton « Assistant » est présent dans l'interface. Cette visibilité est contrôlée par la ligne :

1. CHOIX VISIBLE(*;"wizard@";(nqr_wizard=1))

Nous utilisons ici l'arobase, car il y a en fait trois objets : une image, un texte et un bouton. Cette syntaxe permet de contrôler les trois objets conjointement.

Comme nous l'avons déjà vu dans la première partie de la note technique, le bouton appelle la méthode NQR_MP_Etape_Init. Celle-ci, au-delà du repositionnement de la zone nqr_area réalise l'initialisation d'une série de variables qui seront nécessaires par la suite lors de l'utilisation de l'assistant.

La méthode continue son travail de préparation en masquant tous les objets d'interface propres à la zone de l'éditeur d'état tels que la barre de menu, les palettes … C'est l'objet de ce code :

1. `initialisation des propriétés de la zone

2. Boucle ($view;1;7)

3. QR FIXER PROPRIETE ZONE(nqr_area;$view;0)

4. Fin de boucle

Un code symétrique avec une valeur de propriété passée à 1 est présent dans la méthode objet du bouton nqr_b_editeur permettant le retour au mode manuel.

L'initialisation de l'assistant se poursuit avec la mise à zéro de la sélection au sein de l'éditeur :

1. `plus de sélection

2. QR FIXER SELECTION(nqr_area;-1;-1;-1;-1)

Enfin, la méthode NQR_MP_Etape_Suivante est appelée pour passer à la première page de l'assistant.

III - Gestion des pages de l’assistant

Pour contrôler le passage de page en page, l'assistant mémorise des informations dans deux variables principales : nqr_etape_courante et nqr_etape_maximum.

nqr_etape_courante, initialisée à zéro, mémorise l'étape de l'assistant en cours d'affichage. À chaque étape correspondent une ou plusieurs pages : mais celles-ci ne sont pas toujours les mêmes en fonction du contexte, notamment le type de rapport ou de destination. La valeur de cette variable varie, lors de l'utilisation de l'assistant, entre 1 et 10 au maximum. Cependant la variable nqr_etape_maximum sert de frontière haute. En effet les étapes de l'assistant doivent être parcourues dans l'ordre ; il est possible de revenir en arrière puis de repartir sur une étape ultérieure, mais jamais au-delà de l'étape la plus avancée déjà visitée. De plus, dans certains cas, un retour en arrière avec un changement de valeur d'un choix provoque une annulation de toutes les étapes ultérieures qu'il faut alors parcourir à nouveau. Tout ceci est contrôlé grâce à la valeur mémorisée dans nqr_etape_maximum.

Voici une copie du bandeau de navigation que nous trouvons en page zéro du formulaire principal :

Ce bandeau est constitué de :

- deux boutons nqr_b_Etape_Precedente et nqr_b_Etape_Suivante permettant le passage aux étapes voisines. Ce sont des boutons image ;

- dix boutons image nqr_bttn1 à nqr_bttn10 constituant le fond des 10 boutons d'étapes disponibles ;

- dix variables nqr_etape_1 à nqr_etape_10 qui serviront à l'affichage des numéros et noms des étapes.

Tous ces objets ont une méthode objet associée.

Le bouton nqr_b_Etape_Précédente appelle la méthode NQR_MP_Etape_Precedente que voici :

1. `on recule de deux étapes

3. nqr_etape_courante:=nqr_etape_courante-2

4. Si (nqr_etape_courante=-1)

5. nqr_etape_courante:=0

6. Fin de si

7. `pour réavancer d'une : on recule donc d'une seule étape !

8. NQR_MP_Etape_Suivante

Le bouton nqr_bttn1 ou la variable nqr_etape_1 appellent tous les deux la ligne de code suivante :

1. NQR_MP_Etape (1)

Voici le code exécuté alors :

1. C_ENTIER($1;$etape_cible)

3. $etape_cible:=$1

4. Au cas ou

6. : (Page formulaire courante=1)   `ou cas improbable ou il y a une erreur de page !

7. : ($etape_cible=nqr_etape_courante)   `rien à faire dans ce cas

8. : ($etape_cible>nqr_etape_maximum)   `ce n'est pas autoriser, ne rien faire (cas improbable en principe)

9. : (Non(nqr_etape_suivante_ok)) & ($etape_cible>nqr_etape_courante)

10. `le passage à l'étape suivante n'est pas autorisé

11. BEEP

12. Sinon

13. `on passe à l'étape ciblée

14. nqr_etape_courante:=$etape_cible-1

15. NQR_MP_Etape_Suivante

17. Fin de cas

Toutes ces méthodes appellent la même méthode NQR_MP_Etape_Suivante. Celle-ci est le lieu principal de navigation entre les étapes.

Nous commençons par y définir les variables principales :

1. ` passer à l'étape suivante

3. nqr_etape_courante:=nqr_etape_courante+1

4. `nous ne sommes pas à priori dans la dernière étape

5. nqr_derniere_etape:=Faux

6. `a priori nous pouvons passer à l'étape suivante

7. nqr_etape_suivante_ok:=Vrai

8. `maj de la valeur maximum

9. Si (nqr_etape_maximum<nqr_etape_courante)

10. nqr_etape_maximum:=nqr_etape_courante

11. Fin de si

Puis nous activons les boutons de navigation :

1. `activation des boutons de navigation

3. ACTIVER BOUTON(nqr_b_Etape_Suivante)

5. ACTIVER BOUTON(nqr_b_Etape_Precedente)

En fin de méthode, la mise à jour de l'interface est réalisée via le code suivant :

1. `définition du titre

3. nqr_etape_titre:=Lire chaine dans liste(14907;21)+" "+Chaine(nqr_etape_courante)+" : "+nqr_etape_titre

4. `masquer tous les boutons

5. CHOIX VISIBLE(*;"bttn@";Faux)

6. `afficher les boutons autorisés

7. Boucle ($i;1;nqr_etape_maximum;1)

8. CHOIX COULEUR(*;"etape_"+Chaine($i);-250)   `gris foncé

9. CHOIX VISIBLE(*;"bttn"+Chaine($i);Vrai)

10. Pointeur vers("nqr_bttn"+Chaine($i))->:=0

11. Fin de boucle

12. `colorier l'étape courante en fonction de l'état

13. Si (nqr_etape_suivante_ok)

14. CHOIX COULEUR(*;"etape_"+Chaine(nqr_etape_courante);-Noir )

15. Sinon

16. CHOIX COULEUR(*;"etape_"+Chaine(nqr_etape_courante);-Gris )

17. Fin de si

18. `activer tous les boutons

19. ACTIVER BOUTON(*;"bttn@")

20. `sauf celui de l'étape courante

21. INACTIVER BOUTON(*;"bttn"+Chaine(nqr_etape_courante))

22. Pointeur vers("nqr_bttn"+Chaine(nqr_etape_courante))->:=1

23. `gestion de la dernière étape

24. Si (nqr_derniere_etape) | Non(nqr_etape_suivante_ok)

25. INACTIVER BOUTON(nqr_b_Etape_Suivante)

26. Sinon

27. ACTIVER BOUTON(nqr_b_Etape_Suivante)

28. Fin de si

Mais entre-temps la gestion du passage à l'étape suivante est réalisée via une grande double structure « Au cas ou ».

La première structure permet de déterminer si nous sommes dans le cas d'un rapport en liste ou d'un tableau croisé :

1. Au cas ou

3. : (nqr_tr_1=1)   `rapport en liste

4. ...

5. : (nqr_tr_2=1)   `tableau croisé

6. ...

8. Fin de cas

La seconde structure gère, en fonction de l'étape courante, le changement de page adéquate. Par exemple pour l'étape 1 voici le code exécuté :

1. : (nqr_etape_courante=1)

3. nqr_etape_1:="1 - "+Lire chaine dans liste(14907;24)   `"Type de rapport"

4. nqr_etape_titre:=Lire chaine dans liste(14907;22)   `"choix du type de rapport"

5. ALLER A PAGE(2)

6. `pour l'etape 1, il n'y a pas d'étape précédente

7. INACTIVER BOUTON(nqr_b_Etape_Precedente)

8. nqr_explication_1:=Lire ressource texte(14907)

9. nqr_explication_2:=Lire ressource texte(14908)

11. nqr_explication_3:=Lire ressource texte(14909)

Ce code passe à la page 2 et définit les valeurs des variables de l'interface. La page 2 est la première page de l'assistant de création d'états.

Pour la deuxième étape, il y a une précaution à prendre. En effet, cela peut être soit la définition de la table soit la gestion des sources de données. Ce choix dépend de la variable nqr_recherche qui vaut 1 si le choix de la table est laissé à l'utilisateur et 0 sinon.

La structure retenue est donc :

1. Au cas ou

3. : (nqr_etape_courante=1)

4. ...

5. : (nqr_etape_courante=(1+nqr_recherche))

6. ...

7. : (nqr_etape_courante=(2+nqr_recherche))

8. ...

9. ...

11. Fin de cas

Ainsi si nqr_recherche vaut 1, tous les cas de la structure seront adressables. Sinon, pour le deuxième cas, la condition sera identique au premier cas et ce deuxième cas ne sera donc jamais appelé. En effet dans une structure « Au cas où », dès qu'une condition est vérifiée, toutes les autres conditions sont ignorées.

Le code suivant permet d'autoriser l'étape en fonction de la destination de l'état :

1. : (nqr_etape_courante=(6+nqr_recherche)) & ((nqr_sc_1=1) | (nqr_sc_5=1))

Les variables nqr_sc_1 à nqr_sc_5 définissent la destination finale de l'état.

Pour de nombreuses étapes, des méthodes complémentaires sont appelées en vue de la mise à jour complète de l'interface.

IV - Étape du choix du type d’état

Maintenant que la navigation entre les étapes est codée, nous allons étudier les différentes étapes intéressantes en commençant par la première : le choix du type de rapport.

Nous avons ici le choix entre deux types : le rapport en liste et le tableau croisé. Deux boutons image sont à disposition pour effectuer la sélection : nqr_tr_1 pour le rapport en liste et nqr_tr_2 pour le tableau croisé. Ces deux boutons sont positionnés en page 2 et contiennent deux méthodes objet symétriques. Voici celle du bouton pour le rapport en liste :

1. C_ENTIER LONG($evt)

2. C_ENTIER LONG($i)

4. $evt:=Evenement formulaire

5. nqr_tr_1:=1

6. nqr_tr_2:=0

8. Au cas ou

9. : ($evt=Sur clic )

10. $etat_courant:=QR Lire type etat(nqr_area)

11. Si ($etat_courant#1)

12. nqr_etape_maximum:=1

13. Boucle ($i;nqr_etape_maximum+1;10;1)

14. CHOIX VISIBLE(*;"bttn"+Chaine($i);Faux)

15. Pointeur vers("nqr_etape_"+Chaine($i))->:=""

16. Fin de boucle

17. ACTIVER BOUTON(nqr_b_Etape_Suivante)

18. nqr_etape_suivante_ok:=Vrai

19. CHOIX COULEUR(*;"etape_"+Chaine(nqr_etape_courante);-Noir )

20. Fin de si

21. QR FIXER TYPE ETAT(nqr_area;1)

22. NQR_MP_Etape_Suivante

23. Fin de cas

25. CHOIX FORMATAGE(nqr_tr_1;"1;4;:14934;64")

26. CHOIX FORMATAGE(nqr_tr_2;"1;4;:14935;208")

28. ACTIVER BOUTON(*;"bp1@")

Lors d'un clic, nous affectons le type de rapport via la commande QR FIXER TYPE ETAT puis nous passons à l'étape suivante directement grâce à une méthode à présent connue.

Dans la page 2 nous utilisons des variables pour afficher le texte d'explication. En effet le dialogue est prévu pour être traduit et nous utilisons pour cela des ressources de type 'STR '. Il n'existe pas de moyen pour les ressources de ce type, contrairement aux ressources 'STR#', de les afficher directement dans le formulaire. Il faut donc passer par l'utilisation de la commande Lire ressource texte.

V - Étape de choix de la table

Si la variable nqr_recherche est fixée à 1, nous passons par cette étape qui utilise la page 14 du dialogue.

Le choix de la table s'effectue par le biais du popup menu _nqr_table et de la méthode objet associée :

1. QR FIXER TABLE ETAT(nqr_area;_nqr_table_id{_nqr_table})

3. NQR_MP_Get_Fields

L'étape propose aussi de changer la sélection d'enregistrements utilisée pour effectuer le calcul de l'état. C'est l'objet du bouton nqr_bPictChercher2. Sa méthode objet est très simple :

1. CHERCHER(Table(_nqr_table_id{_nqr_table})->

3. nqr_record_selection:=Chaine(Enregistrements trouves(Table(_nqr_table_id{_nqr_table})->))+" "+

4. Lire chaine dans liste(14907;18)   `"enreg. dans la sélection"

5. nqr_record_table:=Chaine(Enregistrements dans table(Table(_nqr_table_id{_nqr_table})->))+" "+

6. Lire chaine dans liste(14907;19)   `"enreg. dans la table"

8. nqr_bPictChercher2:=0

VI - Étape du choix des champs (rapport en liste)

Cette étape utilise la page 3 du dialogue. Cette étape permet de définir les différentes colonnes de l'état.

Les méthodes objets de cette page de dialogue sont globalement similaires aux méthodes étudiées en début de cette note technique et ne posent pas de problème de compréhension particulier.

VII - Étape du choix des champs (tableau croisé)

Le choix des champs pour le tableau croisé s'effectue via les objets de la page 7 du dialogue. Dans cette page, des objets sont superposés afin de proposer une aide lorsque les cellules ne sont pas encore remplies. La bascule entre les deux objets est réalisée via l'utilisation de la commande CHOIX VISIBLE. Cette commande est appelée au sein de la méthode NQR_MP_Get_tc_lc qui se charge de mettre l'interface en accord avec l'avancement de la définition de l'état.

VIII - Étapes du choix des tris

Le choix des tris s'effectue page 4 pour les rapports en listes et page 8 pour les tableaux croisés. Encore une fois la lecture des méthodes objet ne devrait pas poser de problème aux lecteurs attentifs du début de cette note technique.

IX - Étape de définition des opérations (rapport en liste)

Cette étape utilise la page 5 du dialogue. Il y a deux moyens de définir des opérations : soit la combinaison d'opérateurs, soit l'utilisation d'une chaîne de caractères avec des balises du type '##S'. Ces deux possibilités se retrouvent dans la syntaxe de la commande QR FIXER DONNEES TOTAUX qui accepte en dernier paramètre soit un entier soit un texte. Cet entier est un 'champ de bits' où à chaque opération possible correspond un bit dédié. Actuellement il existe 6 opérations avec l'introduction dans la version 2004 de l'écart type.

Pour les lecteurs non familiarisés avec l'utilisation des opérateurs sur les bits, nous vous invitons à relire la partie de la documentation dédiée.

La mémorisation des opérations se réalise dans la méthode NQR_MP_Set_Cellule qui est suivie de la méthode NQR_MP_Get_Selection en charge de la mise à jour de l'interface.

X - Étape de définition des opérations (tableau croisé)

Pour la définition des opérations pour un tableau croisé, nous utilisons 3 pages (numéro 9, 10 et 11). Pour définir les opérations, la commande QR FIXER DONNEES TOTAUX est toujours au cœur des méthodes appelées : NQR_MP_Set_Cellule_Base, NQR_MP_Set_Total_Colonne et NQR_MP_Set_Total_Ligne. Dans ces méthodes, une seule cellule est mise à jour, ce qui les rend très simples.

Dans les pages 10 et 11, les titres des lignes et colonnes de totaux sont également mis à jour via l'utilisation de la commande QR FIXER DONNEES TOTAUX pour les cellules (1,3) et (3,1).

XI - Étape de choix de la sortie

Dans cette étape utilisant la page 6 du dialogue, nous proposons cinq boutons correspondants aux cinq types de sorties disponibles. Chaque méthode objet des boutons se charge d'afficher les options proposées dans la partie droite de la page.

Nous noterons aussi l'utilisation de la commande CHOIX FORMATAGE qui permet de définir l'icône affichée dans les boutons comme dans les lignes suivantes :

1. CHOIX FORMATAGE(nqr_sc_1;"1;4;:14945;64")

3. CHOIX FORMATAGE(nqr_sc_4;"1;4;:14949;208")

4. CHOIX FORMATAGE(nqr_sc_3;"1;4;:14947;208")

5. CHOIX FORMATAGE(nqr_sc_2;"1;4;:14946;208")

7. CHOIX FORMATAGE(nqr_sc_5;"1;4;:14948;208")

Pour le détail de cette syntaxe particulière appliquée aux boutons images, nous invitons le lecteur à consulter la documentation du langage de 4D.

XII - Étape de choix d’une présentation (tableau croisé)

Cette étape occupe la page 13 du dialogue et permet de définir les couleurs, les polices et les encadrements du rapport final.

Dans une note technique précédente (4D-200307-19-FR : Les Modèles d'États Rapides avec NQR Template Builder), nous vous indiquions comment construire des propositions de présentations personnalisées. Ces propositions utilisent des ressources spécifiques 'QRRL' et 'QRCT' construites grâce à l'outil fourni dans la note technique.

Dans la page 13, ce sont les ressources QRCT qui nous intéressent particulièrement. À l'arrivée dans la page, la liste des présentations disponibles est chargée dans le tableau nommé _nqr_format. Ce chargement est effectué au sein de la méthode NQR_MP_Get_tc_format :

1. C_ENTIER LONG($i)

3. `lecture des ressources QRCT

4. LISTE RESSOURCES("QRCT";_nqr_format_id;$_qrct_name)

5. `definition du tableau des noms

6. TABLEAU ALPHA(80;_nqr_format;Taille tableau(_nqr_format_id))

7. `boucle sur les formats pour lire les noms dans chaque ressource

8. Boucle ($i;1;Taille tableau(_nqr_format_id);1)

9. LIRE RESSOURCE("QRCT";_nqr_format_id{$i};$qrct_blob)

10. $offset:=0

11. $titre:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

12. _nqr_format{$i}:=$titre

13. Fin de boucle

14. `s'il n'y a pas de format déjà sélectionné en choisir un

15. Si (_nqr_format=0) | (_nqr_format>Taille tableau(_nqr_format))

16. _nqr_format:=1

17. Fin de si

18. `afficher le détail du format

19. NQR_MP_Show_tc_format

Dans la ressource QRCT, le premier élément est une chaîne pascal contenant le nom de la présentation qui est relut via la commande 4D, BLOB vers texte.

Lorsqu'une présentation est sélectionnée dans la liste, la méthode NQR_MP_Show_tc_format est appelée pour afficher la prévisualisation correspondante. Voici le code de cette méthode qui se charge de lire l'ensemble des informations contenues dans la ressource QRCT :

1. C_ENTIER LONG($i)

3. Au cas ou

4. : (_nqr_format=0)

5. : (_nqr_format>Taille tableau(_nqr_format))

6. Sinon

7. TABLEAU ALPHA(63;$_police;0)

8. LISTE DES POLICES($_police)

10. LIRE RESSOURCE("QRCT";_nqr_format_id{_nqr_format};$qrct_blob)

11. $offset:=0

12. `lecture des titres et contenus des cellules

13. $titre:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

14. $titre_general:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

15. nqr_titre_c1:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

16. nqr_titre_c2:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

17. nqr_titre_c3:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

18. nqr_titre_c_total:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

19. nqr_titre_l1:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

20. nqr_titre_l2:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

21. nqr_titre_l3:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

22. nqr_titre_l_total:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

23. nqr_titre_v22:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

24. nqr_titre_v23:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

25. nqr_titre_v24:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

26. nqr_titre_v25:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

27. nqr_titre_v32:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

28. nqr_titre_v33:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

29. nqr_titre_v34:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

30. nqr_titre_v35:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

31. nqr_titre_v42:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

32. nqr_titre_v43:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

33. nqr_titre_v44:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

34. nqr_titre_v45:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

35. nqr_titre_v52:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

36. nqr_titre_v53:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

37. nqr_titre_v54:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

38. nqr_titre_v55:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

40. TABLEAU ALPHA(63;_nqr_celltc_police;8)

41. TABLEAU ENTIER(_nqr_celltc_taille;8)

42. TABLEAU ENTIER(_nqr_celltc_style;8)

43. TABLEAU ENTIER(_nqr_celltc_align;8)

44. TABLEAU ENTIER LONG(_nqr_celltc_couleurp;8)

45. TABLEAU ENTIER LONG(_nqr_celltc_couleurf;8)

46. TABLEAU ENTIER LONG(_nqr_celltc_couleura;8)

47. `lecture des informations sur la police et les couleurs

48. Boucle ($i;1;8;1)

49. $police:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

50. $taille:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)

51. $style:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)

52. $align:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)

53. $couleurp:=BLOB vers entier long($qrct_blob;Ordre octets Macintosh ;$offset)

54. $couleurf:=BLOB vers entier long($qrct_blob;Ordre octets Macintosh ;$offset)

56. _nqr_celltc_police{$i}:=$police

57. _nqr_celltc_taille{$i}:=$taille

58. _nqr_celltc_style{$i}:=$style

59. _nqr_celltc_align{$i}:=$align

60. _nqr_celltc_couleurp{$i}:=$couleurp

61. _nqr_celltc_couleurf{$i}:=$couleurf

62. _nqr_celltc_couleura{$i}:=-1

63. Fin de boucle

64. `lecture des couleurs alternatives

65. $couleur_alt_cellule:=BLOB vers entier long($qrct_blob;Ordre octets Macintosh ;$offset)

66. $couleur_alt_titre_lig:=BLOB vers entier long($qrct_blob;Ordre octets Macintosh ;$offset)

67. $couleur_alt_total_lig:=BLOB vers entier long($qrct_blob;Ordre octets Macintosh ;$offset)

69. _nqr_celltc_couleura{2}:=$couleur_alt_titre_lig

70. _nqr_celltc_couleura{3}:=$couleur_alt_cellule

71. _nqr_celltc_couleura{6}:=$couleur_alt_total_lig

73. TABLEAU ENTIER LONG(_nqr_celltc_couleurt;8)

74. TABLEAU ENTIER(_nqr_celltc_epaisseurg;8)

75. TABLEAU ENTIER(_nqr_celltc_epaisseurh;8)

76. TABLEAU ENTIER(_nqr_celltc_epaisseurd;8)

77. TABLEAU ENTIER(_nqr_celltc_epaisseurb;8)

78. TABLEAU ENTIER(_nqr_celltc_epaisseurih;8)

79. TABLEAU ENTIER(_nqr_celltc_epaisseuriv;8)

81. `lecture des epaisseurs

82. Boucle ($i;1;8;1)

83. $couleurt:=BLOB vers entier long($qrct_blob;Ordre octets Macintosh ;$offset)

84. $epaisseurg:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)

85. $epaisseurh:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)

86. $epaisseurd:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)

87. $epaisseurb:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)

88. $epaisseurih:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)

89. $epaisseuriv:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)

91. _nqr_celltc_couleurt{$i}:=$couleurt

92. _nqr_celltc_epaisseurg{$i}:=$epaisseurg

93. _nqr_celltc_epaisseurh{$i}:=$epaisseurh

94. _nqr_celltc_epaisseurd{$i}:=$epaisseurd

95. _nqr_celltc_epaisseurb{$i}:=$epaisseurb

96. _nqr_celltc_epaisseurih{$i}:=$epaisseurih

97. _nqr_celltc_epaisseuriv{$i}:=$epaisseuriv

98. Fin de boucle

100. NQR_MP_Draw_tc_format

102. Fin de cas

Cette méthode place dans des tableaux les valeurs lues au sein de la ressource puis appelle la méthode NQR_MP_Draw_tc_format chargée pour sa part de mettre en place le dessin de la prévisualisation. Cette méthode très longue (plus de 750 lignes !) utilisent les commandes LIRE TAILLE OPTIMALE et DEPLACER OBJET pour construire les positions des objets. Les attributs des objets sont également mis à jour par les commandes FIXER COULEURS RVB, CHANGER JEU DE CARACTERES et CHANGER TAILLE.

Il est important de remarquer les rectangles noirs hors de la zone visible du dialogue, qui serviront par la suite à créer les traits autour des cellules. Nous utilisons des rectangles, car il n'est pas possible de changer l'épaisseur de traits par programmation.

Les boîtes à cocher permettent de limiter à certains attributs la présentation sélectionnée. Afin d'appliquer de suite les modifications, la prévisualisation est recalculée via l'appel à la méthode NQR_MP_Draw_tc_format.

Lorsque le choix est effectué, le bouton « Appliquer » permet de modifier les attributs du rapport en fonction du choix établi. Cette construction utilise principalement les commandes 4D QR FIXER PROPRIETES TEXTE et QR FIXER ENCADREMENTS. À noter l'utilisation de la commande utilitaire de 4D Chart ch_Numero de police pour trouver le numéro correspondant à la police choisie.

XIII - Étape de choix d’une présentation (rapport en liste)

Cette étape utilise les mêmes principes que précédemment, mais avec les ressources QRRL en lieu et place des QRCT. Cela se déroule en page 12. Cette étape utilise les méthodes NQR_MP_Get_rl_format, NQR_MP_Show_tc_format et NQR_MP_Draw_tc_format.

XIV - Étape de finalisation

Cette étape située en page 15 est très simple et utilise principalement la commande QR EXECUTER COMMANDE.

XV - Comment aller plus loin ?

Nous avons à présent fait le tour global du dialogue. Comment l'améliorer grâce aux nouvelles fonctions introduites dans la version 2004 ?

Le dialogue n'utilise pas du tout les nouveaux boutons 3D, ce qui permettrait d'obtenir une interface plus « léchée », tout en utilisant moins d'objets.

Les séparateurs (splitters) peuvent désormais être placés en page zéro sans contrainte. Il serait donc intéressant de poser un splitter entre la zone du plug-in et la zone des objets 4D. Il faudra alors revoir les options de déplacement des objets permettant ainsi d'obtenir des listes de champs plus importantes par exemple.

XVI - Base exemple

Téléchargez la base exemple :

base exemple