
Saber si la impresora esta encendida, en pausa etc.
#1
Posted 27 January 2011 - 12:20 PM
Tengo una inquietud:
Os cuento:
Cuando envio a imprimir una factura lo hago con QreportX.Preview.
Esto me muestra la factura para imprimirla y puedo escoger la impresora a donde enviar el documento.
El caso es que se me han presentado ocasiones en las que la impresora esta desconectada o en pause y la persona al no oir la impresora manda a imprimir dos veces (o mas) con esto el consecutivo de la factura se altera.
Pregunta:
Como puede hacer para que el programa me diga que la impresora esta en PAUSE o Desconectada?.
Saludos
#2
Posted 27 January 2011 - 01:39 PM


Saludos
#3
Posted 27 January 2011 - 01:44 PM
me tomé el tiempo de hacer una búsqueda y encontré la función GetPrinter, también este artículo de ayuda y esta información.
Espero te sirva

Saludos!
#4
Posted 27 January 2011 - 01:44 PM
Hola
![]()
![]()
Saludos
Es que amigo, debes de hacer preguntas fáciles, así como quieres que te conteste




Salud OS
#5
Posted 27 January 2011 - 01:50 PM
Gracias Felipe lo probare.Hola Caral,
me tomé el tiempo de hacer una búsqueda y encontré la función GetPrinter, también este artículo de ayuda y esta información.
Espero te sirva![]()
Saludos!
Como que faciles amigo, las dificiles son las que cuestan, para las faciles ya estoy yoEs que amigo, debes de hacer preguntas fáciles, así como quieres que te conteste
![]()
![]()
![]()
![]()
Salud OS


Saludos
#6
Posted 27 January 2011 - 01:54 PM
El valor PrinterOnLine aparecía en 0 cuando estaba apagada, una ves encendida se ponía en 1, pausada si no lo comprobé, pero ahí te queda la idea.
Saludos!
#7
Posted 27 January 2011 - 02:01 PM
No tengo idea amigo.
Si me enseñas el codigo de como lo haces me ayudaria mas.
Saludos
PD: Un ejemplo no me cae mal.
#8
Posted 27 January 2011 - 02:06 PM
Hola
No tengo idea amigo.
Si me enseñas el codigo de como lo haces me ayudaria mas.
Saludos
PD: Un ejemplo no me cae mal.
En realidad no lo hice mediante código, solo abrí el editor de registro.
A lo que me refiero entonces y siendo una solución "artesanal" (Hasta que lleguen los maestros de la API) es que podrías consultar esos valores para saber el estado de tu impresora.
Saludos!
#9
Posted 27 January 2011 - 05:23 PM
La API GetPrinter te puede dar la solución:
uses Winspool; function IsPrinterAvailable(NamePrinter: String): boolean; var dwStatus: DWORD; Needed: DWORD; hPrinter: THandle; begin Result:= false; if OpenPrinter(PCHAR(NamePrinter), hPrinter, 0) then if GetPrinter(hPrinter, 6, PBYTE(@dwStatus), sizeof(DWORD), @Needed) then Result:= not(dwStatus = PRINTER_STATUS_NOT_AVAILABLE); end;
Ejemplo de uso:
var R: boolean; begin R:= IsPrinterAvailable('HP DeskJet 600'); end;
Saludos.
#10
Posted 27 January 2011 - 05:36 PM
Muchas gracias amigo, mañana en la empresa lo pruebo y te comento.
Pregunto:
Con esta funcion puedo saber si esta en pausa? o solamente apagada?.
Saludos
#11
Posted 27 January 2011 - 05:45 PM
Si quieres jugar con el ejemplo, visita la información de Microsoft sobre esta API y los códigos de status de la impresora para el nivel 6, que es el que he utilizado.
El estado de pausa, concretamente es PRINTER_STATUS_PAUSED

