Page 1 sur 1

Choix de l'imprimante....

Publié : sam. 08/avr./2006 15:15
par olivier
A Que Coucou :D

Voila je suis sur une application qui prépare un bon de commande. Je dois soit l'imprimer soit le faxer (par le PC via l'impression vers fax).

Une fois le bon de commande terminé, l'utilisateur à donc acces à 2 boutons :
Faxer = imprimer vers le fax
Imprimer = imprimer vers l'imprimante.

J'aimerais que le choix des imprimantes pour ces 2 opérations soit fait une fois pour toutes. Il ne faut pas qu'a chaque envoie l'utilisateur choissise la bonne imprimante...

Comment avoir acces à la liste des imprimantes et comment initialiser la bonne imprimante avant un StartPrinting()

Merci d'avance

Publié : sam. 08/avr./2006 15:44
par hichem
je ne sais pas si j'ai bien compris. :D mais si vous ne voulez pas choisir une imprimante vous pouvez utiliser celle par défaut en utilisant la commande :
Defaultprinter() et non printrequester().
exemple simple :

Code : Tout sélectionner

DefaultPrinter() ; au lieu de printrequester()
StartPrinting("job")
StartDrawing(PrinterOutput())
FrontColor(RGB(255,0,0))
DrawText(100,100,"red text")
StopDrawing()
StopPrinting()
c'est-ce que vous cherchez ?

Publié : dim. 09/avr./2006 10:38
par olivier
Merci hichem

C'est un peu cela que je cherche, mais le problème c'est que ce n'est pas l'imprimante par defaut que je veux utiliser !

Il me faudrait une commande :

ExaminePrinter() pour avoir la liste des imprimantes

et

SetPrinter() pour selectionner l'imprimante

.........une idéee qqun ......

Publié : dim. 09/avr./2006 11:11
par julien
Je pense que tu dois utiliser cette API EnumPrinters_()

Description :
The EnumPrinters function enumerates available printers, print servers, domains, or print providers.

Publié : dim. 09/avr./2006 12:06
par olivier
Merci Julien
Voila une piste interessant....

On trouve un peu pus loin SetPrinter....

Si quelqu'un à un code la dessus je suis preneur car j'avoue que les API avec leur structures :x

Mais bon si je n'ai pas d'autre réponse je devrais m'en sortir avec cela.

Publié : lun. 10/avr./2006 11:05
par olivier
Bon voilà, j'ai pondu cela.... :? V4 Beta 9

ce n'est pas tres jolie pour 2 raisons :
1°) Dans la procedure liste_imprimante() il me demande un tableau de 9000 imprimante, je ne comprends pas pourquoi ????

2°) Pour choisir l'imprimante j'ouvre une PrintRequester() et je choisi l'imprimante avec un envoie de touche à la fenetre :?

Mais bon en attendant mieux, cela marche :D

Je post le code, si vous avez une idée pour améliorer cela, je suis preneur.

Code : Tout sélectionner

