PB à toute heure et à tout moment. (à parcourir avec modération)

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 19-08-2011 16:44:13

mattdamon  
Le Tuniso-Parisien
Lieu: Livry-Gargan 93190
Date d'inscription: 29-12-2007
Messages: 569
Pépites: 89
Banque: 77,512,666,613,392,940

[RESOLU] Problème d'impression

Bonjour à tous,

Je reviens vers vous après une absence de à peu près 4 mois.

j'avais un problème d'impression d'une fenêtre (qui contient plusieurs datawindow).

Pour imprimer une hardcopie de l'écran, je fais PrintScreen (...). mais là ça marchait plus..

Je suis obligé chaque fois d'aller dans la gestionnaire d'imprimantes de Windows et faire tout
simplement décocher puis cocher l'option "Assemblage (collate)" et après je lance l'impression et là ça marche bien.

Coté PWB, j'ai essayé de modifier la valeur collate de la datawindow, mais ça marche pas:

Code: pb

ma_datawindow.Modify("Datawindow.Print.Collate=no")



Pour moi, la seule méthode est de chercher une fonction d'API windows appelée au niveau PWb pour décocher puis cocher
l'option "Assemblage (collate)" de la gestionnaire d'imprimantes de Windows.

Est-ce que quelqu'un entre vous connais le nom de la fonction ou DLL que je peux l'utiliser ?

Le probleme déja abordé juste ici : http://pbadonf.fr/forum/viewtopic.php?pid=27674#p27674

Merci d'avance les Pbadonfeurs

powerBuilder 11.2
oracle 10
Imprimente Lexmark


Bon weekend

Dernière modification par mattdamon (22-08-2011 19:42:05)

Hors ligne

 

#2 20-08-2011 11:18:54

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [RESOLU] Problème d'impression

Bonjour,

mattdamon a écrit:

Je suis obligé chaque fois d'aller dans la gestionnaire d'imprimantes de Windows et faire tout
simplement décocher puis cocher l'option "Assemblage (collate)" et après je lance l'impression et là ça marche bien.

Pourquoi ne pas tout simplement définir une 2ème imprimante avec cette option décochée et de l'appeler lors de l'impression ?


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#3 20-08-2011 13:23:01

mattdamon  
Le Tuniso-Parisien
Lieu: Livry-Gargan 93190
Date d'inscription: 29-12-2007
Messages: 569
Pépites: 89
Banque: 77,512,666,613,392,940

Re: [RESOLU] Problème d'impression

erasorz a écrit:

Bonjour,

mattdamon a écrit:

Je suis obligé chaque fois d'aller dans la gestionnaire d'imprimantes de Windows et faire tout
simplement décocher puis cocher l'option "Assemblage (collate)" et après je lance l'impression et là ça marche bien.

Pourquoi ne pas tout simplement définir une 2ème imprimante avec cette option décochée et de l'appeler lors de l'impression ?

Le problème c'est que chaque utilisateur définit une imprimente par défaut propre à lui.
mais ce qui est bizarre lors de mes tests, quand je lance l'impression la fonction PrintScreen () me retourne 1 (c'et ok) mais la fenetre s'imprime plus..

et comme j'ai cherché sur pbadonf, j'ai remarqué qu'il faut aller dans la gestionnaire d'imprimantes de Windows et de faire reactiver l'option "Assemblage (collate)" et après je relance l'impression une 2 ième fois et là ça marche très bien, vraiment comportement bizarre !!!

d'après tout ça, j'ai remarqué qu'il faut reactivé les spooler d'impression pour que PB puisse imprimer, peux être ça la raison, je sais plus

pour cela j'ai pensé de réactiver cette option automatiquement dans le code et pas surtout manuellement par ce que les utilisateurs n'aiment pas ce type de manipulation ..

J'espère que tu as compris le problème et l'idée

merci

Dernière modification par mattdamon (20-08-2011 13:23:48)

Hors ligne

 

#4 20-08-2011 21:56:54

mattdamon  
Le Tuniso-Parisien
Lieu: Livry-Gargan 93190
Date d'inscription: 29-12-2007
Messages: 569
Pépites: 89
Banque: 77,512,666,613,392,940

Re: [RESOLU] Problème d'impression

Je vous explique un peu mon problème :

Le PrintScreen () ça fonctionne pas juste  la première fois.. mais le fait d'aller dans la gestionnaire d'imprimantes de Windows et de cocher puis décocher l'option "Assemblage (collate)"  après je lance l'impression et dans ce cas cette fonction PB fontionne très bien.. et la page s'imprime. J'arrive aussi à imprimer des autres fenetres sans répéter chaque fois la manip de cocher/décocher de collate .


J'ai cherché encore un peu sur ce forum et j'ai trouvé ça : http://pbadonf.fr/forum/viewtopic.php?id=1958&p=1

Aparemment, il faut modifier la structure DEVMODE en mettant à jour le champ dmCollate par (0/1).

et sur le net:

Code: pb

Local External Function declaration:
FUNCTION boolean SetPrinter(ulong hPrinter,ulong Level,ref ulong
pDevModeInput,ulong Command) LIBRARY "winspool.drv" ALIAS FOR "SetPrinterA"


PB code that is attempting to access SetPrinter():

long     ll_StructSize
ulong    ll_ptrDev, ul_hPrintDefaults, ll_hPrinter
DEVMODE    DevMode
CONSTANT ulong DM_IN_BUFFER  = 1
CONSTANT ulong DM_OUT_BUFFER  = 2
CONSTANT ulong DM_IN_PROMPT  = 4

OpenPrinter(as_Printer, ll_hPrinter, ul_hPrintDefaults)

ll_StructSize = DocumentProperties(0, ll_hPrinter, as_Printer, 0, 0, 0)

//Retrieve driver devmode structure size
If ll_StructSize <= 0 Then
 Messagebox("Error", "Invalid structure size.", StopSign!, Ok!)
 Return -1
End If

ll_ptrDev = GlobalAlloc(GMEM_FIXED, ll_StructSize)
If IsNull(ll_ptrDev)  Then
 Messagebox("Error", "Unable to allocate memory.", StopSign!, Ok!)
 Return -1
End If


// Initialize some defaults
DevMode.dmSize  = ll_StructSize

// Query some properties
DevMode.dmFields  = DM_ORIENTATION + DM_PAPERSIZE + DM_DITHERTYPE +
DM_DISPLAYFLAGS + DM_DUPLEX + DM_DEFAULTSOURCE + DM_COLLATE + DM_COLOR +
DM_TTOPTION

CopyMemory(ll_ptrDev, DevMode, 148)
DocumentProperties(0, ll_hPrinter, as_Printer, ll_ptrDev, 0, DM_OUT_BUFFER)
CopyMemory(DevMode, ll_ptrDev, 148)

//Specify the change to the printer orientation
DevMode.dmFields  = DM_ORIENTATION
DevMode.dmOrientation = ai_orientation

//Make sure the driver-dependant part of DevMode is updated...
if DocumentProperties(0, ll_hPrinter, as_Printer, ll_ptrDev, ll_ptrDev,
DM_IN_BUFFER + DM_OUT_BUFFER) < 0 then
 GlobalFree(ll_ptrDev)
 ClosePrinter(ll_hPrinter)
 Messagebox("Error", "Set Printer Orientation error.", StopSign!, Ok!)
 Return - 1
end if

//Update the printer information
if Not SetPrinter(ll_hPrinter, 2, ll_ptrDev, 0) then
 //The driver doesn't support or is unable to make the change...
 GlobalFree(ll_ptrDev)
 ClosePrinter(ll_hPrinter)
 Messagebox("Error", "The print driver does not support or is unable to make
the printer orientation change.", StopSign!, Ok!)
 Return - 1
end if

GlobalFree(ll_ptrDev)
ClosePrinter(ll_hPrinter)

Return 1


Code: pb

Instance Variables:
long CurrHRes ,CurrVRes ,CurrBPP

ulong DM_BITSPERPEL_H = 4*16*16*16*16
long DM_PELSWIDTH_H = 8*16*16*16*16
long DM_PELSHEIGHT_H = 16*16*16*16*16
long DM_DISPLAYFLAGS_H = 2*16*16*16*16*16
long CDS_FORCE = 4*16*16*16*16*16*16*16

long       i_std_width  = 1024
long      i_std_height = 768
long  i_std_perl   = 16
long       i_prv_width  =0
long      i_prv_height =0
long  i_prv_perl   =0

long i_std_bpp=16

Local External Functions:
FUNCTION long ChangeDisplaySettingsA (ref devmode lpst, ulong Flags) LIBRARY "USER32.DLL"
FUNCTION int GetSystemMetrics(int indexnum) LIBRARY "user32.dll"

Open Event:
devmode dm
long ret

CurrHRes = GetSystemMetrics(0)
CurrVRes = GetSystemMetrics(1)
i_prv_width=currHres
i_prv_height=currVres
i_prv_perl=i_std_perl     //=16

if i_prv_width = i_std_width and i_prv_height = i_std_height then return

dm.dmPelsWidth  = i_std_width
dm.dmPelsHeight = i_std_height
dm.dmBitsPerPel = i_std_perl

dm.dmFields = DM_PELSWIDTH_H + DM_PELSHEIGHT_H + DM_BITSPERPEL_H + DM_DISPLAYFLAGS_H

dm.dmSize = 148 

ret = ChangeDisplaySettingsA(dm, CDS_FORCE)     

CurrBPP  = i_std_bpp

CloseQuery Event:
devmode dm
long ret

CurrHRes = GetSystemMetrics(0)
CurrVRes = GetSystemMetrics(1)
i_prv_width=currHres
i_prv_height=currVres
i_prv_perl=i_std_perl     //=16

if i_prv_width = i_std_width and i_prv_height = i_std_height then return

dm.dmPelsWidth  = i_std_width
dm.dmPelsHeight = i_std_height
dm.dmBitsPerPel = i_std_perl

dm.dmFields = DM_PELSWIDTH_H + DM_PELSHEIGHT_H + DM_BITSPERPEL_H + DM_DISPLAYFLAGS_H

dm.dmSize = 148

ret = ChangeDisplaySettingsA(dm, CDS_FORCE)     

CurrBPP  = i_std_bpp



Code: pb

$PBExportHeader$w_res.srw 
$PBExportComments$change resolution 
forward 
global type w_res from window 
end type 
type cb_2 from commandbutton within w_res 
end type 
type cb_1 from commandbutton within w_res 
end type 
type devmode from structure within w_res 
end type 
end forward 


type devmode from structure 
 character  dmdevicename[32] 
 integer  dmspecversion 
 integer  dmdriverversion 
 integer  dmsize 
 integer  dmdriverextra 
 long  dmfields 
 integer  dmorientation 
 integer  dmpapersize 
 integer  dmpaperlength 
 integer  dmpaperwidth 
 integer  dmscale 
 integer  dmcopies 
 integer  dmdefaultsource 
 integer  dmprintquality 
 integer  dmcolor 
 integer  dmduplex 
 integer  dmyresolution 
 integer  dmttoption 
 integer  dmcollate 
 character  dmformname[32] 
 integer  dmlogpixels 
 long  dmbitsperpel 
 long  dmpelswidth 
 long  dmpelsheight 
 long  dmdisplayflags 
 long  dmdisplayfrequency 
 long  dmicmmethod 
 long  dmicmintent 
 long  dmmediatype 
 long  dmdithertype 
 long  dmreserved1 
 long  dmreserved2 
 long  dmPanningWidth 
 long  dmPanningHeight 
end type 


global type w_res from window 
integer x = 837 
integer y = 388 
integer width = 795 
integer height = 496 
boolean titlebar = true 
string title = "Untitled" 
boolean controlmenu = true 
boolean minbox = true 
boolean maxbox = true 
boolean resizable = true 
cb_2 cb_2 
cb_1 cb_1 
end type 
global w_res w_res 


type prototypes 
FUNCTION long ChangeDisplaySettingsA (ref devmode lpst, ulong Flags) & 
    LIBRARY "USER32.DLL" 
FUNCTION long EnumDisplaySettingsA (string lpszDeviceName,long iModeNum,ref 
devmode lpst) & 
    LIBRARY "USER32.DLL" 


end prototypes 


type variables 


end variables 
on w_res.create 
this.cb_2=create cb_2 
this.cb_1=create cb_1 
this.Control[]={this.cb_2,& 
this.cb_1} 
end on 


on w_res.destroy 
destroy(this.cb_2) 
destroy(this.cb_1) 
end on 


type cb_2 from commandbutton within w_res 
integer x = 224 
integer y = 220 
integer width = 297 
integer height = 88 
integer taborder = 2 
integer textsize = -10 
integer weight = 400 
fontpitch fontpitch = variable! 
fontfamily fontfamily = swiss! 
string facename = "Arial" 
string text = "1024x768" 
end type 


event clicked;devmode dm 
long a 
string ls_nulo 
setnull(ls_nulo) 


//get current configuration 
a = EnumDisplaySettingsA(ls_nulo,-1,dm) 


if a = 0 then 
 messagebox('EnumDisplaySettingsA',"error") 
 return 
end if 


//set configuration 
dm.dmPelsWidth = 1024 
dm.dmPelsHeight = 768 


//Change current configuration 
a = ChangeDisplaySettingsA(dm, 0) 
if a < 0 then 
 messagebox('ChangeDisplaySettingsA',"error") 
 return 
end if 
end event 


type cb_1 from commandbutton within w_res 
integer x = 224 
integer y = 124 
integer width = 297 
integer height = 88 
integer taborder = 1 
integer textsize = -10 
integer weight = 400 
fontpitch fontpitch = variable! 
fontfamily fontfamily = swiss! 
string facename = "Arial" 
string text = "800x600" 
end type 


event clicked;devmode dm 
long a 
string ls_nulo 
setnull(ls_nulo) 


//get current configuration 
a = EnumDisplaySettingsA(ls_nulo,-1,dm) 


if a = 0 then 
 messagebox('EnumDisplaySettingsA',"error") 
 return 
end if 


//set configuration 
dm.dmPelsWidth = 800 
dm.dmPelsHeight = 600 


//Change current configuration 
a = ChangeDisplaySettingsA(dm, 0) 
if a < 0 then 
 messagebox('ChangeDisplaySettingsA',"error") 
 return 
end if 


end event 



Je vais s'inspérer de tout ça ce lundi pour modifier le printer setting.

Merci encore pour votre aide.

Dernière modification par mattdamon (21-08-2011 00:16:12)

Hors ligne

 

#5 22-08-2011 19:41:38

mattdamon  
Le Tuniso-Parisien
Lieu: Livry-Gargan 93190
Date d'inscription: 29-12-2007
Messages: 569
Pépites: 89
Banque: 77,512,666,613,392,940

Re: [RESOLU] Problème d'impression

Bonsoir,

Alors, Enfin, j'ai résolu mon problème. la solution de modifier la configuration de l'imprimente automatiqement dans le code pb a été abondonnée.
Donc, la solution consiste à annuler l'utilisation de la fonction printscreen() et de faire comme suit :

- utiliser une fonction de l'API user32.dll pour faire une capture d'écran.
- Copier la capture d'écran dans un objet OLE word.
- faire printout() de cet objet.

Et voilà, tout va bien.

A bientôt

Hors ligne

 

#6 08-09-2011 09:29:10

infopower  
Membre Power Geek
Lieu: paris
Date d'inscription: 13-04-2011
Messages: 213
Pépites: 1,060
Banque: 0

Re: [RESOLU] Problème d'impression

Bonjour,
Merci bq pour l'information klod.
Bon travail


la vie est une course et il faut avoir un bon depart

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22