Introduction▲
Cette note technique vient en complément de la note réf. 4D-200303-08-FR : « Remplacez vos IMPRIMER SELECTION par un module générique ».
Les commandes 4D afférentes à l'impression ont beaucoup évolué depuis la version 4D 6.8.1. Cette Note technique met en exergue des changements étalés tout au long de ces mises à jour, jusqu'à la version actuelle, 4D 2004.3.
Le tableau qui suit représente le thème « Impression » de 4D 2004. Il vous dresse un panorama de l'évolution de l'impression. Le premier numéro de version qui suit le nom de la commande correspond à sa version de création et les suivants aux versions de révisions.
(en rouge les commandes modifiées en 4D 2004)
Nom de la commande |
Version de création |
Version de révision |
Version de révision |
---|---|---|---|
Lire taquet impression |
6.8.1 |
2003.0 |
|
FIXER TAQUET IMPRESSION |
6.8.1 |
2003.0 |
|
Lire hauteur imprimee |
6.8.1 |
||
LIRE MARGE IMPRESSION |
6.8.1 |
||
FIXER MARGE IMPRESSION |
6.8.1 |
||
LIRE ZONE IMPRESSION |
6.8.1 |
||
Imprimer ligne |
5.0 |
2003.0 |
2004.0 |
SAUT DE PAGE |
5.0 |
2003.0 |
|
LISTE IMPRIMANTES |
2003.0 |
2004.2 |
|
FIXER IMPRIMANTE COURANTE |
2003.0 |
||
Lire imprimante courante |
2003.0 |
||
VALEURS OPTION IMPRESSION |
2003.0 |
||
FIXER OPTION IMPRESSION |
2003.0 |
2004.0 |
2004.3 |
LIRE OPTION IMPRESSION |
2003.0 |
2004.0 |
2004.3 |
IMPRIMER ETIQUETTES |
5.0 |
2004.0 |
|
IMPRIMER SELECTION |
5.0 |
2004.0 |
|
IMPRIMER ENREGISTREMENT |
5.0 |
2004.0 |
|
FIXER IMPRIMANTE COURANTE |
5.0 |
||
IMPRESSION ECRAN |
5.0 |
||
Niveau |
5.0 |
||
NIVEAUX DE RUPTURES |
5.0 |
||
Page impression |
5.0 |
||
PARAMETRES IMPRESSION |
5.0 |
||
Sous total |
5.0 |
||
UTILISER PARAMETRES IMPRESSION |
5.0 |
Les modifications apportées par 4D 2004▲
Imprimer ligne
Cette commande peut désormais être exécutée sur 4D Server dans le cadre d'une procédure stockée.
Dans ce contexte :
• il faut veillez à ce qu'aucune boîte de dialogue n'apparaisse sur le poste serveur (sauf besoin spécifique) Pour cela, il est nécessaire d'appeler la commande avec le paramètre * ou > ;
• en cas de problème sur l'imprimante (plus de papier, imprimante déconnectée, etc.), aucun message d'erreur n'est généré.
LISTE DES IMPRIMANTES
Sous MacOS, le deuxième paramètre de cette commande retourne désormais pour chaque imprimante son nom personnalisé, modifiable par l'utilisateur. Ce nom peut être utilisé par exemple dans des boîtes de dialogue.
FIXER OPTION IMPRESSION, LIRE OPTION IMPRESSION
2004.0. Introduction d'un nouveau paramètre : Option mode impression Mac
• Option mode impression Mac (13) : passez 0 pour fixer l'impression en mode PDF (valeur par défaut) et 1 pour « forcer » l'impression en mode Postscript dans valeur1. Cette option modifie également le mode d'impression des plug-ins 4D Write, 4D View et 4D Draw. En revanche, elle n'a pas d'effet sous Windows.
Note : Sous MacOS X, les impressions sont effectuées par défaut en mode PDF. Or, le pilote d'impression PDF ne prend pas en charge les images PICT encapsulant des informations Postscript -ces images sont générées notamment par des logiciels de dessin vectoriel. Pour résoudre ce problème, cette option permet de modifier le mode d'impression sous MacOS X pour la session courante. Attention, l'impression en mode Postscript peut entraîner des effets de bords indésirables.
Une fois fixée à l'aide de cette commande, une option d'impression sera conservée durant toute la session pour l'application 4D entière. Elle sera utilisée par les commandes IMPRIMER SELECTION, IMPRIMER ETIQUETTES, IMPRIMER ENREGISTREMENT, Imprimer ligne, QR ETAT et par toutes les impressions de 4e Dimension, y compris en mode Structure.
2004.3. Introduction d'un nouveau paramètre : Option masquer progression impr
• Option masquer progression impr (14). Cette nouvelle option permet de masquer toutes les fenêtres système de progression d'impression pour le process courant. Passez 1 dans valeur1 pour masquer les fenêtres de progression et 0 pour rétablir leur affichage (fonctionnement par défaut). Cette option est particulièrement utile dans le cadre des impressions en PDF sous Mac OS X.
Note : Il existe déjà une option d'affichage Progression de l'impression accessible via la boîte de dialogue des Préférences (page Application/Options). Toutefois, elle est globale à l'application et ne masque pas toutes les fenêtres sous Mac OS X.
IMPRIMER ETIQUETTES
4D Server : cette commande peut être exécutée sur 4D Server dans le cadre d'une procédure stockée.
Dans ce contexte :
• même mise en garde concernant les dialogues et l'absence de message d'erreur que pour les commandes précédentes… ;
• la syntaxe faisant apparaître l'éditeur d'étiquettes ne fonctionne pas avec 4D Server, dans ce cas, la variable système OK prend la valeur 0.
IMPRIMER SELECTION
4D Server : cette commande peut être exécutée sur 4D Server dans le cadre d'une procédure stockée. Même mise en garde concernant les dialogues et l'absence de message d'erreur…
IMPRIMER ENREGISTREMENT
4D Server : cette commande peut être exécutée sur 4D Server dans le cadre d'une procédure stockée. Attention également à ne pas afficher de dialogues et à l'absence de message d'erreur…
Une base exemple▲
La base qui accompagne cette note illustre la façon d'imprimer un catalogue de produits à partir d'un formulaire unique.
Notons que l'entête de ce catalogue contient deux variables (l'heure et la date d'impression) et le corps contient un champ qui détaille le produit.
La hauteur de ce champ s'adapte au texte contenu aussi nous devons prendre soin :
· d'ajuster l'objet sur le contenu texte
· déplacer les autres éléments situés sous l'objet
· déplacer les taquets d'impression pour le corps, mais aussi celui de rupture et de pied
· veiller à la place restante avant de lancer l'Imprimer ligne
· ne pas recalculer l'heure et la date à chaque produit !
Codes pas à pas▲
Méthode formulaire : le principe est de ne pas calculer quand ce n'est pas utile.
La méthode print_catalogue lance l'impression et distribue les ordres d'Imprimer ligne. Imprimons simplement l'entête du catalogue :
$L_Size
:=
Imprimer ligne
([
TABLE_PRINT];
"catalogue_demo"
;
Entête formulaire
)
La Méthode formulaire est exécutée et les variables Date et Heure sont renseignées :
Au cas ou
: (
Evenement formulaire
=
Sur impression corps
)
D_Date:=
Date du jour
H_Heure:=
Heure courante
Fin de cas
Maintenant n'imprimons que les produits :
TOUT SELECTIONNER
([
TABLE_PRINT])
Tant que
(
Non
(
Fin de selection
([
TABLE_PRINT])))
$L_Size
:=
Imprimer ligne
([
TABLE_PRINT];
"catalogue_demo"
;
Corps formulaire
)
ENREGISTREMENT SUIVANT
([
TABLE_PRINT])
Fin tant que
La Méthode formulaire est exécutée et nous redimensionnons la zone de texte de la description.
Au cas ou
: (
Evenement formulaire
=
Sur impression corps
)
LIRE RECT OBJET([
TABLE_PRINT]
Detail_T;
$L_Gauche
;
$L_Haut
;
$L_Droite
;
$L_Bas
)
$L_Max
:=
$L_Droite
-
$L_Gauche
$L_Hauteur
:=
$L_Bas
-
$L_Haut
TAILLE OBJET OPTIMALE([
TABLE_PRINT]
Detail_T;
$L_LargeurOpti
;
$L_HauteurOpti
;
$L_Max
)
$L_Augmentation
:=
$L_HauteurOpti
-
$L_Hauteur
` D'abord déplacer le taquet
` Notez * dans FIXER TAQUET IMPRESSION qui permet de déplacer les taquets suivants
$L_C
:=
Lire taquet impression
(
Corps formulaire
)
FIXER TAQUET IMPRESSION
(
Corps formulaire
;
$L_C
+
$L_Augmentation
;*)
` Ensuite déplacer les objets
DEPLACER OBJET([
TABLE_PRINT]
Detail_T;
0
;
0
;
0
;
$L_Augmentation
)
` par le bas
DEPLACER OBJET(*;
"ligne1"
;
0
;
$L_Augmentation
;
0
;
0
)
` par le haut
DEPLACER OBJET(*;
"ligneVd"
;
0
;
0
;
0
;
$L_Augmentation
)
DEPLACER OBJET(*;
"ligneVg"
;
0
;
0
;
0
;
$L_Augmentation
)
Fin de cas
À l'issue de ces deux impressions, nous constatons qu'il y a comme deux méthodes formulaire distinctes à exécuter dans un formulaire unique « catalogue_demo ». Nous avons convenu au démarrage que, lors du calcul de l'heure et la date, on ne calcule pas la hauteur des produits et réciproquement.
Pour faire ce distinguo nous renseignons une variable process S020_ZoneTaquet qui indique à la méthode formulaire les traitements à réaliser.
Au cas ou
: (
S020_ZoneTaquet=
"corps"
)
: (
S020_ZoneTaquet=
"tete"
)
: (
S020_ZoneTaquet=
"pied"
)
Fin de cas
Retouchons la méthode print_catalogue :
S020_ZoneTaquet:=
"tete"
$L_Size
:=
Imprimer ligne
([
TABLE_PRINT];
"catalogue_demo"
;
Entête formulaire
)
Tant que
(
Non
(
Fin de selection
([
TABLE_PRINT])))
S020_ZoneTaquet:=
"corps"
$L_Size
:=
Imprimer ligne
([
TABLE_PRINT];
"catalogue_demo"
;
Corps formulaire
)
ENREGISTREMENT SUIVANT
([
TABLE_PRINT])
Fin tant que
La méthode formulaire devient :
Au cas ou
: (
Evenement formulaire
=
Sur impression corps
)
Au cas ou
: (
S020_ZoneTaquet=
"corps"
)
LIRE RECT OBJET([
TABLE_PRINT]
Detail_T;
$L_Gauche
;
$L_Haut
;
$L_Droite
;
$L_Bas
)
$L_Max
:=
$L_Droite
-
$L_Gauche
$L_Hauteur
:=
$L_Bas
-
$L_Haut
TAILLE OBJET OPTIMALE([
TABLE_PRINT]
Detail_T;
$L_LargeurOpti
;
$L_HauteurOpti
;
$L_Max
)
$L_Augmentation
:=
$L_HauteurOpti
-
$L_Hauteur
` D'abord déplacer le taquet
` Notez * dans FIXER TAQUET IMPRESSION qui permet de déplacer les taquets suivants
$L_C
:=
Lire taquet impression
(
Corps formulaire
)
FIXER TAQUET IMPRESSION
(
Corps formulaire
;
$L_C
+
$L_Augmentation
;*)
` Ensuite déplacer les objets
DEPLACER OBJET([
TABLE_PRINT]
Detail_T;
0
;
0
;
0
;
$L_Augmentation
)
` par le bas
DEPLACER OBJET(*;
"ligne1"
;
0
;
$L_Augmentation
;
0
;
0
)
` par le haut
DEPLACER OBJET(*;
"ligneVd"
;
0
;
0
;
0
;
$L_Augmentation
)
DEPLACER OBJET(*;
"ligneVg"
;
0
;
0
;
0
;
$L_Augmentation
)
: (
S020_ZoneTaquet=
"tete"
)
D_Date:=
Date du jour
H_Heure:=
Heure courante
Fin de cas
Nous touchons au but, mais n'oublions pas qu'il faut calculer la place nécessaire pour imprimer notre produit : si celle-ci est insuffisante, nous redémarrons sur une nouvelle page avec les têtes des colonnes. Pour réaliser cette tâche, nous allons utiliser une autre syntaxe de la fonction Imprimer ligne. Au lieu de désigner la portion de formulaire par son nom…
$L_Size
:=
Imprimer ligne
([
TABLE_PRINT];
"catalogue_demo"
;
Corps formulaire
)
… nous indiquerons quelles coordonnées numériques nous voulons imprimer.
$L_Size
:=
Imprimer ligne
([
TABLE_PRINT];
"catalogue_demo"
;
1
;
1
)
Comme nous choisissons de la position 1 pixel à 1 pixel la zone de formulaire imprimée sera de 0 pixel… mais la méthode formulaire sera exécutée. Nous en profitons pour créer une nouvelle valeur pour le tag S020_ZoneTaquet.
S020_ZoneTaquet:=
"calcul"
$L_Size
:=
Imprimer ligne
([
TABLE_PRINT];
"catalogue_demo"
;
1
;
1
)
La partie du code de la Méthode formulaire qui change devient :
Au cas ou
: (
Evenement formulaire
=
Sur impression corps
)
Au cas ou
: (
S020_ZoneTaquet=
"calcul"
)
` Le calcul va déterminer la hauteur totale à imprimer
$L_E1
:=
Lire taquet impression
(
Entête formulaire1
)
$L_C
:=
Lire taquet impression
(
Corps formulaire
)
LIRE RECT OBJET([
TABLE_PRINT]
Detail_T;
$L_Gauche
;
$L_Haut
;
$L_Droite
;
$L_Bas
)
$L_Max
:=
$L_Droite
-
$L_Gauche
$L_Hauteur
:=
$L_Bas
-
$L_Haut
TAILLE OBJET OPTIMALE([
TABLE_PRINT]
Detail_T;
$L_LargeurOpti
;
$L_HauteurOpti
;
$L_Max
)
$L_Augmentation
:=
$L_HauteurOpti
-
$L_Hauteur
L_HauteurNominale:=(
$L_C
+
$L_Augmentation
)-
$L_E1
: (
S020_ZoneTaquet=
"corps"
)
: (
S020_ZoneTaquet=
"tete"
)
Fin de cas
Fin de cas
À l'issue de ce test, nous avons renseigné la variable process L_HauteurNominale qui contient la hauteur en pixel de la zone à imprimer. Cette variable est exploitée dans la méthode print_catalogue pour, si besoin, générer une nouvelle page.
LIRE ZONE IMPRESSION
(
$L_HauteurImpression
;
$L_LargeurImpression
)
Tant que
(
Non
(
Fin de selection
([
TABLE_PRINT])))
` Cette section"calcul" va nous permettre de savoir si la ligne de catalogue peut être imprimée
S020_ZoneTaquet:=
"calcul"
$L_Size
:=
Imprimer ligne
([
TABLE_PRINT];
"catalogue_demo"
;
1
;
1
)
$L_HauteurDispo
:=
$L_HauteurImpression
-
Lire hauteur imprimee
Si
(
$L_HauteurDispo
<
L_HauteurNominale)
SAUT DE PAGE
(*)
$L_Size
:=
Imprimer ligne
([
TABLE_PRINT];
"catalogue_demo"
;
Entête formulaire1
)
Fin de si
S020_ZoneTaquet:=
"corps"
$L_Size
:=
Imprimer ligne
([
TABLE_PRINT];
"catalogue_demo"
;
Corps formulaire
)
ENREGISTREMENT SUIVANT
([
TABLE_PRINT])
Fin tant que
Codes complets▲
Pour conclure, voici le code complet de la méthode print_catalogue et de la méthode formulaire, rationalisé, afin de limiter les répétitions inutiles d'instructions.
• Méthode print_catalogue
En client/serveur elle s'exécutera sur le serveur (Nouveauté 2004) : dans ce cas gare aux alertes intempestives.
Si
(
Nombre de parametres=
0
)
$L_Process
:=
Executer sur serveur
(
Nom methode courante
;
1024
*
100
;
"test"
;
"Dummy"
;*)
Sinon
` En client serveur c'est le serveur qui gère l'impression et non plus le client
` Attention aux alertes inattendues !
FIXER OPTION IMPRESSION
(
Option orientation
;
1
)
` verticale
FIXER OPTION IMPRESSION
(
Option échelle
;
100
)
`a 100%
FIXER OPTION IMPRESSION
(
Option nombre copies
;
1
)
` 1 Copie
FIXER OPTION IMPRESSION
(
Option destination
;
1
)
` 1 Imprimante
FIXER OPTION IMPRESSION
(
Option nom document à imprimer
;
"test impression"
)
FIXER OPTION IMPRESSION
(
Option papier
;
"A4"
)
FIXER MARGE IMPRESSION
(-
1
;-
1
;-
1
;-
1
)
LIRE ZONE IMPRESSION
(
$L_HauteurImpression
;
$L_LargeurImpression
)
IMPRESSION ECRAN(
Faux
)
` Impression de l'entête, pas de difficulté
` On considère qu'il y a de la place pour imprimer cette zone
S020_ZoneTaquet:=
"tete"
$L_Size
:=
Imprimer ligne
([
TABLE_PRINT];
"catalogue_demo"
;
Entête formulaire
)
$L_Size
:=
Imprimer ligne
([
TABLE_PRINT];
"catalogue_demo"
;
Entête formulaire1
)
$L_HauteurDispo
:=
$L_HauteurImpression
-
Lire hauteur imprimee
TOUT SELECTIONNER
([
TABLE_PRINT])
REDUIRE SELECTION
([
TABLE_PRINT];
10
)
DEBUT SELECTION
([
TABLE_PRINT])
Tant que
(
Non
(
Fin de selection
([
TABLE_PRINT])))
`
` Cette section "calcul" va nous permettre de savoir si la ligne de catalogue peut être imprimée
S020_ZoneTaquet:=
"calcul"
$L_HauteurDispo
:=
$L_HauteurImpression
-
Lire hauteur imprimee
$L_Size
:=
Imprimer ligne
([
TABLE_PRINT];
"catalogue_demo"
;
1
;
1
)
` L_HauteurNominale est renseignée dans la méthode formulaire du formulaire d'impression
Si
(
$L_HauteurDispo
<
L_HauteurNominale)
SAUT DE PAGE
(>)
$L_Size
:=
Imprimer ligne
([
TABLE_PRINT];
"catalogue_demo"
;
Entête formulaire1
)
Fin de si
S020_ZoneTaquet:=
"corps"
$L_Size
:=
Imprimer ligne
([
TABLE_PRINT];
"catalogue_demo"
;
Corps formulaire
)
ENREGISTREMENT SUIVANT
([
TABLE_PRINT])
Fin tant que
S020_ZoneTaquet:=
"pied"
$L_Size
:=
Imprimer ligne
([
TABLE_PRINT];
"catalogue_demo"
;
Pied de page formulaire
)
SAUT DE PAGE
Fin de si
• La Méthode Formulaire
Au cas ou
: (
Evenement formulaire
=
Sur impression corps
)
Si
(
S020_ZoneTaquet=
"calcul"
)
|
(
S020_ZoneTaquet=
"corps"
)
LIRE RECT OBJET([
TABLE_PRINT]
Detail_T;
$L_Gauche
;
$L_Haut
;
$L_Droite
;
$L_Bas
)
$L_Max
:=
$L_Droite
-
$L_Gauche
$L_Hauteur
:=
$L_Bas
-
$L_Haut
TAILLE OBJET OPTIMALE([
TABLE_PRINT]
Detail_T;
$L_LargeurOpti
;
$L_HauteurOpti
;
$L_Max
)
$L_Augmentation
:=
$L_HauteurOpti
-
$L_Hauteur
$L_C
:=
Lire taquet impression
(
Corps formulaire
)
Fin de si
Au cas ou
: (
S020_ZoneTaquet=
"calcul"
)
` Le calcul va déterminer la hauteur totale à imprimer
$L_E1
:=
Lire taquet impression
(
Entête formulaire1
)
L_HauteurNominale:=(
$L_C
+
$L_Augmentation
)-
$L_E1
: (
S020_ZoneTaquet=
"corps"
)
` D'abord déplacer le taquet
FIXER TAQUET IMPRESSION
(
Corps formulaire
;
$L_C
+
$L_Augmentation
;*)
` Ensuite les objets
DEPLACER OBJET([
TABLE_PRINT]
Detail_T;
0
;
0
;
0
;
$L_Augmentation
)
` par le bas
DEPLACER OBJET(*;
"ligne1"
;
0
;
$L_Augmentation
;
0
;
0
)
DEPLACER OBJET(*;
"ligneVd"
;
0
;
0
;
0
;
$L_Augmentation
)
DEPLACER OBJET(*;
"ligneVg"
;
0
;
0
;
0
;
$L_Augmentation
)
: (
S020_ZoneTaquet=
"tete"
)
D_Date:=
Date du jour
H_Heure:=
Heure courante
Fin de cas
Fin de cas
Trois syntaxes pour « Imprimer ligne »▲
Pour terminer ce tour d'horizon, voici les trois syntaxes possibles de l'Imprimer ligne :
• Méthode : imprimer_ligne_syntaxe1
Syntaxe historique : on imprime la zone de Corps.
` ----------------------------------------------------
` Nom utilisateur (OS) : Bertrand
` Date et heure : 03/01/06, 20:19:35
` ----------------------------------------------------
` Méthode : imprimer_ligne_syntaxe1
` Description
` C'est la syntaxe historique : la zone de corps est imprimée
`
` Paramètres
` ----------------------------------------------------
C_ENTIER(
$zone
)
$zone
:=
Imprimer ligne
([
TABLE_PRINT];
"demo_zone"
)
SAUT DE PAGE
` Déclenche l'impression
• Méthode : imprimer_ligne_syntaxe2
Imprimer ligne reçoit la précision sur la zone formulaire à imprimer. Ces zones sont intimement liées au formulaire.
` ----------------------------------------------------
` Nom utilisateur (OS) : Bertrand
` Date et heure : 03/01/06, 20:18:34
` ----------------------------------------------------
` Méthode : imprimer_ligne_syntaxe2
` Description
` Imprimer ligne reçoit la précision sur la zone formulaire
`à imprimer. Ces zones sont intimement liées au formulaire
`
` Paramètres
` ----------------------------------------------------
C_ENTIER (
$zone1
;
$zone2
;
$zone3
;
$zone4
)
$zone1
:=
Imprimer ligne
([
TABLE_PRINT];
"demo_zone"
;
Entête formulaire
)
$zone2
:=
Imprimer ligne
([
TABLE_PRINT];
"demo_zone"
;
Corps formulaire
)
$zone3
:=
Imprimer ligne
([
TABLE_PRINT];
"demo_zone"
;
Rupture formulaire0
)
$zone4
:=
Imprimer ligne
([
TABLE_PRINT];
"demo_zone"
;
Pied de page formulaire
)
SAUT DE PAGE
` Déclenche l'impression
• Méthode : imprimer_ligne_syntaxe3
Vous passez une zone de début et une zone de fin.
` ----------------------------------------------------
` Nom utilisateur (OS) : Bertrand
` Date et heure : 03/01/06, 20:21:45
` ----------------------------------------------------
` Méthode : imprimer_ligne_syntaxe3
` Description
` Vous passez une zone de début et une zone de fin
` les valeurs sont en pixels
`
` Paramètres
` ----------------------------------------------------
C_ENTIER(
$zone
)
$zone
:=
Imprimer ligne
([
TABLE_PRINT];
"demo_zone"
;
42
;
155
)
` avec ces valeurs nous rognerons dans le libellé "entête zone" et "rupture zone"
SAUT DE PAGE
` Déclenche l'impression
Text2Array▲
La prochaine évolution majeure serait une fonction qui permettrait de découper un texte par lignes à placer dans un tableau de type texte et ainsi rendre imprimables de longues zones de texte courant sur plusieurs pages.
En attendant, rappelons l'existence du plugin Text2Array développé par Dave BATTON :
http://e-node.fr/redir/FR/produit_id_90.html
Conclusion▲
Les méthodes utilisées pour l'impression évoluent comme le montre notre tableau d'entrée et donnent aux développeurs un nombre infini de possibilités.
Base exemple▲
Télécharger la base exemple.