Imprimer objet pour un texte

Bonjour à tous
J’aimerais utiliser la fonction imprimer objet pour une variable texte, qui est dans un formulaire projet.
Malheureusement l’impression ne se fait que sur une page, et le texte n’est pas imprimé en entier, il y aurait en tout cas 3 pages à imprimer pour aller jusqu’au bout
Est-ce que je perds mon temps avec cette fonction?
je peux toujours utiliser imprimer ligne mais ça demande un peu plus de code

j’ai la méthode suivante pour lancer l’impression
<code 4D>
C_ENTIER($largopti;$hauopti)
C_BOOLEEN($fin)
OUVRIR TACHE IMPRESSION
OUVRIR FORMULAIRE IMPRESSION(“D_XML_impression”)

OBJET LIRE TAILLE OPTIMALE(*;“XMLText”;$largopti;$hauopti)

OBJET DEPLACER(*;“XMLText”;0;0;$largopti;$hauopti)

$fin:=Faux
Repeter

$fin:=Imprimer objet(*;“XMLText”;20;20;540;700)

SAUT DE PAGE
Jusque ($fin)
FERMER TACHE IMPRESSION
</code 4D>

merci à vous

alain haerri

Bonjour Alain,
je ferais ça en me basant sur la commande http://doc.4d.com/4Dv16R5/4D/16-R5/TEXTE-VERS-TABLEAU.301-3481020.fr.htmlTEXTE VERS TABLEAU>.
En gros :
je découpe en lignes avec cette commande
j’imprime ligne par ligne avec imprimer objet
saut de page si j’arrive en bas
et c’est reparti page suivante

Pour le calcul de hauteur d’interligne, je pense que tu peux, au choix :

  • tester sur une ou plusieurs ligne avec OBJET LIRE TAILLE OPTIMALE
  • décréter que interligne = corps de texte * facteur (avec 1,2 ça ne se passe pas trop mal)

PS
je crois n’avoir plus utilisé Imprimer ligne depuis que j’ai goûté à Imprimer objet.

Merci Arnaud pour ta réponse
j’ai donc essayé ceci mais je n’ai q’une ligne qui s’imprime et plus rien d’autre
je ne suis pas sur de comprendre en faut.
J’ai cru qu’imprimer objet permet d’imprimer l’objet en question quelque soit sa taille
j’ai fait ceci mais ça ne fonctionne pas
<code 4D>
Tableau texte(tabTexte;0
TEXTE VERS TABLEAU(XMLText;tabTexte;500;“Arial”;10)
OUVRIR TACHE IMPRESSION
OUVRIR FORMULAIRE IMPRESSION(“D_XML_impression”)
C_ENTIER($largopti;$hauopti)

boucle($i;1;taille tableau(tabTexte))

XMLTextimprime:=tabTexte{$i}

OBJET LIRE TAILLE OPTIMALE(;“XMLTextimprime”;$largopti;$hauopti)
$fin:=Imprimer objet(
;“XMLTextimprime”;20;20;$largopti;$hauopti)

`SAUT DE PAGE

FERMER TACHE IMPRESSION

fin de boucle
</code 4D>

Merci à toi
alain

le FERMER TACHE IMPRESSION est présent trop tôt. Il doit être en dehors de la boucle

Merci Patrick
Oui bien sûr j’ai rajouter cette boucle pour faire des essais
merci pour avoir vu cette bourde
mais en fait cette commande imprimer objet ne fonctionne pas comme je l’entends
peut-être est-ce dû au faut que je suis en V13
je creuse

merci en tout cas
alain

Je pense que conceptuellement, tu es mal parti : une impression avec Imprimer objet n’a plus rien à voir avec les outils d’impression "historiques " de 4D.
• avec ces derniers, on dessine des objets dans un formulaire. Quand on imprime le formulaire, il imprime ces objets, ni plus ni moins. Impossible de faire de la génération spontanée, on est coincé par les taquets, on part dans des redimensionnements pas possible, on met un bout de code en méthode projet et l’autre en méthode formulaire, etc.
• avec Imprimer objet, on a d’un coté une page blanche, de l’autre un formulaire qui contient quelques “objets type”. Pour imprimer quoi que ce soit dans la page, on doit “prendre” dans le formulaire un objet type, y mettre le contenu à imprimer, le formater, enfin le placer dans la page avec Imprimer objet à l’endroit souhaité.

C’est un peu comme si tu devrais remplir un formulaire écran vide uniquement à coup de DUPLIQUER OBJET…

Je n’ai qu’un formulaire projet “print_template” pour toutes mes impressions avec Imprimer objet :
[]22803264;“Your comment here…”[/]
Il contient un objet type pour chaque type d’objet que je pourrais avoir à imprimer (au demeurant,je crois que je ne me sers que de image, texte, ligne, rectangle).

• étape 1 (genre pas à pas…)
fais-toi un tel formulaire (au passage, une astuce : ajouter une bordure aux objets de ce formulaire simplifie le contrôle des positionnements en phase de mise au point.)

• étape 2
un truc basique, imprimer “hello” en helvetica 14 rouge au centre du haut de page :
<code 4D>
FIXER APERÇU IMPRESSION(Vrai)
OUVRIR TÂCHE IMPRESSION //xxx ouvrante
FORM CHARGER(“print_template”) //je dis où sont mes objets type
LIRE ZONE IMPRESSION($zoneHei_l;$zoneWid_l) //je regarde de quelle surface d’impression je dispose
LIRE MARGE IMPRESSION($mLeft_l;$mTop_l;$mRight_l;$mBottom_l) //il me faut aussi les marges
$pageWid_l:=$zoneWid_l+$mLeft_l+$mRight_l
$pageHei_l:=$zoneHei_l+$mTop_l+$mBottom_l
OBJET FIXER POLICE(;“print_text”;“helvetica”)
OBJET FIXER COULEURS RVB(
;“print_text”;0x00FF0000;Coul arrière plan)
OBJET FIXER ALIGNEMENT HORIZONTAL(;“print_text”;Aligné au centre)
OBJET FIXER TAILLE POLICE(
;“print_text”;14)
$interligne_l:=Ent(141,2)
(OBJET Lire pointeur(Objet nommé;“print_text”))->:=“Hello !” //
$x_l:=0
$y_l:=0
$wid_l:=$zoneWid_l
$hei_l:=$interligne_l
$imp_b:=Imprimer objet(
;“print_text”;$x_l;$y_l;$wid_l;$hei_l)
FERMER TÂCHE IMPRESSION //xxx fermante
</code 4D>

• étape 3
on applique à du texte obtenu avec TABLEAU VERS TEXTE
<code 4D>
FIXER APERÇU IMPRESSION(Vrai)
OUVRIR TÂCHE IMPRESSION //xxx ouvrante
FORM CHARGER(“print_template”)
LIRE ZONE IMPRESSION($zoneHei_l;$zoneWid_l)
LIRE MARGE IMPRESSION($mLeft_l;$mTop_l;$mRight_l;$mBottom_l)
$pageWid_l:=$zoneWid_l+$mLeft_l+$mRight_l
$pageHei_l:=$zoneHei_l+$mTop_l+$mBottom_l
$corps_l:=10
$police_t:=“helvetica”
$avantPlan_l:=0x0000 //noir
$style_l:=Normal
OBJET FIXER POLICE(;“print_text”;$police_t)
OBJET FIXER COULEURS RVB(
;“print_text”;$avantPlan_l;Coul arrière plan)
OBJET FIXER ALIGNEMENT HORIZONTAL(;“print_text”;Aligné à gauche)
OBJET FIXER STYLE POLICE(
;“print_text”;$style_l)
OBJET FIXER TAILLE POLICE(;“print_text”;$corps_l)
$interligne_l:=Ent($corps_l
1,2)
$monTexte_t:=Str_loremIpsum (2000) //texte aléatoire de 2000 caractères
TABLEAU TEXTE($ligne_at;0)
TEXTE VERS TABLEAU($monTexte_t;$ligne_at;$zoneWid_l;$police_t;$corps_l;$style_l)
$x_l:=0
$y_l:=0
Boucle ($i_l;1;Taille tableau($ligne_at))
(OBJET Lire pointeur(Objet nommé;“print_text”))->:=$ligne_at{$i_l}
$wid_l:=$zoneWid_l
$hei_l:=$interligne_l
Si ($i_l%2=0)
OBJET FIXER STYLE POLICE(;“print_text”;$style_l)
OBJET FIXER COULEURS RVB(
;“print_text”;$avantPlan_l;Coul arrière plan)
Sinon
OBJET FIXER STYLE POLICE(;“print_text”;Italique)
OBJET FIXER COULEURS RVB(
;“print_text”;0x00FF0000;Coul arrière plan)
Fin de si
$imp_b:=Imprimer objet(*;“print_text”;$x_l;$y_l;$wid_l;$hei_l)
$y_l:=$y_l+$interligne_l
Fin de boucle
FERMER TÂCHE IMPRESSION //xxx fermante
</code 4D>
(pour rompre l’ennui, j’ai mis une ligne sur 2 en rouge italique)

• étape 4
gérer les sauts de page : dans la boucle, si($x_l + $interligne_l)>$zoneHei_l, faire un saut de page, etc.

Une dernière chose : à chaque fois que j’échange avec des développeurs habitués aux impressions “historiques”, les cheveux se dressent sur la tête quand ils voient la forêt de OBJET FIXER xxx, les positionnements, les calculs de taille et Cie. Mais dès qu’on s’est un peu familiarisé, on remise les autres façons d’imprimer pour bon nombre d’impressions.

PS : je ne voulais pas répondre avant d’avoir (j’espère bien) expliqué le principe d’imprimer objet. Maintenant que c’est fait, ton problème est simple : tu as bien imprimé toutes tes lignes, mais les unes par dessus les autres :wink:

Merci Arnaud
Je vais essayer ce que tu me conseilles
J’ai lu dans la doc que imprimer objet (mais peut-être seulement pour les listbox) s’occupait d’imprimer l’objet éventuellement sur plusieurs pages et qu’il faisait"défiler" ce qu’il y a dans l’objet sur chacune des pages imprimées

il faut peut-être que je relise tout ça

merci en tous les cas

alain

: Alain HAERRI

J’ai lu dans la doc que imprimer objet (mais peut-être seulement pour
les listbox) s’occupait d’imprimer l’objet éventuellement sur
plusieurs pages et qu’il faisait"défiler" ce qu’il y a dans l’objet
sur chacune des pages imprimées
La doc ne peut pas tout expliquer (et là elle n’explique pas grand chose, il est vrai). Pourtant il y existe d’excellents exemples sur Imprimer objet qui m’ont permi de comprendre “comment ça marche”. Mais c’est compter sans le talent très particulier de 4D pour tout disperser aux 4 vents (how do I, notes techniques, TAOW, et ainsi de suite). Ça te donne ce cas d’école : je voulais t’envoyer des liens sur ceux avec lesquels je m’étais familiarisé avec cette commande et suis incapable de les retrouver. Alors qu’il serait si simple que la doc pointe sur ces exemples. On se demande bien à quoi servent les url.

Merci Arnaud
J’ai implémenté ta méthode , l’ai adaptée un peu à ce dont j’ai besoin.
Ce que j’ai compris est que imprimer objet n’arrive pas à faire défiler les lignes de mon texte.
Et qu’il ne sert à rien d’agrandir l’objet pour qu’il contienne tout le texte avant de l’imprimer
Donc plutôt que de le faire défiler pour les imprimer, on subdivise le texte en ligne unique
et on imprime l’objet qui fait qu’une ligne en autant de fois qu’il y a de lignes à imprimer.

ça ressemble malgré tout beaucoup au principe de imprimer ligne

Merci en tout cas
je peux dormir tranquille

alain

: Alain HAERRI

ça ressemble malgré tout beaucoup au principe de imprimer ligne
Dans ce cas particulier de ton texte tu peux le voir comme ça, mais c’est une vision très réductrice d’Imprimer objet. J’ai eu par exemple à faire cet état :

  • un en-tête commun à toutes les pages (logo + texte), plus gros sur la page 1
  • une ou plusieurs pages d’introduction issues de 4D write
  • un pied commun à toutes les pages avec numérotation (page X sur Y)
  • un tableau susceptible de faire plusieurs pages dont certaines colonnes sont imprimées optionnellement, avec intertitres et sous totaux
  • des pages de planches de photos, dont la taille et le nombre par page doit pouvoir varier, avec du texte riche dessous
  • que ça s’adapte aux formats de papier A3, A4, légal US et aux diverses marges
    Peut-être qu’on y arrivera avec Imprimer ligne, mais ce sera un exploit inutile quand Imprimer objet est fait pour ça.

Je signale que http://www.pluggers.nl/pdf-plugin/PDF plugin> de Rob Lavaux semble avoir un principe de construction assez similaire (pages blanches dans laquelle on dépose les éléments). Ça ne m’étonnerait pas qu’on puisse assez facilement convertir du code Imprimer objet en code fonctionnel pour ce plug.

Merci Arnaud,

Je vais peut-être bien modifier mes formulaires impression.
C’est en tout cas assez simple à mettre en place une fois qu’on a compris le principe.
Merci à toi et bon dimanche

Alain Haerri

Ça fait plaisir à lire… :smiley:
Une dernière chose : la doc dit que les paramètres x, y, largeur, hauteur sont des entiers, mais je n’ai pas remarqué de problème à passer des réels (du moins j’en suis sûr en interprété, en compilé il faudrait que je vérifie). En tout cas, étant plus familier du système décimal, souvent je “conçoit en millimètres” et converti avec ça :
<code 4D>
$points:=$millimetres/0,35275
</code 4D>
Pour un résultat entier :
<code 4D>
$points:=$millimetres\0,35275
</code 4D>

Vous êtes en train de réinventer le traitement de texte !
On pouvait faire tout ça avec 4D Write et l’avantage de pouvoir visualiser et corriger le texte avant impression.
4D Write étant condamné à court-terme, il faut espérer que 4D Write Pro va se compléter rapidement.