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

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

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

Article lu   fois.

L'auteur

Site personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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 :

 
Sélectionnez
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 :

 
Sélectionnez
1.
2.
3.
4.
   `initialisation des propriétés de la zone
Boucle ($view;1;7)
   QR FIXER PROPRIETE ZONE(nqr_area;$view;0)
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 :

 
Sélectionnez
1.
2.
   `plus de sélection
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 :

Pictures 0160x0233

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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
   `on recule de deux étapes

nqr_etape_courante:=nqr_etape_courante-2
Si (nqr_etape_courante=-1)
   nqr_etape_courante:=0
Fin de si
   `pour réavancer d'une : on recule donc d'une seule étape !
NQR_MP_Etape_Suivante

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

 
Sélectionnez
1.
NQR_MP_Etape (1)

Voici le code exécuté alors :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
C_ENTIER($1;$etape_cible)

$etape_cible:=$1
Au cas ou

   : (Page formulaire courante=1)   `ou cas improbable ou il y a une erreur de page !
   : ($etape_cible=nqr_etape_courante)   `rien à faire dans ce cas
   : ($etape_cible>nqr_etape_maximum)   `ce n'est pas autoriser, ne rien faire (cas improbable en principe)
   : (Non(nqr_etape_suivante_ok)) & ($etape_cible>nqr_etape_courante)
         `le passage à l'étape suivante n'est pas autorisé
      BEEP
   Sinon
         `on passe à l'étape ciblée
      nqr_etape_courante:=$etape_cible-1
      NQR_MP_Etape_Suivante

   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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
   ` passer à l'étape suivante

nqr_etape_courante:=nqr_etape_courante+1
   `nous ne sommes pas à priori dans la dernière étape
nqr_derniere_etape:=Faux
   `a priori nous pouvons passer à l'étape suivante
nqr_etape_suivante_ok:=Vrai
   `maj de la valeur maximum
Si (nqr_etape_maximum<nqr_etape_courante)
   nqr_etape_maximum:=nqr_etape_courante
Fin de si

Puis nous activons les boutons de navigation :

 
Sélectionnez
1.
2.
3.
4.
5.
`activation des boutons de navigation

ACTIVER BOUTON(nqr_b_Etape_Suivante)

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 :

 
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.
   `définition du titre

nqr_etape_titre:=Lire chaine dans liste(14907;21)+" "+Chaine(nqr_etape_courante)+" : "+nqr_etape_titre
   `masquer tous les boutons
CHOIX VISIBLE(*;"bttn@";Faux)
   `afficher les boutons autorisés
Boucle ($i;1;nqr_etape_maximum;1)
   CHOIX COULEUR(*;"etape_"+Chaine($i);-250)   `gris foncé
   CHOIX VISIBLE(*;"bttn"+Chaine($i);Vrai)
   Pointeur vers("nqr_bttn"+Chaine($i))->:=0
Fin de boucle
   `colorier l'étape courante en fonction de l'état
Si (nqr_etape_suivante_ok)
   CHOIX COULEUR(*;"etape_"+Chaine(nqr_etape_courante);-Noir )
Sinon
   CHOIX COULEUR(*;"etape_"+Chaine(nqr_etape_courante);-Gris )
Fin de si
   `activer tous les boutons
ACTIVER BOUTON(*;"bttn@")
   `sauf celui de l'étape courante
INACTIVER BOUTON(*;"bttn"+Chaine(nqr_etape_courante))
Pointeur vers("nqr_bttn"+Chaine(nqr_etape_courante))->:=1
   `gestion de la dernière étape
Si (nqr_derniere_etape) | Non(nqr_etape_suivante_ok)
   INACTIVER BOUTON(nqr_b_Etape_Suivante)