Saludos.
#12
Posted 27 January 2011 - 05:49 PM
Gracias amigo.
Vuelvo con mas dudas:
Cuando llamo al reporte lo hago simplemente asi (QreportX.Preview.).
Bien.
En teoria despues de llamar al reporte, en la linea siguiente deberia llamar a la funcion para que haga una revision de la impresora.
El asunto es:
Como puedo hacer para que si es FALSE (si esta desconectada o en pausa), que es el resultado que me enviaria la funcion me detenga la impresion y de un mensaje?.
Me enseñas algo de codigo?.
Saludos
#13
Posted 27 January 2011 - 06:17 PM
Muy interesante y amplia la informacion sobre GetPrinter.
Voy a hacer pruebas.
Muchas gracias amigos (todos), por vuestra ayuda.
Saludos
#14
Posted 27 January 2011 - 07:07 PM
El caso es que se me han presentado ocasiones en las que la impresora esta desconectada o en pause y la persona al no oir la impresora manda a imprimir dos veces (o mas) con esto el consecutivo de la factura se altera.
Amigo Caral, pienso que independientemente de las muy buenas soluciones que te dieron el maestro Escafandra y demás compañeros, deberías considerar el separar los procedimientos de "Guardado" y de "Impresión" de tal manera que una factura se guarde solo una vez, pero que tengas la posibilidad de imprimir o al menos intentar imprimir las veces que quieras la misma factura sin alterar el consecutivo, por si la impresora se atasca, o por tantas otras cosas que puedan ocurrir.
La clase TAction (del tActionList) con su evento OnUpdate es muy eficiente a la hora de habilitar o desabiltar botones o MenuItems en función de alguna circunstancia específica (en tu caso podría tratarse del estado del Dataset).
Saludos.
#15
Posted 27 January 2011 - 08:08 PM
Gracias amigo.
La factura se guarda solo una vez, el consecutivo a nivel programa (BD) no se ve afectado.
El problema viene solo en el proceso de impresión ya que las facturas (el papel) viene con numeración consecutiva.
Por eso el problema se me plantea solo en la parte de impresion, no de resguardo.
Te agradezco el comentario y se que la aclaracion es muy logica.
Pense en un momento que del documento (el papel) no tuviera la numeración e imprimirla via programa, pero a nivel seguridad (copias) me parece mejor que lo tenga.
Estoy anuente a sugerencias amigo.
Saludos
#16
Posted 27 January 2011 - 09:42 PM
La factura se guarda solo una vez, el consecutivo a nivel programa (BD) no se ve afectado.
El problema viene solo en el proceso de impresión ya que las facturas (el papel) viene con numeración consecutiva.
Ahora entiendo amigo Caral.
En teoria despues de llamar al reporte, en la linea siguiente deberia llamar a la funcion para que haga una revision de la impresora.
El asunto es:
Como puedo hacer para que si es FALSE (si esta desconectada o en pausa), que es el resultado que me enviaria la funcion me detenga la impresion y de un mensaje?.
Aquí te dejo una idea de una posible implementación, que consiste en desabilitar los botones o MenuItems que apunten su propiedad Action hacia la accción de nombre "Imprimir" del ejemplo, mientras se esté en el proceso de impesión. Basta arrastrar un TActionList, crear una acción (en este caso "Imprimir") e interceptar sus eventos Execute y Update (esta acción la puedes asociar a cuantos botones y MenuItems quieras). Observa que he creado un campo de tipo booleano en la sección private de nombre "Imprimiendo" con el fín de monitorear el proceso y evitar que incluso accidentalmente se pulse dos veces el botón..
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ActnList; type TForm1 = class(TForm) ActionList1: TActionList; Imprimir: TAction; procedure ImprimirExecute(Sender: TObject); procedure ImprimirUpdate(Sender: TObject); private Imprimiendo: Boolean; function ImpresoraLista(NamePrinter :string): Boolean; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function TForm1.ImpresoraLista(NamePrinter: string): Boolean;//Función del maestro Escafandra var dwStatus: DWORD; Needed: DWORD; hPrinter: THandle; begin Result:= false; if OpenPrinter(PCHAR(NamePrinter), hPrinter, 0) then if GetPrinter(hPrinter, 6, PBYTE(@dwStatus), sizeof(DWORD), @Needed) then Result:= not(dwStatus = PRINTER_STATUS_NOT_AVAILABLE); end; end; procedure TForm1.ImprimirExecute(Sender: TObject); begin if not ImpresoraLista('Tu Impresora') then raise Exception.Create('Hay probelmas con la impresora'); Imprimiendo := True; // Aquí el proceso que imprime Imprimiendo := False; end; procedure TForm1.ImprimirUpdate(Sender: TObject); begin TAction(Sender).Enabled := not Imprimiendo ; end; end.
Es solo una idea.
#17
Posted 28 January 2011 - 06:24 AM
Muy bueno amigo, lo probare y te comento.
Gracias.
Saludos
#18
Posted 28 January 2011 - 09:33 AM
function IsPrinterAvailable(NamePrinter: String): boolean; var dwStatus: DWORD; Needed: DWORD; hPrinter: THandle; begin Result:= false; if OpenPrinter(PCHAR(NamePrinter), hPrinter, 0) then if GetPrinter(hPrinter, 6, PBYTE(@dwStatus), sizeof(DWORD), @Needed) then Result:= not boolean(dwStatus); end;
Saludos.
#19
Posted 19 May 2016 - 04:51 PM
Buenas tardes, saludos desde San Jose, de Costa Rica.
Este hilo es un poco antiguo; pero contiente lo que Yo necesito, les resumo
Tengo una aplicación en delphi 2007 que controla la impresión de las ordenes de poduccion de la empresa, todas la impresoras son en red y tienen definido un IP especifico, Yo tengo una rutina que detecta si la IP esta activa, si esta activa envio la impresión sino me espero hasta que este activa, esta rutina funciona muy bien en windows server 2003; pero necesito migrar a windows 10 y algo sucede pero no me funciona este apagada o encendida, siempre me envia el status de que la IP esta inactiva.
Buscando otras alternativas esta rutina tiene lo que Yo necesito, enviar el nombre de la impresora y me responda si esta activa asi de simple; PERO me sucede lo mismo...
ejecuto un trace de la rutina
-
Result:= false;
-
if OpenPrinter(PCHAR(NamePrinter), hPrinter, 0) then (ejecuta bien esta linea)
-
if GetPrinter(hPrinter, 6, PBYTE(@dwStatus), sizeof(DWORD), @Needed) then (al tratar de ejecutar esta, como que no se cumple la condicion y se va al end, entonces siempre es falso)
-
Result:= not boolean(dwStatus);
-
end;
#20
Posted 19 May 2016 - 05:54 PM
Saludos.