Procedure liste_imprimante(id_combo)

     nb_imprimante_a_lister.w=10 ;inconnu pour l'instant, on commence à 10
     nb_imprimante_lister.w=0
     taille_tableau=nb_imprimante_a_lister
     Dim imprimante.PRINTER_INFO_2(taille_tableau)
     Repeat
          taille_tableau=nb_imprimante_a_lister
          Redim imprimante.PRINTER_INFO_2(taille_tableau)
          resu=EnumPrinters_(#PRINTER_ENUM_NAME,"",2,@imprimante(),taille_tableau,@nb_imprimante_a_lister,@nb_imprimante_lister) 
     Until resu=1

     For i=nb_imprimante_lister To 0 Step -1 ;pour les avoir dans l'odre alphabetique !
          If imprimante(i)\pPrinterName<>0
               AddGadgetItem(id_combo,-1, PeekS(imprimante(i)\pPrinterName))
          EndIf
     Next
     Debug "taille_tableau des imprimante = "+Str(taille_tableau)
     SetGadgetState(id_combo,0)
EndProcedure

Procedure SimulateKeyPress(vk, Delay=50, control=0, alt=0, shift=0) ;par DROOPY
     If control
          keybd_event_(#VK_CONTROL, 0, 0,0)
     EndIf
     If alt
          keybd_event_(#VK_MENU, 0,0,0)
     EndIf
     If shift
          keybd_event_(#VK_SHIFT, 0,0,0)
     EndIf
     keybd_event_(vk, 0,0,0)
     Delay(Delay)
     keybd_event_(vk, 0, #KEYEVENTF_KEYUP, 0)
     If control
          keybd_event_(#VK_CONTROL, 0, #KEYEVENTF_KEYUP,0)
     EndIf
     If alt
          keybd_event_(#VK_MENU, 0,#KEYEVENTF_KEYUP,0)
     EndIf
     If shift
          keybd_event_(#VK_SHIFT, 0,#KEYEVENTF_KEYUP,0)
     EndIf
EndProcedure

Procedure choix_imprimante(num); bon ça c'est pas tres beau mais pour l'instant je n'ai pas mieux....
     Delay(50)
     SimulateKeyPress(#VK_HOME)
     For i=1 To num
          SimulateKeyPress(#VK_DOWN)
     Next
     SimulateKeyPress(#VK_RETURN)
EndProcedure

OpenWindow (0,10,10,200,200, "ess", #PB_Window_SystemMenu  )
CreateGadgetList ( WindowID (0))
ComboBoxGadget(1,10,10,180,200)

ButtonGadget(2,5,35,100,20,"ess")
liste_imprimante(1)
Repeat
     event= WaitWindowEvent ()
     Select event
          Case #PB_Event_Gadget ; *****************Choix d'un bouton
               Select EventGadget()
                    Case 2
                         i=GetGadgetState(1)+1

                         CreateThread(@choix_imprimante(), i)
                         PrintRequester()

                         StartPrinting("Test impression")
                         StartDrawing(PrinterOutput())
                         DrawText(10,10,"test")
                         StopDrawing()
                         StopPrinting()
               EndSelect
     EndSelect
Until event=#WM_CLOSE
   

Publié : mar. 11/avr./2006 13:11
par hichem
salut,
voilà au fait je ne penses pas que la taille du tableau d'imprimantes est de 9000, c'est plutôt la taille en 'bytes' du tableau :wink:

je ne suis pas sûr de ma méthode, mais au moins t'auras pas 9000 printers

:twisted:

Code : Tout sélectionner

Global length.l,taille.l,taille_requise.l,printer_entrees.l,p1.PRINTER_INFO_2

Dim list_printers.PRINTER_INFO_2(2)
res = 0
taille = SizeOf(p1)
Debug Str(taille)

If EnumPrinters_(#PRINTER_ENUM_NAME,"",2,@list_printers(),taille,@taille_requise,@printer_entrees) <> 0
Debug "ok"
Else
 Debug "nbimprimantes : "+ Str(Int((taille_requise/taille)))
 ReDim list_printers.PRINTER_INFO_2(Int(taille_requise/taille))
 taille = taille_requise
 If EnumPrinters_(#PRINTER_ENUM_NAME,"",2,@list_printers(),taille,@taille_requise,@printer_entrees)<> 0
 Debug "ok2"
EndIf
EndIf
Debug PeekS(list_printers(2)\pPrinterName)
pardon pour le côté "anarchique" du code.
affaire a suivre.
bonne journée. 8)

Publié : mar. 11/avr./2006 14:06
par olivier
Effectivement c'est plus raisonnable. Mais il me trouve encore 117 imprimante !

Merci, pour cette précision .... de taille

Publié : mar. 11/avr./2006 17:11
par Ulix
9000 printers ? C'est vraiment beaucoup !

Essai donc ce code :

Code : Tout sélectionner


Structure Imprimante 
Nom.s 
Pilote.s 
Port.s 
EndStructure 
Global NewList Imprimante.Imprimante() 



Procedure CreationListeImprimantes()	; idem ListeImprimantes()
;utile une structure : Imprimante() pour mémorisé les données
*Buffet=AllocateMemory(4096):Vide$=Space(1024);
GetProfileString_("devices",0,"",*Buffet,4096); 0=lecture de toutes les clefs
LongChaine=0

ClearList(Imprimante()) 
Repeat
Chaine$=PeekS(*Buffet+LongChaine)
LongChaine=LongChaine+Len(Chaine$) +1
If Chaine$ <> "" 
          AddElement(Imprimante()) 
          Imprimante()\Nom = Chaine$ 
          GetPrivateProfileString_("devices",Chaine$,"",Vide$,1024,"Win.Ini"); lecture de la clef chaine$
          Imprimante()\Pilote = StringField(Vide$,1,",");:Debug Imprimante()\Pilote
          Imprimante()\Port   = StringField(Vide$,2,",");:Debug Imprimante()\Port
          
        
EndIf        
Until chaine$ = ""
FreeMemory(*Buffet)
EndProcedure



J'espére que celà pourra t'être utile ! :P

A+

Publié : mar. 11/avr./2006 17:35
par olivier
Ben c'est pas mal ça ! :D

Et ce qui est rassurant c'est que cela me donne la même chose... sans c'est 117 imprimantes !

Merci Ulix

Reste à initialiser correctement l'imprimante pour imprimer avec purebasic ???