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 Jeu 24 Nov 2011 - 16:51 | |
| Au secours Klaus, c'est encore moi, je n'arrive pas à imprimer une image avec Print.dll. (incidemment, j'ai fini par déduire que les valeurs doivent être données en pixels, et non en millimètres, mais ce serait bien que ce soit précisé dans la documentation, ainsi que les couleurs au format BGR et non RGB). Voilà ce que je fais, mais je n'arrive pas à comprendre ce que je fais mal, j'obtiens l'erreur: à l'appel de la fonction 7 (impression d'image). L'image est quelconque, jpg, 640x480 - Code:
-
DIM Nprn$, Njob$, HndP%, HndC%, f$, fnt$, sz%, x%, y%, wi%, hi%, k%, txt$, attr$ LABEL Imprimer DLL_ON "DLL\Print.dll"
f$ = "C\Graph\Jpg\Goldgate.jpg": ' image quelconque (640x480) fnt$ = "Arial": sz% = 10 GOSUB Imprimer Message "Terminé !" DLL_OFF TERMINATE
Imprimer: ' choix imprimante Nprn$ = STRING$(255, " ") k% = DLL_CALL2("SelectWindowsPrinter",ADR(Nprn$),LEN(Nprn$)) IF k%<>1 THEN Print "Erreur !": RETURN ' nom du job Njob$ = "Impression planche" k% = DLL_CALL4("PrinterManager",6,ADR(HndP%),ADR(Njob$),LEN(Njob$)) IF k%<>1 THEN Print "Erreur !": RETURN ' orientation portrait k% = DLL_CALL4("PrinterManager",4,ADR(HndP%),ADR(HndC%),0) IF k%<>1 THEN Print "Erreur !": RETURN ' lancement du job k% = DLL_CALL4("PrinterManager",1,ADR(HndP%),ADR(HndC%),0) IF k%<>1 THEN Print "Erreur !": RETURN ' positionnement absolu de l'image + impression x% = 2000: y% = 3000 k% = DLL_CALL6("PrinterFunction",4,ADR(HndP%),ADR(HndC%),0,x%,y%) IF k%<>1 THEN Print "Erreur !": RETURN wi% = 945: hi% = 708: ' = 40x30 mm à 600 dpi k% = DLL_CALL6("PrinterFunction",7,ADR(HndP%),ADR(HndC%),ADR(f$),wi%,hi%) IF k%<>1 THEN Print "Erreur !": RETURN ' impression du texte en x%,y% y% = y% + hi% x% = 2000: y% = 4000: txt$ = "x="+STR$(x%)+", y="+STR$(y%) k%=DLL_CALL6("PrinterPrintText",ADR(txt$),ADR(fnt$),ADR(attr$),sz%,ADR(x%),ADR(y%)) IF k%<>1 THEN Print "Erreur !": RETURN ' fin de job (lancement de l'impression) k% = DLL_CALL4("PrinterManager",3,ADR(HndP%),ADR(HndC%),0) IF k%<>1 THEN Print "Erreur !": RETURN RETURN Même erreur sur un fichier .gif. Sur un .bmp (il existe bien): 'Exception EFOpenError in module Print.dll at 000164B6' | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: DLL Print Jeu 24 Nov 2011 - 21:09 | |
| - Citation :
- 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 ma remarque (page 2): - Citation :
- Ce qui est également gênant c'est que les valeurs de retour des DLL sont de type entier et si je veut faire par la suite des calculs de conversions (inch/pixels/cm) pour la mise en page, il me faut utiliser la division ou multiplication avec des flottants : et là, ce n'est pas compatible...
Par exemple je récupère bien les param de l'imprimante (PDF Creator pour mes essais) : 600 dpi ma page fait 1927 pixels il va bien falloir faire des calculs pour connaitre l'espace que je dois laisser entre chaque ligne... Si tu essaye de diviser par 2.54 tu te fais jeter... donc faut méchamment arrondir... L’idéal, serait, si Klaus veut bien s"y coller et si ça l’intéresse, faire une véritable instruction LPRINT en Delphi... Après tout dans sa DLL, il y a certainement toutes les infos possibles et les calculs y sont grandement facilités... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Jeu 24 Nov 2011 - 21:31 | |
| C'est vrai que tel que c'est ce n'est pas très facile d'accès et il faut rentrer dans le détail... IL faudra sûrement des fonctions pour faire l'interface. Mon calcul d'interligne est faux, certes, mais pour le principe c'est bien proportionnel à la taille de la fonte, ou j'y perds mon latin (le peu que j'ai appris en 6ème). Si tu arrondis tes calculs, tu obtiendras toujours un résultat exact au pixel près, c'est bien suffisant ? il suffit de faire tous les calculs avant puis de prendre l'entier le plus proche (v% = résultat_du_calcul le fait il me semble, équivalent au CINT du basic).
Le LPRINT c'est séduisant, mais si c'est sans paramètres ça va être comme en basic: Courier et taille fixe. Sinon comment définir tous les paramètres d'impression, fonte, taille, enrichissements, couleurs, etc etc...
Dis-moi Nardo, as-tu essayé d'imprimer une image avec Print.dll ? je n'y arrive pas... | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: DLL Print Jeu 24 Nov 2011 - 22:28 | |
| Non j'ai pas essayé... je suis retourné sur mes procédures d'arbre AVL... J'ai perdu pas mal de temps sur cette histoire d'impression et du coup je n'ai pas avancé d'un iota sur le projet en cours... Je jette quand même un coup d'oeil sur ton pb...
Dernière édition par Nardo26 le Jeu 24 Nov 2011 - 22:33, édité 1 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Jeu 24 Nov 2011 - 22:30 | |
| Bon j'attends... au pied de l'arbre (AVI) | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: DLL Print Jeu 24 Nov 2011 - 23:04 | |
| J'y arrive pas : j'obtiens un gros plantage des familles : Si je passe les dimensions ou les adresses des variables contenant les dimensions, j'obtiens la même chose : "Access violation at address 02584467 in module 'Print.dll'. Read of address 00000100." suivi d'un "Runtime error 216 at 0253353A" - Code:
-
DLL_ON "Print.dll" DIM PrtValue% DIM PrtName$: PrtName$=STRING$(255," ") DIM PrtHnd%,PrtCanvHnd% DIM PrtjobName$:PrtJobName$="test" DIM PrtImgName$ DIM PrtOpt% DIM PrtOpt2% ' selection de l'imprimante PrtValue% = DLL_CALL2("SelectWindowsPrinter",ADR(PrtName$),LEN(PrtName$)) PrtValue% = DLL_CALL4("PrinterManager",6,ADR(PrtHnd%),ADR(PrtJobName$),LEN(PrtJobName$)) ' orientation paysage PrtValue% = DLL_CALL4("PrinterManager",4,ADR(PrtHnd%),ADR(PrtCanvHnd%),1) ' Ouverture du job d'impression PrtOpt% = 0 PrtValue% = DLL_CALL4("PrinterManager",1,ADR(PrtHnd%),ADR(PrtCanvHnd%),ADR(PrtOpt%))
PrtOpt%=256 : PrtOpt2%=256 PrtImgName$="c:\essai.png" PrtValue% = DLL_CALL6("PrinterFunction",7,ADR(PrtImgName$),adr(PrtOpt%),adr(PrtOpt2%),0,0)
PrtValue% = DLL_CALL4("PrinterManager",3,ADR(PrtHnd%),ADR(PrtCanvHnd%),0) DLL_OFF
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Jeu 24 Nov 2011 - 23:11 | |
| Merci Nardo, c'est sympa d'avoir essayé, moi c'est à peu près la même chose et ça se termine aussi par un runtime error. Bon, on n'a plus qu'à attendre le retour de Klaus... merci encore et bonne nuit ! Juste une remarque: je vois dans ton code que tu donnes une image .png, or dans la doc il ne parle que de bmp, gif et jpg. Juste une autre remarque, ta formulation me semble incorrecte (toujours d'après la doc, tu écris: - Code:
-
PrtValue% = DLL_CALL6("PrinterFunction",7,ADR(PrtImgName$),adr(PrtOpt%),adr(PrtOpt2%),0,0) je verrais plutôt: - Code:
-
PrtValue% = DLL_CALL6("PrinterFunction",7,ADR(PrtHnd%),ADR(PrtCanvHnd%),ADR(PrtImgName$),adr(PrtOpt%),adr(PrtOpt2%)) les deux derniers paramètres étant les dimensions de l'image imprimée, en pixels.
Dernière édition par JL35 le Jeu 24 Nov 2011 - 23:25, édité 4 fois | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: DLL Print Jeu 24 Nov 2011 - 23:17 | |
| Exact, mais j'ai essayé tout les formats : même topo.... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Jeu 24 Nov 2011 - 23:24 | |
| J'ai édité... sur la formule d'impression.
Ce qui n'est pas très clair, c'est quand il faut donner l'adresse du paramètre ou bien le paramètre lui-même.. opt% ou bien ADR(opt%) ? Pour une chaîne, oui je comprends, mais pour une constante ? uniquement si on attend une mise à jour en retour (par exemple la position d'impression) ? | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: DLL Print Jeu 24 Nov 2011 - 23:32 | |
| Oui tu as raison, j'ai oublier les 2 hnd... mais cela ne corrige toujours pas le problème...Ça marche ! Oui c'est pas très clair : parfois une valeur, parfois une adresse... J'ai fai un test avec une des images du chateau de bignono : - Code:
-
DLL_ON "Print.dll" DIM PrtValue% DIM PrtName$: PrtName$=STRING$(255," ") DIM PrtHnd%,PrtCanvHnd% DIM PrtjobName$:PrtJobName$="test" DIM PrtImgName$ DIM PrtOpt% DIM PrtOpt2% DIM W%,H% ' selection de l'imprimante PrtValue% = DLL_CALL2("SelectWindowsPrinter",ADR(PrtName$),LEN(PrtName$)) PrtValue% = DLL_CALL4("PrinterManager",6,ADR(PrtHnd%),ADR(PrtJobName$),LEN(PrtJobName$)) ' orientation paysage PrtValue% = DLL_CALL4("PrinterManager",4,ADR(PrtHnd%),ADR(PrtCanvHnd%),1) ' Ouverture du job d'impression PrtOpt% = 0 PrtValue% = DLL_CALL4("PrinterManager",1,ADR(PrtHnd%),ADR(PrtCanvHnd%),ADR(PrtOpt%))
PrtOpt%=2048 : PrtOpt2%=1024 PrtImgName$="sk1.bmp" ' on recupère les dimensions de la page: PrtOpt% = DLL_CALL6("PrinterFunction",8,ADR(PrtHnd%),ADR(PrtCanvHnd%),7,0,0) PrtOpt2% = DLL_CALL6("PrinterFunction",8,ADR(PrtHnd%),ADR(PrtCanvHnd%),8,0,0) ' puis on imprime de manière à ce que toute l'image tienne sur la page : PrtValue% = DLL_CALL6("PrinterFunction",7,ADR(PrtHnd%),ADR(PrtCanvHnd%),ADR(PrtImgName$),PrtOpt%,PrtOpt2%)
PrtValue% = DLL_CALL4("PrinterManager",3,ADR(PrtHnd%),ADR(PrtCanvHnd%),0) DLL_OFF
Dernière édition par Nardo26 le Jeu 24 Nov 2011 - 23:42, édité 1 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Jeu 24 Nov 2011 - 23:35 | |
| ça me rassure... si on veut ! Bon, cette fois je vais me coucher la conscience tranquille, bonne nuit !
Zut je viens de voir ta rectification ! alors mon problème reste entier, mais je verrai ça demain ! (je reprendrai ton code pour voir). Et ne te perds pas dans le château de bignono. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: DLL Print Ven 25 Nov 2011 - 12:31 | |
| J'ai fait un petit programme de démo pour montrer les capacités de PrinterTextPrint. Ce programme est basé sur un programme de Nardo26 dont j'ai gardé la structure principale, mais j'ai rajouté ma propre démo. De plus, j'ai introduit une certaine modularité en gardant comme programme principal qu'une série d'appels à des sous-programmes, réalisant chacun une fonction bien précise. La lecture du source en est simplifié, et on peut en extraire facilement certains modules pour usage dans un autre programme. Voici le source: - Code:
-
LABEL EndProg, initialisations, charger_informations LABEL fermeture, remplir_page, editer_cadres LABEL calcul_position, charger_angles LABEL demo_1, demo_2, demo_3, demo_4, demo_5 LABEL demo_6, demo_7, demo_8, demo_9, demo_10
DLL_ON "Print.dll" DIM PRT_FONTSIZE% : PRT_FONTSIZE% = 20 DIM PRT_FONTNAME$ : PRT_FONTNAME$ = "Courier New" ' PrinterManager et PrinterFunction 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_GETVAL% : PRT_GETVAL% = 8 DIM VERTRES% : VERTRES% = 8 DIM HORZRES% : HORZRES% = 7 DIM RECTANGLE% : RECTANGLE% = 1 DIM PRT_FORM% : PRT_FORM% = 2 DIM PRT_POSIT% : PRT_POSIT% = 4 DIM ABSOLU% : ABSOLU% = 0
' Couleur impression DIM RED% : RED% = HEX("0000FF") DIM BLUE% : BLUE%= HEX("FF0000")
DIM PrnHnd%,CanvHnd% DIM PrnVal%,PrnOpt% DIM PrnCar$,PrnAttr$ DIM PrnFont% DIM taille_verticale%, taille_horizontale% DIM rect_detail_x%, rect_detail_y% DIM costab(24), sintab(24), radtab(24)
DIM PrnLigne$,PrnNumLigne% DIM i%, j%, k%, l%, x%, y%
DIM PrinterName$:PrinterName$=STRING$(255," ") DIM JobName$:JobName$ = "essai impression" DIM DemoText$ : DemoText$ = "Démo PrinterTextPrint"
gosub charger_angles gosub initialisations gosub charger_informations gosub remplir_page gosub fermeture
EndProg: Message "Fin du test" DLL_OFF TERMINATE initialisations: ' selection de l'imprimante PrnVal% = DLL_CALL2("SelectWindowsPrinter",ADR(PrinterName$),LEN(PrinterName$)) : PrinterName$=TRIM$(PrinterName$) IF PrnVal%=0 then GOTO EndProg ' titre du job d'impression PrnVal% = DLL_CALL4("PrinterManager",PRT_TITLE%,ADR(PrnHnd%),ADR(JobName$),LEN(JobName$)) IF PrnVal%=0 then GOTO EndProg
' Ouverture du job d'impression PrnOpt% = 0 : PrnVal% = DLL_CALL4("PrinterManager",PRT_STARTJOB%,ADR(PrnHnd%),ADR(CanvHnd%),ADR(PrnOpt%)) IF PrnVal%=0 then GOTO EndProg
prnfont% = 8 return
charger_informations: ' prendre les dimensions utiles de la feuille VERTRES% = DLL_call6("PrinterFunction",PRT_GETVAL%,ADR(PrnHnd%),ADR(CanvHnd%),VERTRES%,0,0) HORZRES% = DLL_call6("PrinterFunction",PRT_GETVAL%,ADR(PrnHnd%),ADR(CanvHnd%),HORZRES%,0,0) return
fermeture: ' Fermeture PrnVal% = DLL_CALL4("PrinterManager",PRT_ENDJOB%,ADR(PrnHnd%),ADR(CanvHnd%),0) return
remplir_page: gosub editer_cadres gosub demo_1 gosub demo_2 gosub demo_3 gosub demo_4 gosub demo_5 gosub demo_6 gosub demo_7 gosub demo_8 gosub demo_9 gosub demo_10 return
editer_cadres: ' on est positionné sur (0,0) ! PrnVal% = DLL_call6("PrinterFunction",PRT_POSIT%,ADR(PrnHnd%),ADR(CanvHnd%),ABSOLU%,10,10) ' on est en (10,10) ' tracer un rectangle extérieur PrnVal% = DLL_call6("PrinterFunction",PRT_FORM%,ADR(PrnHnd%),ADR(CanvHnd%),RECTANGLE%,HORZRES%-30,VERTRES%-30) ' calculer la taille des 2x5 rectangles de la démo ' horizontalement, (taille maxi - 10 - 30 - 3x20)/2 rect_detail_x% = HORZRES%/2 - 50 ' verticalement, (taille maxi - 10 - 30 - 6x20)/2 rect_detail_y% = VERTRES%/5 - 30 ' afficher le 2x5 rectangles des démos for i%=1 to 5 for j%=1 to 2 ' positionner le rectangle gosub calcul_position PrnVal% = DLL_call6("PrinterFunction",PRT_POSIT%,ADR(PrnHnd%),ADR(CanvHnd%),ABSOLU%,x%,y% ) PrnVal% = DLL_call6("PrinterFunction",PRT_FORM%,ADR(PrnHnd%),ADR(CanvHnd%),RECTANGLE%,rect_detail_x%,rect_detail_y%) next j% next i% return
calcul_position: x% = 10 + j%*20 + (j%-1)*rect_detail_x% y% = 10 + i%*20 + (i%-1)*rect_detail_y% return
' test sur droite descendante demo_1: i% = 1 : j% = 1 gosub calcul_position x% = x% + 100 y% = y% + 100 PrnAttr$ = "AXAY" for i%=1 to len(DemoText$) PrnCar$ = mid$(DemoText$,i%,1) PrnVal% = DLL_CALL6("PrinterPrintText",ADR(PrnCar$),ADR(PRT_FONTNAME$),ADR(PrnAttr$),PrnFont%,ADR(x%) ,ADR(y%) ) x% = 30 y% = 30 PrnAttr$ = "RXRY" next i% return
' test sur droite ascendante demo_2: i% = 1 : j% = 2 gosub calcul_position x% = x% + 100 y% = y% + rect_detail_y%-200 PrnAttr$ = "AXAY" for i%=1 to len(DemoText$) PrnCar$ = mid$(DemoText$,i%,1) PrnVal% = DLL_CALL6("PrinterPrintText",ADR(PrnCar$),ADR(PRT_FONTNAME$),ADR(PrnAttr$),PrnFont%,ADR(x%) ,ADR(y%) ) x% = 30 y% = 0-30 PrnAttr$ = "RXRY" next i% return
' de droite à gauche demo_3: i% = 2 : j% = 1 gosub calcul_position x% = x% + rect_detail_x% - 200 y% = y% + rect_detail_y%/2 PrnAttr$ = "AXAY" for i%=1 to len(DemoText$) PrnCar$ = mid$(DemoText$,i%,1) PrnVal% = DLL_CALL6("PrinterPrintText",ADR(PrnCar$),ADR(PRT_FONTNAME$),ADR(PrnAttr$),PrnFont%,ADR(x%) ,ADR(y%) ) x% = 0 - 130 y% = 0 PrnAttr$ = "RX" next i% return
' sur deux lignes qui se croisent, avec des effets couleur demo_4: i% = 2 : j% = 2 gosub calcul_position x% = x% + 100 y% = y% + 100 PrnAttr$ = "AXAY" for i%=1 to len(DemoText$) PrnCar$ = mid$(DemoText$,i%,1) PrnFont% = Bin_Or(bin_and(PrnFont%,255),(255)*256*256+(255)*256) PrnVal% = DLL_CALL6("PrinterPrintText",ADR(PrnCar$),ADR(PRT_FONTNAME$),ADR(PrnAttr$),PrnFont%,ADR(x%) ,ADR(y%) ) x% = 30 y% = 30 PrnAttr$ = "RXRY" next i% i% = 2 : j% = 2 gosub calcul_position x% = x% + 100 y% = y% + rect_detail_y%-200 PrnAttr$ = "AXAY" l% = len(DemoText$) for i%=1 to l% PrnCar$ = mid$(DemoText$,i%,1) PrnFont% = Bin_Or(bin_and(PrnFont%,255),((255-(i%-1)*12)*256*256+(i%*12))*256) PrnVal% = DLL_CALL6("PrinterPrintText",ADR(PrnCar$),ADR(PRT_FONTNAME$),ADR(PrnAttr$),PrnFont%,ADR(x%) ,ADR(y%) ) x% = 30 y% = 0-30 PrnAttr$ = "RXRY" next i% PrnFont% = 8 return
' sur un cercle dans le sens des aiguille d'une montre demo_5: i% = 3 : j% = 1 PrnAttr$ = "AXAY" for k%=1 to len(DemoText$) gosub calcul_position PrnCar$ = mid$(DemoText$,k%,1) x% = x% + rect_detail_x%/2 + costab(k%)*600 y% = y% + rect_detail_y%/2 + sintab(k%)*600 PrnVal% = DLL_CALL6("PrinterPrintText",ADR(PrnCar$),ADR(PRT_FONTNAME$),ADR(PrnAttr$),PrnFont%,ADR(x%) ,ADR(y%) ) next k% return
' sur un cercle dans le sens inverse des aiguille d'une montre demo_6: i% = 3 : j% = 2 PrnAttr$ = "AXAY" for k%=1 to len(DemoText$) gosub calcul_position PrnCar$ = mid$(DemoText$,k%,1) l% = len(DemoText$)+1 - k% x% = x% + rect_detail_x%/2 + costab(l%)*600 y% = y% + rect_detail_y%/2 + sintab(l%)*600 PrnVal% = DLL_CALL6("PrinterPrintText",ADR(PrnCar$),ADR(PRT_FONTNAME$),ADR(PrnAttr$),PrnFont%,ADR(x%) ,ADR(y%) ) next k% return
' sur une spirale dans le sens des aiguille d'une montre demo_7: i% = 4 : j% = 1 PrnAttr$ = "AXAY" for k%=1 to len(DemoText$) gosub calcul_position PrnCar$ = mid$(DemoText$,k%,1) x% = x% + rect_detail_x%/2 + costab(k%)*600*(1-k%/Len(DemoText$)) y% = y% + rect_detail_y%/2 + sintab(k%)*600*(1-k%/Len(DemoText$)) PrnVal% = DLL_CALL6("PrinterPrintText",ADR(PrnCar$),ADR(PRT_FONTNAME$),ADR(PrnAttr$),PrnFont%,ADR(x%) ,ADR(y%) ) next k% return
' sur une spirale dans le sens inversedes aiguille d'une montre demo_8: i% = 4 : j% = 2 PrnAttr$ = "AXAY" for k%=1 to len(DemoText$) gosub calcul_position PrnCar$ = mid$(DemoText$,k%,1) l% = len(DemoText$)+1 - k% x% = x% + rect_detail_x%/2 + costab(l%)*600*(1-k%/Len(DemoText$)) y% = y% + rect_detail_y%/2 + sintab(l%)*600*(1-k%/Len(DemoText$)) PrnVal% = DLL_CALL6("PrinterPrintText",ADR(PrnCar$),ADR(PRT_FONTNAME$),ADR(PrnAttr$),PrnFont%,ADR(x%) ,ADR(y%) ) next k% return
' verticalement de haut en bas demo_9: i% = 5 : j% = 1 gosub calcul_position x% = x% + 100 y% = y% + 100 PrnAttr$ = "AXAY" for i%=1 to len(DemoText$) PrnCar$ = mid$(DemoText$,i%,1) PrnVal% = DLL_CALL6("PrinterPrintText",ADR(PrnCar$),ADR(PRT_FONTNAME$),ADR(PrnAttr$),PrnFont%,ADR(x%) ,ADR(y%) ) x% = 0-40 y% = 60 PrnAttr$ = "RXRY" next i% return
' verticalement de bas en haut demo_10: i% = 5 : j% = 2 gosub calcul_position x% = x% + 100 y% = y% + rect_detail_y%-100 PrnAttr$ = "AXAY" for i%=1 to len(DemoText$) PrnCar$ = mid$(DemoText$,i%,1) PrnVal% = DLL_CALL6("PrinterPrintText",ADR(PrnCar$),ADR(PRT_FONTNAME$),ADR(PrnAttr$),PrnFont%,ADR(x%) ,ADR(y%) ) x% = 0-40 y% = 0-60 PrnAttr$ = "RXRY" next i% return
charger_angles: for i%=1 to 24 radtab(i%) = 3.14/2 - (i%-1)*3.14/12 : ' 90° - (i%-1)*15° costab(i%) = cos(radtab(i%)) sintab(i%) = sin(radtab(i%)) next i% return
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Ven 25 Nov 2011 - 15:11 | |
| Impressionnant ! on comprend quand même mieux avec des exemples, et on voit mieux toutes les possibilités. (quand tu parles de PrinterTextPrint je suppose que tu veux dire PrinterPrintText ?) Je retourne à mon image qui ne veut pas s'imprimer... Une remarque, par rapport à la documentation: dans PrinterFunction, code fonction 2 (dessin à partir de la position active), il semble que les options 2 et 3 ne soient pas les coordonnées du point inférieur droit comme annoncé, mais - dans le cas du rectangle, sa largeur et sa hauteur - dans le cas de la ligne, la largeur et la hauteur du rectangle dont la ligne serait la diagonale (ça c'est moins bien). en effet, opt2 et opt3 sont respectivement la différence entre x_arrivée et x_départ, et y_arrivée et y_départ. Conséquence amusante (?), on ne peut pas tracer une ligne parfaitement horizontale ou verticale, il faut au moins 1 pixel d'écart (opt2 et opt3 ne peuvent pas être nuls). - j'ai essayé l'ellipse, mais je ne sais pas trop comment la définir, même en modifiant des paramètres ça ne change pas grand chose...
ça marche, la position courante est le centre, opt1 et opt2 semblent être la largeur et la hauteur de l'ellipse (comme pour le rectangle). La position courante (au départ) est le coin supérieur gauche du rectangle enveloppant de l'ellipse. Et toujours impossible d'imprimer la moindre image... EDIT Nardo, s'il te plait, par un effet de ta grande bonté, pourrais-tu, si ça ne te dérange pas trop, me montrer ta commande DLL_CALL6 qui t'a permis d'imprimer une image hier ? Que de précautions oratoires, mais quand on est intéressé... ReEDIT j'y arrive avec un BMP, mais avec un JPG j'ai toujours la même erreur: Exception EInvalidGraphic in module Print.dll at 00021B19 | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: DLL Print Sam 26 Nov 2011 - 0:54 | |
| 1. Tu as raison, je voulais effectivement démontrer les possibilités de PrinterPrintText. Merci pour la mise au point.
2. Effectivement, il s'agit de la largeur et hauteur du rectangle et non des coordonnées du coin en bas à droite. Grossière erreur de documentation, qui sera corrigée. Merci bis !
3. Je n'avais même pas pensé au cas de la ligne droite, honte sur moi ! je vais étendre PrinterFunction avec un nouveau code fonction pour pouvoir réaliser cela. Ce sera pour le début de la semaine prochaine...
4. Dans PrinterFunction code 7 (impression d'images), j'ai le même plantage avec des JPG et GIF. Seuls les BMP marchent actuellement. Je ne sais pas pourquoi. Je vais regarder cela. Les valeurs opt2% et opt3% représentent la largeur et la hauteur de l'image, respectivement. L'édition a lieu avec la position active comme coin en haut à gauche de l'image. La documentation sera rectifiée. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Sam 26 Nov 2011 - 10:42 | |
| Merci beaucoup Klaus, me voilà rassuré sur tous les points qui me semblaient obscurs. Une précision concernant les images, c'est implicite mais c'est mieux en le disant: elles sont automatiquement redimensionnées pour tenir dans la largeur et la hauteur demandées (éventuellement déformées, étirées, pour remplir toute la zone, si celle-ci n'est pas au même rapport largeur/hauteur que l'image). Dans la documentation, au sujet de PrinterPrintText, il me semble que la ligne: - Code:
-
Appel: ret% = dll_call6("PrinterPrintText",phnd%,txt%,opt1%,opt2%,opt3%,opt4%) devrait être remplacée par (au vu des exemples donnés, qui fonctionnent): - Code:
-
Appel: ret% = dll_call6("PrinterPrintText",txt%,opt1%,opt2%,opt3%,opt4%,opt5%) c'est sans doute un petit lapsus, mais ça trouble quand on expérimente... Cela dit c'est une dll extrêmement intéressante pour moi, qui résout tous mes problèmes d'impression depuis Panoramic. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: DLL Print Lun 28 Nov 2011 - 17:23 | |
| Exact pour la doc - je vais bien sûr actualiser dans ce sens.
Je suis content que cette DLL corresponde à tes besoins. Si d'autres aspects de l'impression manquent, n'hesite pas à me suggérer des extensions - je les étudierai avec attention.
Je démarre la réalisation de WinTextPrint en Delphi pour remplacer la version Visual Basic 4... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Lun 28 Nov 2011 - 18:18 | |
| Tant qu'à faire appel à une ressource externe, ce sera évidemment plus facile avec un exécutable qu'avec une dll (AMHA). Si je comprends bien ce sera une sorte d'interface en clair avec les fonctions de la dll. En effet la syntaxe des commandes avec la dll est un peu... délicate.
Comme l'appétit vient en mangeant, les idées viendront rapidement avec l'utilisation, et je ne manquerai pas de t'en faire part et d'autres aussi sans doute (avec ta bénédiction), en tout cas d'ores et déjà les possibilités sont vastes et actuellement je ne vois pas trop ce qu'on peut faire de mieux.
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: DLL Print Mar 29 Nov 2011 - 19:05 | |
| Je vais déménager. Et c'est pourquoi ma ligne internet sera coupée demain, pour une durée entre 10 et 15 jours. Mais je continue à travailler sur WinTextPrint en Delphi, et j'aurai bientôt un résultat montrable. Beaucoup de choses marchent déjà - ce qui reste à faire, c'est essentiellement l'impression des images (en cours) et l'impression des PDF (à suivre). Le reste marche déjà. Donc, à bientôt... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Mar 29 Nov 2011 - 20:29 | |
| OK c'est noté. Mais ne perds pas tes billes en cours de route ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: DLL Print Mar 29 Nov 2011 - 23:45 | |
| Une dernière avant de ma coupure d'internet:
PrinterFunction code 7 dans PRINT.DLL peut maintenant imprimer indifféremment les BMP, ICO et JPG. Les GIF sont en préparation. La correction est mise en ligne dans la rubrique DLLs divers.
Et l'impression des mêmes types d'images fonctionne dans WinTextPrint en Delphi. Ca progresse... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Mar 29 Nov 2011 - 23:55 | |
| Super Klaus, j'essaie tout ça dès demain, ça fait largement de quoi patienter. Allez, tu as bien mérité tes 15 jours de vacances (?) ! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: DLL Print Mer 30 Nov 2011 - 17:08 | |
| Encore plus fort: les GIF marchent aussi avec PrinterFunction code 7 de PRINT.DLL, tout comme dans la version Delphi de WinPrintText (WPT.EXE). Et tout est mis en ligne ! | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: DLL Print Mer 30 Nov 2011 - 17:35 | |
| Vous me donnez envie, je crois que je vais tester ça aussi moi ... Juste 2 petites remarques de détail dans la doc, il y a 2/ 3 fautes et comme ce que tu fais est très pro, je pense que tu désireras les corriger. sousligné à changer par souligne milimètres à changer en millimètres
Dernière édition par Jicehel le Mer 30 Nov 2011 - 18:36, édité 1 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: DLL Print Mer 30 Nov 2011 - 18:33 | |
| tu pinailles jicehel, tu desirera à changer en tu desireras | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| | | | 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
| |
| |
| |