Sinon
   ACTIVER BOUTON(nqr_b_Etape_Suivante)
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é :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
Au cas ou

   : (nqr_tr_1=1)   `rapport en liste
      ...
   : (nqr_tr_2=1)   `tableau croisé
      ...

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é :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
: (nqr_etape_courante=1)

   nqr_etape_1:="1 - "+Lire chaine dans liste(14907;24)   `"Type de rapport"
   nqr_etape_titre:=Lire chaine dans liste(14907;22)   `"choix du type de rapport"
   ALLER A PAGE(2)
      `pour l'etape 1, il n'y a pas d'étape précédente
   INACTIVER BOUTON(nqr_b_Etape_Precedente)
   nqr_explication_1:=Lire ressource texte(14907)
   nqr_explication_2:=Lire ressource texte(14908)

   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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Au cas ou

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

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 :

 
Sélectionnez
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 :

 
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.
C_ENTIER LONG($evt)
C_ENTIER LONG($i)

$evt:=Evenement formulaire
nqr_tr_1:=1
nqr_tr_2:=0

Au cas ou
   : ($evt=Sur clic )
      $etat_courant:=QR Lire type etat(nqr_area)
      Si ($etat_courant#1)
         nqr_etape_maximum:=1
         Boucle ($i;nqr_etape_maximum+1;10;1)
            CHOIX VISIBLE(*;"bttn"+Chaine($i);Faux)
            Pointeur vers("nqr_etape_"+Chaine($i))->:=""
         Fin de boucle
         ACTIVER BOUTON(nqr_b_Etape_Suivante)
         nqr_etape_suivante_ok:=Vrai
         CHOIX COULEUR(*;"etape_"+Chaine(nqr_etape_courante);-Noir )
      Fin de si
      QR FIXER TYPE ETAT(nqr_area;1)
      NQR_MP_Etape_Suivante
Fin de cas

CHOIX FORMATAGE(nqr_tr_1;"1;4;:14934;64")
CHOIX FORMATAGE(nqr_tr_2;"1;4;:14935;208")

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 :

 
Sélectionnez
1.
2.
3.
QR FIXER TABLE ETAT(nqr_area;_nqr_table_id{_nqr_table})

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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
CHERCHER(Table(_nqr_table_id{_nqr_table})->

nqr_record_selection:=Chaine(Enregistrements trouves(Table(_nqr_table_id{_nqr_table})->))+" "+
   Lire chaine dans liste(14907;18)   `"enreg. dans la sélection"
nqr_record_table:=Chaine(Enregistrements dans table(Table(_nqr_table_id{_nqr_table})->))+" "+
   Lire chaine dans liste(14907;19)   `"enreg. dans la table"

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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
CHOIX FORMATAGE(nqr_sc_1;"1;4;:14945;64")

CHOIX FORMATAGE(nqr_sc_4;"1;4;:14949;208")
CHOIX FORMATAGE(nqr_sc_3;"1;4;:14947;208")
CHOIX FORMATAGE(nqr_sc_2;"1;4;:14946;208")

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 :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
C_ENTIER LONG($i)

   `lecture des ressources QRCT
LISTE RESSOURCES("QRCT";_nqr_format_id;$_qrct_name)
   `definition du tableau des noms
TABLEAU ALPHA(80;_nqr_format;Taille tableau(_nqr_format_id))
   `boucle sur les formats pour lire les noms dans chaque ressource
Boucle ($i;1;Taille tableau(_nqr_format_id);1)
   LIRE RESSOURCE("QRCT";_nqr_format_id{$i};$qrct_blob)
   $offset:=0
   $titre:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
   _nqr_format{$i}:=$titre
Fin de boucle
   `s'il n'y a pas de format déjà sélectionné en choisir un
Si (_nqr_format=0) | (_nqr_format>Taille tableau(_nqr_format))
   _nqr_format:=1
Fin de si
   `afficher le détail du format
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 :

 
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.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
C_ENTIER LONG($i)

