Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
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:
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
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 ?
Hors ligne
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
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:
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
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
$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
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
Bonjour,
Merci bq pour l'information klod.
Bon travail
Hors ligne