Choix de l'imprimante....

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
olivier
Messages : 305
Inscription : mer. 05/janv./2005 12:58
Localisation : http://www.tib-net.com/meca/index.htm

Choix de l'imprimante....

Message 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
Vive le temps libre !
hichem
Messages : 38
Inscription : dim. 04/sept./2005 16:25
Localisation : Algerie
Contact :

Message 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 ?
mmmmmmmmmmm.
olivier
Messages : 305
Inscription : mer. 05/janv./2005 12:58
Localisation : http://www.tib-net.com/meca/index.htm

Message 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 ......
Vive le temps libre !
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

Je pense que tu dois utiliser cette API EnumPrinters_()

Description :
The EnumPrinters function enumerates available printers, print servers, domains, or print providers.
olivier
Messages : 305
Inscription : mer. 05/janv./2005 12:58
Localisation : http://www.tib-net.com/meca/index.htm

Message 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.
Vive le temps libre !
olivier
Messages : 305
Inscription : mer. 05/janv./2005 12:58
Localisation : http://www.tib-net.com/meca/index.htm

Message 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
   
Vive le temps libre !
hichem
Messages : 38
Inscription : dim. 04/sept./2005 16:25
Localisation : Algerie
Contact :

Message 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)
mmmmmmmmmmm.
olivier
Messages : 305
Inscription : mer. 05/janv./2005 12:58
Localisation : http://www.tib-net.com/meca/index.htm

Message par olivier »

Effectivement c'est plus raisonnable. Mais il me trouve encore 117 imprimante !

Merci, pour cette précision .... de taille
Vive le temps libre !
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

Message 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+
olivier
Messages : 305
Inscription : mer. 05/janv./2005 12:58
Localisation : http://www.tib-net.com/meca/index.htm

Message 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 ???
Vive le temps libre !
Répondre