Au cas ou
   : (_nqr_format=0)
   : (_nqr_format>Taille tableau(_nqr_format))
   Sinon
      TABLEAU ALPHA(63;$_police;0)
      LISTE DES POLICES($_police)

      LIRE RESSOURCE("QRCT";_nqr_format_id{_nqr_format};$qrct_blob)
      $offset:=0
         `lecture des titres et contenus des cellules
      $titre:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      $titre_general:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_c1:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_c2:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_c3:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_c_total:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_l1:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_l2:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_l3:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_l_total:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_v22:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_v23:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_v24:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_v25:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_v32:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_v33:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_v34:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_v35:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_v42:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_v43:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_v44:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_v45:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_v52:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_v53:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_v54:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
      nqr_titre_v55:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)

      TABLEAU ALPHA(63;_nqr_celltc_police;8)
      TABLEAU ENTIER(_nqr_celltc_taille;8)
      TABLEAU ENTIER(_nqr_celltc_style;8)
      TABLEAU ENTIER(_nqr_celltc_align;8)
      TABLEAU ENTIER LONG(_nqr_celltc_couleurp;8)
      TABLEAU ENTIER LONG(_nqr_celltc_couleurf;8)
      TABLEAU ENTIER LONG(_nqr_celltc_couleura;8)
         `lecture des informations sur la police et les couleurs
      Boucle ($i;1;8;1)
         $police:=BLOB vers texte($qrct_blob;Chaîne pascal ;$offset)
         $taille:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)
         $style:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)
         $align:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)
         $couleurp:=BLOB vers entier long($qrct_blob;Ordre octets Macintosh ;$offset)
         $couleurf:=BLOB vers entier long($qrct_blob;Ordre octets Macintosh ;$offset)

         _nqr_celltc_police{$i}:=$police
         _nqr_celltc_taille{$i}:=$taille
         _nqr_celltc_style{$i}:=$style
         _nqr_celltc_align{$i}:=$align
         _nqr_celltc_couleurp{$i}:=$couleurp
         _nqr_celltc_couleurf{$i}:=$couleurf
         _nqr_celltc_couleura{$i}:=-1
      Fin de boucle
         `lecture des couleurs alternatives
      $couleur_alt_cellule:=BLOB vers entier long($qrct_blob;Ordre octets Macintosh ;$offset)
      $couleur_alt_titre_lig:=BLOB vers entier long($qrct_blob;Ordre octets Macintosh ;$offset)
      $couleur_alt_total_lig:=BLOB vers entier long($qrct_blob;Ordre octets Macintosh ;$offset)

      _nqr_celltc_couleura{2}:=$couleur_alt_titre_lig
      _nqr_celltc_couleura{3}:=$couleur_alt_cellule
      _nqr_celltc_couleura{6}:=$couleur_alt_total_lig

      TABLEAU ENTIER LONG(_nqr_celltc_couleurt;8)
      TABLEAU ENTIER(_nqr_celltc_epaisseurg;8)
      TABLEAU ENTIER(_nqr_celltc_epaisseurh;8)
      TABLEAU ENTIER(_nqr_celltc_epaisseurd;8)
      TABLEAU ENTIER(_nqr_celltc_epaisseurb;8)
      TABLEAU ENTIER(_nqr_celltc_epaisseurih;8)
      TABLEAU ENTIER(_nqr_celltc_epaisseuriv;8)

         `lecture des epaisseurs
      Boucle ($i;1;8;1)
         $couleurt:=BLOB vers entier long($qrct_blob;Ordre octets Macintosh ;$offset)
         $epaisseurg:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)
         $epaisseurh:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)
         $epaisseurd:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)
         $epaisseurb:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)
         $epaisseurih:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)
         $epaisseuriv:=BLOB vers entier($qrct_blob;Ordre octets Macintosh ;$offset)

         _nqr_celltc_couleurt{$i}:=$couleurt
         _nqr_celltc_epaisseurg{$i}:=$epaisseurg
         _nqr_celltc_epaisseurh{$i}:=$epaisseurh
         _nqr_celltc_epaisseurd{$i}:=$epaisseurd
         _nqr_celltc_epaisseurb{$i}:=$epaisseurb
         _nqr_celltc_epaisseurih{$i}:=$epaisseurih
         _nqr_celltc_epaisseuriv{$i}:=$epaisseuriv
      Fin de boucle

      NQR_MP_Draw_tc_format

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

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.