Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | | Calendrier |
|
|
| DLL Print | |
| | |
Auteur | Message |
---|
JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 15:42 | |
| Effectivement je me suis fié à la doc rtf (et aux commentaires du programme), c'est donc bien du format BGR. J'ai observé avec intérêt la conclusion, et non pas les états d'âme intermédiaires ! | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 15:52 | |
| Bon je sais si c'est moi mais je n'y arrive pas !!! J'ai voulu reprendre tout de A à Z dans l'idée que j'avais pigé quelque chose mais... ça coince... certainement sur un truc tout bête, mais ça coince... (pourtant, j'ai pas pris d'apéro à midi!) Donc dans l'exemple ci-dessous : Je récupère une chaine de caractère et j'imprime un caractère sur 2 en rouge/bold Impression de la 1ere ligne --> ok, ouf ! ça au moins ça marche! Je me suis rendu compte que mes caractères faisaient le yo-yo : en gras, le caractère se trouve plus bas que le caractère normal. Donc je me suis dis : c'est pas grave, je teste si mon attribut est "B" et en fct de cela j'enlève quelques pixels sur les Y... (je suis en absolu donc cela ne devrait pas poser de problème) résultat : j'ai beau retrancher autant de pixels que je veut, mon caractère bold reste toujours à la même place !!! Why ? Mon petit programme de test : - Code:
-
DLL_ON "Print.dll" LABEL EndJob DIM PRT_FONTSIZE% : PRT_FONTSIZE% = 20 DIM PRT_FONTNAME$ : PRT_FONTNAME$ = "Courier New" ' PrinterManager DIM PRT_STARTJOB% : PRT_STARTJOB% = 1 DIM PRT_FORMFEED% : PRT_FORMFEED% = 2 DIM PRT_ENDJOB% : PRT_ENDJOB% = 3 DIM PRT_FORMAT% : PRT_FORMAT% = 4 DIM PRT_TITLE% : PRT_TITLE% = 6 DIM PRT_ABSOLU% : PRT_ABSOLU% = 32768 DIM PRT_RELATIF% : PRT_RELATIF% = 16384
' Couleur impression DIM RED% : RED% = HEX("0000FF") DIM BLUE% : BLUE%= HEX("FF0000") DIM PAYSAGE% : PAYSAGE% = 1
DIM PrnHnd%,CanvHnd% DIM PrnVal%,PrnOpt% DIM PrnCar$,PrnAttr$ DIM PrnX%,PrnY% DIM PrnFont%
DIM PrnLigne$,PrnNumLigne% DIM i%
DIM PrinterName$:PrinterName$=STRING$(255," ") DIM JobName$:JobName$ = "essai impression" ' selection de l'imprimante PrnVal% = DLL_CALL2("SelectWindowsPrinter",ADR(PrinterName$),LEN(PrinterName$)) : PrinterName$=TRIM$(PrinterName$) ' titre du job d'impression PrnVal% = DLL_CALL4("PrinterManager",PRT_TITLE%,ADR(PrnHnd%),ADR(JobName$),LEN(JobName$))
' **************************************************************************************** ' Orientation paysage : ' ATTENTION -> doit obligatoirement être APRES le titre du job et AVANT son ouverture !!! ' **************************************************************************************** PrnVal% = DLL_CALL4("PrinterManager",PRT_FORMAT%,ADR(PrnHnd%),ADR(CanvHnd%),PAYSAGE%)
' Ouverture du job d'impression PrnOpt% = 0 : PrnVal% = DLL_CALL4("PrinterManager",PRT_STARTJOB%,ADR(PrnHnd%),ADR(CanvHnd%),ADR(PrnOpt%))
DIM Pas%,PrnY2% Pas%=TEXT_HEIGHT("T",0)
Pas% = DLL_call6("PrinterFunction",8,ADR(PrnHnd%),ADR(CanvHnd%),6,0,0)
' on veut 1 ligne, donc j'en met 2 !! ;) Pas%=(Pas%/ PRT_FONTSIZE%)*3*2 : ' c'est arrondi (cf valeur entière sur retour de fct DLL)
DATA "ligne 1","ligne 2","ligne 3","ligne 4" DATA "End"
READ PrnLigne$ PrnX%=10 : PrnY%=Pas% PrnNumLigne%=1
WHILE PrnLigne$<>"End" FOR i%=1 TO LEN(PrnLigne$) PrnCar$=MID$(PrnLigne$,i%,1) IF ODD(i%)=1 PrnAttr$="B": ' gras PrnFont%= (RED%*256)+ PRT_FONTSIZE% : ' rouge ELSE PrnAttr$="": ' normal PrnFont%= PRT_FONTSIZE% : ' noir END_IF PrnX%=PrnX%+PRT_ABSOLU% PrnY%=PrnY%+PRT_ABSOLU% ' variable tmp pour traiter la position en Y des caractères en gras PrnY2% = PrnY% ' volontairemenr une grosse valeur : je peut mettre n'importe quoi, ' cela ne bronche pas !!! IF PrnAttr$="B" THEN PrnY2%=PrnY2%-100 PrnVal% = DLL_CALL6("PrinterPrintText",ADR(PrnCar$),ADR(PRT_FONTNAME$),ADR(PrnAttr$),PrnFont%,ADR(PrnX%) ,ADR(PrnY2%) ) NEXT i% ' on passe à la ligne suivante PrnX%=10 : ' debut de ligne PrnNumLigne%=PrnNumLigne%+1 PrnY%=PrnNumLigne%*Pas% : ' 1 ligne en dessous READ PrnLigne$ END_WHILE EndJob: ' Fermeture PrnVal% = DLL_CALL4("PrinterManager",PRT_ENDJOB%,ADR(PrnHnd%),ADR(CanvHnd%),0) DLL_OFF TERMINATE Note : Ce qui déroute et qui fait que je me plante parfois un peu c'est que sur les sous-fonction de PrinterFunction, des fois les paramètres options sont envoyés via leurs adresses et que pour d'autress appel c'est le contenu qui est passé... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 16:06 | |
| J'ai une erreur avec ton programme: Not correct arithmetic expression: Error in Function Line: 76 après acquisition de l'erreur ça imprime une page blanche et ça se termine par un Runtime error. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 16:15 | |
| C'est bizarre car chez moi j'ai pas d'erreur... Tu as bien la version 0.9.22 ?... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 16:22 | |
| Oui, c'est bien la dernière... A part ça j'ai une question de débutant en dll: je vois dans les fonctions dll6, fonction 8: 'retourner une dimension de la feuille' Mais où récupère-t-on le résultat ? dans res% ? il renvoie toujours 1 | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 16:34 | |
| Essaye de mettre un TRACE_ON "debug.txt" : il n'y a que ça pour voir où ça coince... depuis quelques temps la gestion des codes d'erreurs et des n° de ligne ne marche plus...
Sinon oui normalement c'est dans res% que tu obtiens le résultat...
par exemple j'utilise la fct 8 comme ceci : LOGPIXELSY% = DLL_call6("PrinterFunction",8,ADR(PrnHnd%),ADR(CanvHnd%),6,0,0)
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 17:00 | |
| Ok merci Nardo je faisais une petite erreur, ça marche pour moi maintenant. Je regarde pour ton programme... L'erreur est bien ligne 76 sur le PrnVal% = DLL_CALL6... du 1er caractère du 1er data ("ligne 1") Je ne vois pas ce qui cloche | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 17:21 | |
| Essaye en Forçant le Pas% à 150 par exemple... Mon calcul du pas (saut de ligne) doit être daubé et doit fonctionner avec mon imprimante PDFCreator (600dpi).
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 17:25 | |
| Pas% = 150, même punition, même motif...
Maintenant ne te casse pas la tête là-dessus Nardo, si ça marche chez toi c'est l'essentiel, je l'essayais juste par curiosité.
Tu n'as pas essayé le WinTextPrint de notre ami Klaus ? c'est un exécutable appelable en ligne de commande (donc avec Execute_Wait) pour imprimer du texte ou des images, facile d'utilisation (bien plus facile que la dll, avec toutefois moins de possibilités), je m'en sers bien. Tant qu'à faire d'avoir une ressource externe, un exécutable ou une dll ...
Dernière édition par JL35 le Lun 21 Nov 2011 - 17:30, édité 1 fois | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 17:27 | |
| Bon j'ai peut être mal copier mon prog: - Code:
-
LABEL EndProg DLL_ON "Print.dll" DIM PRT_FONTSIZE% : PRT_FONTSIZE% = 20 DIM PRT_FONTNAME$ : PRT_FONTNAME$ = "Courier New" ' PrinterManager DIM PRT_STARTJOB% : PRT_STARTJOB% = 1 DIM PRT_FORMFEED% : PRT_FORMFEED% = 2 DIM PRT_ENDJOB% : PRT_ENDJOB% = 3 DIM PRT_FORMAT% : PRT_FORMAT% = 4 DIM PRT_TITLE% : PRT_TITLE% = 6 DIM PRT_ABSOLU% : PRT_ABSOLU% = 32768 DIM PRT_RELATIF% : PRT_RELATIF% = 16384
' Couleur impression DIM RED% : RED% = HEX("0000FF") DIM BLUE% : BLUE%= HEX("FF0000") DIM PAYSAGE% : PAYSAGE% = 1
DIM PrnHnd%,CanvHnd% DIM PrnVal%,PrnOpt% DIM PrnCar$,PrnAttr$ DIM PrnX%,PrnY% DIM PrnFont%
DIM PrnLigne$,PrnNumLigne% DIM i%
DIM PrinterName$:PrinterName$=STRING$(255," ") DIM JobName$:JobName$ = "essai impression" ' selection de l'imprimante PrnVal% = DLL_CALL2("SelectWindowsPrinter",ADR(PrinterName$),LEN(PrinterName$)) : PrinterName$=TRIM$(PrinterName$) IF PrnVal%=0 Message "Erreur : selection imprimante" GOTO EndProg END_IF ' titre du job d'impression PrnVal% = DLL_CALL4("PrinterManager",PRT_TITLE%,ADR(PrnHnd%),ADR(JobName$),LEN(JobName$)) IF PrnVal%=0 Message "Erreur : Titre" GOTO EndProg END_IF ' **************************************************************************************** ' Orientation paysage : ' ATTENTION -> doit obligatoirement être APRES le titre du job et AVANT son ouverture !!! ' **************************************************************************************** PrnVal% = DLL_CALL4("PrinterManager",PRT_FORMAT%,ADR(PrnHnd%),ADR(CanvHnd%),PAYSAGE%) IF PrnVal%=0 Message "Erreur : Orientation" GOTO EndProg END_IF
' Ouverture du job d'impression PrnOpt% = 0 : PrnVal% = DLL_CALL4("PrinterManager",PRT_STARTJOB%,ADR(PrnHnd%),ADR(CanvHnd%),ADR(PrnOpt%)) IF PrnVal%=0 Message "Erreur : Ouverture du job" GOTO EndProg END_IF
DIM Pas%,PrnY2% Pas%=TEXT_HEIGHT("T",0)
Pas% = DLL_call6("PrinterFunction",8,ADR(PrnHnd%),ADR(CanvHnd%),6,0,0)
' on veut 1 ligne, donc j'en met 2 !! ;) Pas%=(Pas%/ PRT_FONTSIZE%)*3*2 : ' c'est arrondi (cf valeur entière sur retour de fct DLL)
DATA "ligne 1","ligne 2","ligne 3","ligne 4" DATA "End"
READ PrnLigne$ PrnX%=10 : PrnY%=Pas% PrnNumLigne%=1
WHILE PrnLigne$<>"End" FOR i%=1 TO LEN(PrnLigne$) PrnCar$=MID$(PrnLigne$,i%,1) IF ODD(i%)=1 PrnAttr$="B": ' gras PrnFont%= (RED%*256)+ PRT_FONTSIZE% : ' rouge ELSE PrnAttr$="": ' normal PrnFont%= PRT_FONTSIZE% : ' noir END_IF PrnX%=PrnX%+PRT_ABSOLU% PrnY%=PrnY%+PRT_ABSOLU% ' variable tmp pour traiter la position en Y des caractères en gras PrnY2% = PrnY% ' volontairemenr une grosse valeur : je peut mettre n'importe quoi, ' cela ne bronche pas !!! IF PrnAttr$="B" THEN PrnY2%=PrnY2%-100 PrnVal% = DLL_CALL6("PrinterPrintText",ADR(PrnCar$),ADR(PRT_FONTNAME$),ADR(PrnAttr$),PrnFont%,ADR(PrnX%) ,ADR(PrnY2%) ) NEXT i% ' on passe à la ligne suivante PrnX%=10 : ' debut de ligne PrnNumLigne%=PrnNumLigne%+1 PrnY%=PrnNumLigne%*Pas% : ' 1 ligne en dessous READ PrnLigne$ END_WHILE ' Fermeture PrnVal% = DLL_CALL4("PrinterManager",PRT_ENDJOB%,ADR(PrnHnd%),ADR(CanvHnd%),0)
EndProg: Message "Fin du test" DLL_OFF TERMINATE Celui-là, je l'ai lancé une dizaine de fois et il fonctionne... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 17:31 | |
| On s'est croisés, je reessaye avec celui-là
Désolé c'est pareil: Not correct arithmetic expression: Error in Function. Line: 91 même endroit ça doit appeler quelque part une ressource que tu as et que je n'ai pas...
Edit c'est ma Faute !!!! je mets mes dll dans un répertoire \dll et il faut que je change le DLL_ON Suis-je bête ! (ce n'est pas une question)
Ben voyons, effectivement ça marche beaucoup mieux comme ça ! Et je constate que tes caractères gras sont effectivement plus bas de quelques pixels...
Cette erreur c'est toujours cette même histoire de ressources externes (dll ou autres) qui me rend un peu réticent: si on ne les met pas avec le source elles ne sont pas trouvées, ou alors il faut mettre le chemin complet. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 17:57 | |
| Ça me rassure que ce soit cela... Cela prouve aussi que quelque chose ne marche plus dans la gestion des erreurs: tu n'as pas eu de message d'erreur sur le DLL_ON... Bon je trouve toujours pas mon erreur... ça doit être tellement gros que je passe à côté... PS: J'ai prévu dans mon prog de tester la présence ou non de la DLL et en fct du résultat avoir l'option "imprimer" ou non. De cette manière, pas d'erreur d'execution et le programme fonctionnera même sans DLL... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 18:09 | |
| Oui, étonnant que je n'aie eu aucune erreur sur le DLL_ON, c'est pour ça que ça m'avait échappé... Rectification, c'est normal ! Parce que j'ai bien un print.dll avec mes sources, qui date de septembre 2010. Et j'ai mis la nouvelle version à un autre endroit... Alors il trouvait bien la vieille version et c'est celle-là qu'il cherchait à exécuter... Il faut que je fasse un peu de ménage... Désolé, je t'ai fait perdre ton temps précieux | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 18:15 | |
| Argh, il va falloir faire un test des version de DLL alors en plus Nardo !! ^^ | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 19:17 | |
| Une version pour les DLL ? Ça ce pourrait bien ! @JL35 : Tu ne me fais pas perdre du temps ! C'est toujours bien d'avoir quelqu'un qui cherches en même temps que toi ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 20:38 | |
| Alors comme ça je pourrai recommencer ! | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 20:47 | |
| Tant que tu veux !!! PS: J'ai toujours pas trouvé pourquoi mon décalage ne se réalise pas... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 21:20 | |
| Je suis revenu et je vais jeter un coup d'oeuil.
Jus une petite précision: la position active, celle où débute l'impression, représente le coin en haut à gauche tu texte à imprimer ! Et si l'on change d'attribut dans la même ligne (gras/non-gras en particulier), les lettres n'ont plus le même gabarit et il peut for bien y avoir un décalage.
Mais j'ai pris ton programme et je vais voir. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 21:21 | |
| Comme tu imprimes caractère par caractère, je n'ai pas compris ces 2 lignes: - Code:
-
PrnX%=PrnX%+PRT_ABSOLU% PrnY%=PrnY%+PRT_ABSOLU% Je ne comprends pas l'incrémentation de la position X, quelle valeur ? 1er caractère PrnX% = 10 + 32768 = 32778 2ème caractère PrnX% = PrnX% + 32768 = 65546 ? etc. Je ne comprends pas non plus l'incrémentation de PrnY% à chaque caractère, ça ne devrait pas changer sur la même ligne ? Autre question: Pas% semble être l'interligne, en pixels. alors je ne comprends pas la formule Pas%=(Pas%/ PRT_FONTSIZE%)*3*2 Est-ce que ça ne devrait pas être proportionnel à la taille de la fonte ? Bref je ne comprends pas grand chose... et pourtant ça marche ! (au décalage près pour le gras) Effectivement comme tu dis Klaus, la position demandée étant le haut à gauche ça décale les caractères gras vers le bas. Il faudrait pouvoir les aligner par leur base (comme dans un traitement de textes), et non par leur sommet comme on fait ici... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 22:15 | |
| Voilà, j'ai trouvé. Je te poste ci-après la version corrigée. Voici mes remarques: Ta logique, de manière générale, était la bonne. Mais lorsque tu t'es rendu compte du décalage, ty as introduit une nouvelle variable PrnY2%, et c'est cette variable dont tu passes l'adresse à PrinterPrintText. C'est donc PrnY2% qui au retour reçoit l'ordonnée en absolu (SANS la marque 32768) et non PrnY%, dans laquelle à chaque passage les 32768 s'additionnent... J'ai corrigé cela en mettant des commentaires, et du coup, le décalage fonctionne correctement, avec n'importe quelle valeur. En faisant des essais, j'ai trouvé -8 comme décalage approprié. Et pour le déterminer, j'ai introduit "llll" dans les 4 lignes pour pouvoir "viser". Pour la même raison, j'ai ajouté l'attribut U (sousligné) ce qui permet de visualiser la base des caractères. Je rappelle que la position de début d'impression donne le coin en haut à gauche du texte à imprimer, et que la hauteur réelle ainsi que la largeur, donc le gabarit, dépend de la police, de la taille de la police et des attributs. Si l'un ou l'autre des éléments change sur une ligne, on ne peut en aucun cas présupposer que les caractères soient tous posés sur un même alignement horizontal par rapport à leur base - ils sont bien alignés, mais par rapport aux hauts des caractères. - Code:
-
LABEL EndProg DLL_ON "Print.dll" DIM PRT_FONTSIZE% : PRT_FONTSIZE% = 20 DIM PRT_FONTNAME$ : PRT_FONTNAME$ = "Courier New" ' PrinterManager DIM PRT_STARTJOB% : PRT_STARTJOB% = 1 DIM PRT_FORMFEED% : PRT_FORMFEED% = 2 DIM PRT_ENDJOB% : PRT_ENDJOB% = 3 DIM PRT_FORMAT% : PRT_FORMAT% = 4 DIM PRT_TITLE% : PRT_TITLE% = 6 DIM PRT_ABSOLU% : PRT_ABSOLU% = 32768 DIM PRT_RELATIF% : PRT_RELATIF% = 16384
' Couleur impression DIM RED% : RED% = HEX("0000FF") DIM BLUE% : BLUE%= HEX("FF0000") DIM PAYSAGE% : PAYSAGE% = 1
DIM PrnHnd%,CanvHnd% DIM PrnVal%,PrnOpt% DIM PrnCar$,PrnAttr$ DIM PrnX%,PrnY% DIM PrnFont%
DIM PrnLigne$,PrnNumLigne% DIM i%
DIM PrinterName$:PrinterName$=STRING$(255," ") DIM JobName$:JobName$ = "essai impression" ' selection de l'imprimante PrnVal% = DLL_CALL2("SelectWindowsPrinter",ADR(PrinterName$),LEN(PrinterName$)) : PrinterName$=TRIM$(PrinterName$) IF PrnVal%=0 Message "Erreur : selection imprimante" GOTO EndProg END_IF ' titre du job d'impression PrnVal% = DLL_CALL4("PrinterManager",PRT_TITLE%,ADR(PrnHnd%),ADR(JobName$),LEN(JobName$)) IF PrnVal%=0 Message "Erreur : Titre" GOTO EndProg END_IF ' **************************************************************************************** ' Orientation paysage : ' ATTENTION -> doit obligatoirement être APRES le titre du job et AVANT son ouverture !!! ' **************************************************************************************** PrnVal% = DLL_CALL4("PrinterManager",PRT_FORMAT%,ADR(PrnHnd%),ADR(CanvHnd%),PAYSAGE%) IF PrnVal%=0 Message "Erreur : Orientation" GOTO EndProg END_IF
' Ouverture du job d'impression PrnOpt% = 0 : PrnVal% = DLL_CALL4("PrinterManager",PRT_STARTJOB%,ADR(PrnHnd%),ADR(CanvHnd%),ADR(PrnOpt%)) IF PrnVal%=0 Message "Erreur : Ouverture du job" GOTO EndProg END_IF
DIM Pas%,PrnY2% Pas%=TEXT_HEIGHT("T",0)
Pas% = DLL_call6("PrinterFunction",8,ADR(PrnHnd%),ADR(CanvHnd%),6,0,0)
' on veut 1 ligne, donc j'en met 2 !! ;) Pas%=(Pas%/ PRT_FONTSIZE%)*3*2 : ' c'est arrondi (cf valeur entière sur retour de fct DLL)
DATA "ligne 1 llll","ligne 2 llll","ligne 3 llll","ligne 4 llll" : ' ajout de "llll" pour pouvoir viser DATA "End"
READ PrnLigne$ PrnX%=10 : PrnY%=Pas% PrnNumLigne%=1
WHILE PrnLigne$<>"End" FOR i%=1 TO LEN(PrnLigne$) PrnCar$=MID$(PrnLigne$,i%,1) IF ODD(i%)=1 PrnAttr$="BU": ' gras PrnFont%= (RED%*256)+ PRT_FONTSIZE% : ' rouge ELSE PrnAttr$="U": ' normal PrnFont%= PRT_FONTSIZE% : ' noir END_IF PrnX%=PrnX%+PRT_ABSOLU% ' PrnY%=PrnY%+PRT_ABSOLU% : ' ******** ne pas ajouter ici, sinon, cela se cumule à l'infini... ' variable tmp pour traiter la position en Y des caractères en gras PrnY2% = PrnY% + PRT_ABSOLU% : ' ********* ajouter "ABSOLU" ici, sinon, les 32768 se cumulent... ! IF PrnAttr$="BU" THEN PrnY2%=PrnY2%-8 : ' ******* décalage approprié PrnVal% = DLL_CALL6("PrinterPrintText",ADR(PrnCar$),ADR(PRT_FONTNAME$),ADR(PrnAttr$),PrnFont%,ADR(PrnX%) ,ADR(PrnY2%) ) NEXT i% ' on passe à la ligne suivante PrnX%=10 : ' debut de ligne PrnNumLigne%=PrnNumLigne%+1 PrnY%=PrnNumLigne%*Pas% : ' 1 ligne en dessous READ PrnLigne$ END_WHILE ' Fermeture PrnVal% = DLL_CALL4("PrinterManager",PRT_ENDJOB%,ADR(PrnHnd%),ADR(CanvHnd%),0)
EndProg: Message "Fin du test" DLL_OFF TERMINATE Maintenant, à la faveur de ces tests, je me suis rendu compte qu'il y a un probème avec les décalages relatifs négatifs. Ceci ne concerne par la solution donnée ci-dessus puisque tu passes par des positionnements absolus, mais je dois résoudre ce problème tout de même. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 23:17 | |
| J'ai corrigé le problème de décalage négatif en cas de décalage relatif. Techniquement, c'est bon, et je mets ci-dessous une version modifiée du programme de Nardo26 utilisant le déplacement relatif à la place du déplacement absolu. Ceci permet, en cas de lettres en gras de faire un -8 relatif, suivi d'un °8 relatif pour les lettres normales. - Code:
-
LABEL EndProg DLL_ON "Print.dll" DIM PRT_FONTSIZE% : PRT_FONTSIZE% = 20 DIM PRT_FONTNAME$ : PRT_FONTNAME$ = "Courier New" ' PrinterManager DIM PRT_STARTJOB% : PRT_STARTJOB% = 1 DIM PRT_FORMFEED% : PRT_FORMFEED% = 2 DIM PRT_ENDJOB% : PRT_ENDJOB% = 3 DIM PRT_FORMAT% : PRT_FORMAT% = 4 DIM PRT_TITLE% : PRT_TITLE% = 6 DIM PRT_ABSOLU% : PRT_ABSOLU% = 32768 DIM PRT_RELATIF% : PRT_RELATIF% = 16384
' Couleur impression DIM RED% : RED% = HEX("0000FF") DIM BLUE% : BLUE%= HEX("FF0000") DIM PAYSAGE% : PAYSAGE% = 1
DIM PrnHnd%,CanvHnd% DIM PrnVal%,PrnOpt% DIM PrnCar$,PrnAttr$ DIM PrnX%,PrnY% DIM PrnFont%
DIM PrnLigne$,PrnNumLigne% DIM i%
DIM PrinterName$:PrinterName$=STRING$(255," ") DIM JobName$:JobName$ = "essai impression" ' selection de l'imprimante PrnVal% = DLL_CALL2("SelectWindowsPrinter",ADR(PrinterName$),LEN(PrinterName$)) : PrinterName$=TRIM$(PrinterName$) IF PrnVal%=0 Message "Erreur : selection imprimante" GOTO EndProg END_IF ' titre du job d'impression PrnVal% = DLL_CALL4("PrinterManager",PRT_TITLE%,ADR(PrnHnd%),ADR(JobName$),LEN(JobName$)) IF PrnVal%=0 Message "Erreur : Titre" GOTO EndProg END_IF ' **************************************************************************************** ' Orientation paysage : ' ATTENTION -> doit obligatoirement être APRES le titre du job et AVANT son ouverture !!! ' **************************************************************************************** PrnVal% = DLL_CALL4("PrinterManager",PRT_FORMAT%,ADR(PrnHnd%),ADR(CanvHnd%),PAYSAGE%) IF PrnVal%=0 Message "Erreur : Orientation" GOTO EndProg END_IF
' Ouverture du job d'impression PrnOpt% = 0 : PrnVal% = DLL_CALL4("PrinterManager",PRT_STARTJOB%,ADR(PrnHnd%),ADR(CanvHnd%),ADR(PrnOpt%)) IF PrnVal%=0 Message "Erreur : Ouverture du job" GOTO EndProg END_IF
DIM Pas%,PrnY2% Pas%=TEXT_HEIGHT("T",0)
Pas% = DLL_call6("PrinterFunction",8,ADR(PrnHnd%),ADR(CanvHnd%),6,0,0)
' on veut 1 ligne, donc j'en met 2 !! ;) Pas%=(Pas%/ PRT_FONTSIZE%)*3*2 : ' c'est arrondi (cf valeur entière sur retour de fct DLL)
DATA "ligne 1 llll","ligne 2 llll","ligne 3 llll","ligne 4 llll" : ' ajout de "llll" pour pouvoir viser DATA "End"
READ PrnLigne$ PrnX%=10 : PrnY%=Pas% PrnNumLigne%=1
WHILE PrnLigne$<>"End" FOR i%=1 TO LEN(PrnLigne$) PrnCar$=MID$(PrnLigne$,i%,1) IF ODD(i%)=1 PrnAttr$="BU": ' gras PrnFont%= (RED%*256)+ PRT_FONTSIZE% : ' rouge ELSE PrnAttr$="U": ' normal PrnFont%= PRT_FONTSIZE% : ' noir END_IF PrnX%=PrnX%+PRT_ABSOLU% ' PrnY%=PrnY%+PRT_ABSOLU% : ' ******** ne pas ajouter ici, sinon, cela se cumule à l'infini... ' variable tmp pour traiter la position en Y des caractères en gras PrnY2% = PrnY% + PRT_ABSOLU% : ' ********* ajouter "ABSOLU" ici, sinon, les 32768 se cumulent... ! ' IF PrnAttr$="BU" THEN PrnY2%=PrnY2%-8 : ' ******* décalage approprié if i%>1 if PrnAttr$="BU" PrnY2% = bin_and(-8,hex("3FFF")) + 16384 else PrnY2% = 8 + 16384 end_if end_if PrnVal% = DLL_CALL6("PrinterPrintText",ADR(PrnCar$),ADR(PRT_FONTNAME$),ADR(PrnAttr$),PrnFont%,ADR(PrnX%) ,ADR(PrnY2%) ) NEXT i% ' on passe à la ligne suivante PrnX%=10 : ' debut de ligne PrnNumLigne%=PrnNumLigne%+1 PrnY%=PrnNumLigne%*Pas% : ' 1 ligne en dessous READ PrnLigne$ END_WHILE ' Fermeture PrnVal% = DLL_CALL4("PrinterManager",PRT_ENDJOB%,ADR(PrnHnd%),ADR(CanvHnd%),0)
EndProg: Message "Fin du test" DLL_OFF TERMINATE Mais là, on voit bien la difficulté de bien coder les valeurs pour un déplacement relatif négatif: - Code:
-
PrnY2% = bin_and(-8,hex("3FFF")) + 16384
En effet, une valeur négative est représentée sur 32 bits, et ajouter 16384 ne donnera pas le bon résultat. D'où la formule ci-dessus. Je réfléchis à une solution élégante à ce problème. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: DLL Print Lun 21 Nov 2011 - 23:27 | |
| Oui en effet Klaus, tu as raison : c'était tout simple en effet, je l'avais devant les yeux et je ne l'ai pas vu... Par contre, pour le décalage de 8 pixels cela marche pour un fontsize de 20, si tu t'amuses à changer la valeur, le décalage ne correspond plus. Pour calculer le nb de ligne max que je peux mettre dans une page au format A4: Je suppose que tout est lié avec le DPI. Reste à savoir comment traduire la taille de la fonte en mm Si je me trompe pas : 600 dpi -> 600 px / 2.54 cm c'est bien ça ? Donc pour une fonte de 20, (20 quoi d'ailleurs? pica/didot/pixel/autre?) on devrais avoir une taille en mm de combien ? (apparemment faire une règle de 3 ne suffit pas) | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: DLL Print Mar 22 Nov 2011 - 0:21 | |
| Tu as raison - une règle de trois ne suffit pas. J'ai dit ci-dessus de quoi ça dépend, et le seul moyen, c'est d'expérimenter. Pour ma part, je fais les essais avec le driver CreatePDF comme imprimante, et cela m'affiche le résultat en PDF à l'écran, et je n'ai pas à m'embêter avec les impressions réelles. Tu as sûrement trouvé un moyen similaire. Ceci dit, j'ai trouvé une solution plus cohérente et plus élégante pour le positionnement absolu ou relatif, dans cette routine. Je l'ai remis en ligne et j'ai actualisé la doc. Il n'y a plus de marqueur 16384 ni 32768 ! On met simplement les valeurs voulues. Par défaut, il s'agit de positionnements absolues. Si l'on souhaite un positionnement relatif, on ajoute RX ou RY dans la chaîne des attributs ! Si l'on veut maintenir une des coordonnées, il faut mettre zéro dans la valeur correspondante. ET alors, comment positionner réellement en ligne zéro et/ou colonne zéro ? Tout simplement en ajoutant AX et/ou AY dans la chaîne des attributs ! Voici ton programme adapté à cela, avec les positionnements absolus pour les premiers caractères de chaque ligne, et relatifs pour tous les autres: - Code:
-
LABEL EndProg DLL_ON "Print.dll" DIM PRT_FONTSIZE% : PRT_FONTSIZE% = 20 DIM PRT_FONTNAME$ : PRT_FONTNAME$ = "Courier New" ' PrinterManager DIM PRT_STARTJOB% : PRT_STARTJOB% = 1 DIM PRT_FORMFEED% : PRT_FORMFEED% = 2 DIM PRT_ENDJOB% : PRT_ENDJOB% = 3 DIM PRT_FORMAT% : PRT_FORMAT% = 4 DIM PRT_TITLE% : PRT_TITLE% = 6 DIM PRT_ABSOLU% : PRT_ABSOLU% = 32768 DIM PRT_RELATIF% : PRT_RELATIF% = 16384
' Couleur impression DIM RED% : RED% = HEX("0000FF") DIM BLUE% : BLUE%= HEX("FF0000") DIM PAYSAGE% : PAYSAGE% = 1
DIM PrnHnd%,CanvHnd% DIM PrnVal%,PrnOpt% DIM PrnCar$,PrnAttr$ DIM PrnX%,PrnY% DIM PrnFont%
DIM PrnLigne$,PrnNumLigne% DIM i%
DIM PrinterName$:PrinterName$=STRING$(255," ") DIM JobName$:JobName$ = "essai impression" ' selection de l'imprimante PrnVal% = DLL_CALL2("SelectWindowsPrinter",ADR(PrinterName$),LEN(PrinterName$)) : PrinterName$=TRIM$(PrinterName$) IF PrnVal%=0 Message "Erreur : selection imprimante" GOTO EndProg END_IF ' titre du job d'impression PrnVal% = DLL_CALL4("PrinterManager",PRT_TITLE%,ADR(PrnHnd%),ADR(JobName$),LEN(JobName$)) IF PrnVal%=0 Message "Erreur : Titre" GOTO EndProg END_IF ' **************************************************************************************** ' Orientation paysage : ' ATTENTION -> doit obligatoirement être APRES le titre du job et AVANT son ouverture !!! ' **************************************************************************************** PrnVal% = DLL_CALL4("PrinterManager",PRT_FORMAT%,ADR(PrnHnd%),ADR(CanvHnd%),PAYSAGE%) IF PrnVal%=0 Message "Erreur : Orientation" GOTO EndProg END_IF
' Ouverture du job d'impression PrnOpt% = 0 : PrnVal% = DLL_CALL4("PrinterManager",PRT_STARTJOB%,ADR(PrnHnd%),ADR(CanvHnd%),ADR(PrnOpt%)) IF PrnVal%=0 Message "Erreur : Ouverture du job" GOTO EndProg END_IF
DIM Pas%,PrnY2% Pas%=TEXT_HEIGHT("T",0)
Pas% = DLL_call6("PrinterFunction",8,ADR(PrnHnd%),ADR(CanvHnd%),6,0,0)
' on veut 1 ligne, donc j'en met 2 !! ;) Pas%=(Pas%/ PRT_FONTSIZE%)*3*2 : ' c'est arrondi (cf valeur entière sur retour de fct DLL)
DATA "ligne 1 llll","ligne 2 llll","ligne 3 llll","ligne 4 llll" : ' ajout de "llll" pour pouvoir viser DATA "End"
READ PrnLigne$ PrnX%=10 : PrnY%=Pas% PrnNumLigne%=1
WHILE PrnLigne$<>"End" FOR i%=1 TO LEN(PrnLigne$) PrnCar$=MID$(PrnLigne$,i%,1) IF ODD(i%)=1 PrnAttr$="BU": ' gras PrnFont%= (RED%*256)+ PRT_FONTSIZE% : ' rouge ELSE PrnAttr$="U": ' normal PrnFont%= PRT_FONTSIZE% : ' noir END_IF if i%>1 then PrnAttr$ = PrnAttr$ + "RY" PrnY2% = PrnY% if i%>1 if PrnAttr$="BURY" PrnY2% = -8 else PrnY2% = 8 end_if end_if PrnVal% = DLL_CALL6("PrinterPrintText",ADR(PrnCar$),ADR(PRT_FONTNAME$),ADR(PrnAttr$),PrnFont%,ADR(PrnX%) ,ADR(PrnY2%) ) NEXT i% ' on passe à la ligne suivante PrnX%=10 : ' debut de ligne PrnNumLigne%=PrnNumLigne%+1 PrnY%=PrnNumLigne%*Pas% : ' 1 ligne en dessous READ PrnLigne$ END_WHILE ' Fermeture PrnVal% = DLL_CALL4("PrinterManager",PRT_ENDJOB%,ADR(PrnHnd%),ADR(CanvHnd%),0)
EndProg: Message "Fin du test" DLL_OFF TERMINATE Je pense que c'est assez cohérent comme ça. J'ai dû recourir à une "contraction" de paramètres en mélangeant attributs graphiques et choix absolu/relatif dans un même paramètre, tout comme dans la version précédente, où ce mélange était fait dans les coordonnées horizontales et verticales, car Panoramic ne permet que 6 paramètres pour une fonction dans une DLL, et il en faudrait évidemment plus. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: DLL Print Mar 22 Nov 2011 - 0:26 | |
| Oui c'est pas mal comme ça !! J'essayerai de mettre en place demain (tout à l'heure... ) | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Mar 22 Nov 2011 - 14:36 | |
| Je crois comprendre que les valeurs de positionnement sont données en millimètres (et non en pixels, comme je l'ai cru tout d'abord), dites-moi si je me trompe (ça ne semble pas précisé dans la documentation). @Nardo, dans ton programme de test, Pas% est bien le calcul de l'interligne ? Dans ce cas je suis surpris de voir la taille de fonte au dénominateur du calcul, la hauteur de ligne est donc inversement proportionnelle à la taille de la fonte ??? Si on suppose qu'une taille de 20 c'est 20 pixels (ce n'est sans doute pas vrai mais bon, pour le raisonnement), je verrais mieux quelque chose comme: Pas% = DLL_CALL6(... Fonction 8 option 6 -> résolution verticale en dpi Pas% = (PRT_FONT_SIZE% * 25.4) / Pas%, en millimètres @Klaus ton exemple ne marche pas (chez moi), il imprime seulement les deux premiers caractères de la 1ère ligne.Pardon, je n'ai pas rechargé le dernier Print.dll... je fais ça. Effectivement, c'est mieux comme ça ! | |
| | | Contenu sponsorisé
| Sujet: Re: DLL Print | |
| |
| | | | DLL Print | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |