Problema con objeto Printer

Quiero imprimir con una impresora que no tiene porqué ser la predeterminada de Windows, para lo cual escribo un código parecido al siguiente:
Dim Impresora as Printer
For Each Impresora in Printers
If Impresora.DeviceName = [el nombre
de la impresora con la que quiero
imprimir] then set Printer = Impresora
next
Bien hasta aquí todo me va bien, si conpruebo la impresora del Printer veo que es la que yo quería. El problema me aparece después de ejecutar la siguiente linea:
Printer.print [lo que quiero imprimir] Printer. EndDoc
A partir de la primera linea de las anteriores la impresora a la que apunta Printer ha cambiado a la predeterminada de Windows, con lo que la impresión va a una impresora que no quiero. Muchas gracias de antemano.
Un saludo.
Nota: La version de Visual Basic es la 5 y trabajo en Windows Xp, comento esto porque me han dicho que probablemente sea por el Xp que controla la impresión, pero no lo creo ya que he probado en otro pc con Windows 98 y el resultado es el mismo.
Respuesta
1
Justamente en una aplicación que tengo, selecciono dos impresoras distintas, cada una imprime algo distinto y el método de seleccionarlas es el que vos tienes, no conozco otro, eso hace que la impresora por default que utilizaría el objeto printer, sea la que seleccionas con la instrucción
Set Printer=xxxx
Si también te lo hace con Windows 98 es que no es un problema del XP, el problema puede estar en el código, fíjate de hacer la selección de impresora justo antes de la instrucción
Printer. Print
En lo posible hazlo 2 veces, puede que por tiempos de respuesta no te tome ese comando, a mi me ha pasado en una maquina que he tenido que repetir el tamaño de letra 2 veces, de lo contrario no me tomaba el cambio.
Cualquier cosa, pásame la parte del código que tienes para cambiar de impresora, así lo reviso.

7 respuestas más de otros expertos

Respuesta
1
Yo tengo este código similar al tuyo que usaba en visual 6 y funciona correctamente
Private Sub SetPrinter(PrnNombre As String)
Dim Impresora As Printer
For Each Impresora In Printers
If Impresora.DeviceName = PrnNombre Then
Set Printer = Impresora
Exit For
End If
Next Impresora
End Sub
Puede ser que pierdas el valor o bien por algún motivo el objeto printer tome el valor de la impresora predeterminada, yo probaría declarar la variable Impresora a nivel global y de esta manera hacer el set impresora = printer antes de cada impresión.
Respuesta
1
No se si funcionará, pero en una de esas te convenga crear un objeto printer público y setear ese objeto en vez del objeto printer. Ej:
Public varPrinter as Printer
...
Dim loopPrinter as Printer
For Each loopPrinter in Printers
If loopPrinter.DeviceName = [pp] then
set varPrinter = loopPrinter
end if
next
...
VarPrinter. Print "Texto"
VarPrinter. Endoc
Suerte
.: Gydba :.
Hola, muchas gracias por la respuesta.
He probado el código que me enviaste, pero no funciona, cuando llega a la linea varPrinter.Print "Texto"
Da un error que dice el objeto no acepta esta propiedad o método.
No comprendo porqué no funciona mi código, ya que en todos los manuales y en la ayuda de vb describen que se debe de hacer así. Estoy realmente desesperado.
Si se te ocurre alguna otra idea te lo agradecería.
Un saludo.
Me parece un poco extraño tu problema. Otra solución que se me ocurre es que crees una variable global tipo string que guarde el DeviceName de la impresora y en el momento que vayas a imprimir lo setees o recorrer el bucle cada vez que imprimís.
Estuve viendo en internet y la forma que usas es la correcta para setear la impresora. Esto es la web MSDN:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnexpvb/html/selectingprinter.asp
PD: ¿Probaste probar el programa en otra versión de win u otra PC para ver si tenías el mismo problema?
Suerte
.: Gydba :.
Respuesta
1
Te elabore un código para que puedas entenderlo bien, abre un form, pega dos botones y un combo.
Private Sub Command1_Click()
Dim intIndice As Integer
intIndice = Combo1.ListIndex
Set Printer = Printers(intIndice)
End Sub
Private Sub Command2_Click()
Printer.Print "Test de impresora"
Printer.Print Printer.DeviceName
Printer.EndDoc
End Sub
Private Sub Form_Load()
Dim X As Printer
Combo1.Text = ""
Command1.Caption = "Definir Impressora"
Command2.Caption = "Imprimir Test"
For Each X In Printers
Combo1.AddItem X.DeviceName
Next
Combo1.Text = Printer.DeviceName
End Sub
Creo que esta todo claro, pero si te queda alguna duda me lo haces saber.
¿Hecho?
El Águila
Muchas gracias, se ve que tienes un gran interés en que se entiendan bien las cosas.
Quizás me he explicado yo mal, el código que envío en la pregunta no está completo, el nombre de la impresora lo saco de una tabla de una base de datos access en la que previamente y en otra parte de la aplicación se guardó ese nombre tomándolo precisamente de un combo para el que se había escrito un código similar al que me has enviado. En ningún momento se escribe a mano el nombre de la impresora, por lo que no cabe error posible en ese sentido.
No obstante he probado tu código y tampoco me funciona.
Entonces el problema esta relacionado con el visual basic, a veces me pasaron estas cosas. Te aseguro de que el código si funciona porque lo probé antes de enviártelo y todo sale correctamente, imprimí en dos impresoras locales y en otra remota en la red y todas funcionaron perfectamente. Así que te aconsejo a que empieces por reinstalar el VB, y no olvides el SP3. Si eso no te resulta reinstala todo el Windows (raras veces me fallo por causa de el, pero sucedieron, y cuanto tiempo demore hasta darme cuenta!). Así que espero haberte ayudado.
¿Hecho?
El Águila.
Si todavía tienes dudas me las envías.
Respuesta
1
Perdona por el retraso, ademas tengo que decirte que en el sistema que tengo instalado no da problemas, por lo tanto es probable que sea cierto lo que te dicen de XP.
Siento no serte de mayor ayuda.
Respuesta
1
Sorry estuve ausente todo este tiempo... ¿aun necesitas ayuda?
Respuesta
Lo que haces esta bien
No se que tipi de cadenas estarás mandando a imprimir
lo recomendable es que hagas un función o procedimiento según sea el caso para imprimir por ejemplo public function Imprimri()
Printer. Print "data a imprimir1"
Printer. Print "data a imprimir2"
Printer. EndDoc
End Function
Esto deberia funcionar yo lo hago e inclusive antes de imprimir escojo la impresora que quiero imprimir
Respuesta
-1
¿Por qué el EndDoc si continuas imprimiendo?, ¿O imprimes en otro momento?
Cuando das el EndDoc se libera el documento hacia el dispositivo de impresión o la cola.
Después si en otro momento quieres imprimir deberás seleccionar nuevamente la impresora
Si quieres una nueva hoja utiliza NewPage.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas