FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Compilateur FBPano
par jean_debord Aujourd'hui à 10:54

» demande pour recuperer un text speciale
par pascal10000 Hier à 22:04

» Casse-tête : Echanger les positions des cavaliers
par papydall Hier à 19:51

» KGF_dll - nouvelles versions
par Klaus Hier à 14:29

» Amélioration de la commande HINT
par papydall Mer 19 Juil 2017 - 3:30

» TEST SUR SHAPE
par papydall Mer 19 Juil 2017 - 1:17

» Un challenge à relever
par papydall Mar 18 Juil 2017 - 21:25

» Astuce : Indenter plusieurs lignes de code à la fois
par papydall Mar 18 Juil 2017 - 1:32

» Suggestion pour le forum
par papydall Lun 17 Juil 2017 - 20:28

» Truver les handles des onglets de Panoramic Editor
par Klaus Lun 17 Juil 2017 - 18:20

» Synedit_Editor - nouvelles versions
par Klaus Lun 17 Juil 2017 - 13:46

» Détermine si oui ou non un objet est PARENT d'un autre objet
par Klaus Dim 16 Juil 2017 - 11:58

» Une autre façon de terminer une application.
par papydall Dim 16 Juil 2017 - 3:53

» Déterminer le Handle de l’objet ayant le focus
par papydall Dim 16 Juil 2017 - 3:15

» Déterminer le HANDLE du Bureau
par papydall Dim 16 Juil 2017 - 1:59

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Juillet 2017
LunMarMerJeuVenSamDim
     12
3456789
10111213141516
17181920212223
24252627282930
31      
CalendrierCalendrier

Partagez | 
 

 DLL Print

Voir le sujet précédent Voir le sujet suivant Aller en bas 
Aller à la page : Précédent  1, 2, 3, 4, 5, 6, 7, 8  Suivant
AuteurMessage
JL35



Nombre de messages : 5890
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 17: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 !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 17: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! Smile

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 ? scratch

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


Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
JL35



Nombre de messages : 5890
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 18: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 18:15

C'est bizarre car chez moi j'ai pas d'erreur... scratch
Tu as bien la version 0.9.22 ?...

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
JL35



Nombre de messages : 5890
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 18: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 scratch
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 18: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)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
JL35



Nombre de messages : 5890
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 19: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 scratch
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 19: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).
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
JL35



Nombre de messages : 5890
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 19: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 - 19:30, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 19: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...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
JL35



Nombre de messages : 5890
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 19: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 19: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é... Wink

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

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
JL35



Nombre de messages : 5890
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 20: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 Embarassed
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jicehel

avatar

Nombre de messages : 5841
Age : 44
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 20:15

Argh, il va falloir faire un test des version de DLL alors en plus Nardo !! ^^
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 21:17

Une version pour les DLL ? Ça ce pourrait bien ! Wink

@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 ! Very Happy

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
JL35



Nombre de messages : 5890
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 22:38

Alors comme ça je pourrai recommencer ! Very Happy
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 22:47

Tant que tu veux !!!

PS: J'ai toujours pas trouvé pourquoi mon décalage ne se réalise pas... scratch
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 23: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
JL35



Nombre de messages : 5890
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: DLL Print   Lun 21 Nov 2011 - 23: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...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: DLL Print   Mar 22 Nov 2011 - 0: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: DLL Print   Mar 22 Nov 2011 - 1: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: DLL Print   Mar 22 Nov 2011 - 1: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. geek

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 ? study

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) scratch
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: DLL Print   Mar 22 Nov 2011 - 2: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: DLL Print   Mar 22 Nov 2011 - 2:26

Oui c'est pas mal comme ça !!
J'essayerai de mettre en place demain (tout à l'heure... Wink )
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
JL35



Nombre de messages : 5890
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: DLL Print   Mar 22 Nov 2011 - 16: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 ??? scratch

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 !

Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: DLL Print   

Revenir en haut Aller en bas
 
DLL Print
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 2 sur 8Aller à la page : Précédent  1, 2, 3, 4, 5, 6, 7, 8  Suivant
 Sujets similaires
-
» PRINT dans un Picture: interligne trop petit
» carbon foot print - making of
» Taille des polices pour Print dans un Picture
» [résolu]Google Cloud Print
» Comment changer la couleur du texte....voir print screen

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: Activité des sites créés par les Panoramiciens. :: Le site de Klaus-
Sauter vers: