Developpez.com - 4D
X

Choisissez d'abord la catégorieensuite la rubrique :


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

Date de publication : Septembre 2004

Par Olivier DESCHANELS (Responsable Programme 4D S.A.)
 

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'Etats Rapides de 4D.

I. Introduction
II. Appel de l’assistant de création de rapport
III. Gestion des pages de l’assistant
IV. Etape du choix du type d’état
V. Etape de choix de la table
VI. Etape du choix des champs (rapport en liste)
VII. Etape du choix des champs (tableau croisé)
VIII. Etapes du choix des tris
IX. Etape de définition des opérations (rapport en liste)
X. Etape de définition des opérations (tableau croisé)
XI. Etape de choix de la sortie
XII. Etape de choix d’une présentation (tableau croisé)
XIII. Etape de choix d’une présentation (rapport en liste)
XIV. Etape 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 à 4ème 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 :

   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 :

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

      `plus de sélection
   QR FIXER SELECTION(nqr_area;-1;-1;-1;-1)


Enfin, la méthode NQR_MP_Etape_Suivante est appelé 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. A chaque étape correspond 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 :

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

   NQR_MP_Etape (1)


Voici le code exécuté alors :

   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 :

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

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

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

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

   : (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'état.

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 :

   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 ou", 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 :

   : (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. Etape 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é en page 2 et contiennent deux méthodes objets symétriques. Voici celle du bouton pour le rapport en liste :

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

   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 :

   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. Etape 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. Etape 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. Etapes 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. Etape 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. Etape 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. Etape de choix de la sortie

Dans cette étape utilisant la page 6 du dialogue, nous proposons 5 boutons correspondants au 5 types de sortie 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 :

   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. Etape 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'Etats 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. A 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 :

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

   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. A noter l'utilisation de la commande utilitaire de 4D Chart ch_Numero de police pour trouver le numéro correspondant à la police choisie.


XIII. Etape 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. Etape 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é 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

__________________________________________________
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