Ir al contenido


Foto

Saber si la impresora esta encendida, en pausa etc.


  • Por favor identifícate para responder
20 respuestas en este tema

#1 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 27 enero 2011 - 12:20

Hola
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
  • 0

#2 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 27 enero 2011 - 01:39

Hola
: :
Saludos
  • 0

#3 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 27 enero 2011 - 01:44

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 (y)



Saludos!
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 27 enero 2011 - 01:44

Hola
: :
Saludos


Es que amigo, debes de hacer preguntas fáciles, así como quieres que te conteste :p :D :D :D

Salud OS
  • 0

#5 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 27 enero 2011 - 01:50

Hola

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 (y)

Saludos!

Gracias Felipe lo probare.

Es que amigo, debes de hacer preguntas fáciles, así como quieres que te conteste :p :D :D :D

Salud OS

Como que faciles amigo, las dificiles son las que cuestan, para las faciles ya estoy yo :D :D
Saludos
  • 0

#6 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 27 enero 2011 - 01:54

Me puse a probar en mi equipo la linea del registro: HKEY_CURRENT_CONFIG\System\CurrentControlSet\Control\Print\Printers\HP Deskjet
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!
  • 0

#7 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 27 enero 2011 - 02:01

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.
  • 0

#8 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 27 enero 2011 - 02:06

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!
  • 0

#9 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 27 enero 2011 - 05:23

La API GetPrinter te puede dar la solución:


delphi
  1. uses
  2.   Winspool;
  3.  
  4. function IsPrinterAvailable(NamePrinter: String): boolean;
  5. var
  6.   dwStatus: DWORD;
  7.   Needed: DWORD;
  8.   hPrinter: THandle;
  9. begin
  10.   Result:= false;
  11.   if OpenPrinter(PCHAR(NamePrinter), hPrinter, 0) then
  12.     if GetPrinter(hPrinter, 6, PBYTE(@dwStatus), sizeof(DWORD), @Needed) then
  13.       Result:= not(dwStatus = PRINTER_STATUS_NOT_AVAILABLE);
  14. end;


Ejemplo de uso:

delphi
  1. var
  2.   R: boolean;
  3. begin
  4.   R:= IsPrinterAvailable('HP DeskJet 600');
  5. end;



Saludos.
  • 0

#10 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 27 enero 2011 - 05:36

Hola
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
  • 0

#11 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 27 enero 2011 - 05:45

Sabes si está "disponible".

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.
  • 0

#12 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 27 enero 2011 - 05:49

Hola
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
  • 0

#13 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 27 enero 2011 - 06:17

Hola
Muy interesante y amplia la informacion sobre GetPrinter.
Voy a hacer pruebas.
Muchas gracias amigos (todos), por vuestra ayuda.
Saludos
  • 0

#14 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 27 enero 2011 - 07:07

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.
  • 0

#15 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 27 enero 2011 - 08:08

Hola
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
  • 0

#16 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 27 enero 2011 - 09:42

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..



delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, ActnList;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     ActionList1: TActionList;
  12.     Imprimir: TAction;
  13.     procedure ImprimirExecute(Sender: TObject);
  14.     procedure ImprimirUpdate(Sender: TObject);
  15.   private
  16.     Imprimiendo: Boolean;
  17.     function ImpresoraLista(NamePrinter :string): Boolean;
  18.     { Private declarations }
  19.   public
  20.     { Public declarations }
  21.   end;
  22.  
  23. var
  24.   Form1: TForm1;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. function TForm1.ImpresoraLista(NamePrinter: string): Boolean;//Función del maestro Escafandra
  31. var
  32.   dwStatus: DWORD;
  33.   Needed: DWORD;
  34.   hPrinter: THandle;
  35. begin
  36.   Result:= false;
  37.   if OpenPrinter(PCHAR(NamePrinter), hPrinter, 0) then
  38.     if GetPrinter(hPrinter, 6, PBYTE(@dwStatus), sizeof(DWORD), @Needed) then
  39.       Result:= not(dwStatus = PRINTER_STATUS_NOT_AVAILABLE);
  40. end;
  41. end;
  42.  
  43. procedure TForm1.ImprimirExecute(Sender: TObject);
  44. begin
  45. if not ImpresoraLista('Tu Impresora') then
  46.   raise Exception.Create('Hay probelmas con la impresora');
  47.   Imprimiendo := True;
  48.   // Aquí el proceso que imprime
  49.   Imprimiendo := False;
  50. end;
  51.  
  52. procedure TForm1.ImprimirUpdate(Sender: TObject);
  53. begin
  54.   TAction(Sender).Enabled := not Imprimiendo ;
  55. end;
  56.  
  57. end.



Es solo una idea.
  • 0

#17 Caral

Caral

    Advanced Member

  • Moderador
  • PipPipPip
  • 4.266 mensajes
  • LocationCosta Rica

Escrito 28 enero 2011 - 06:24

Hola
Muy bueno amigo, lo probare y te comento.
Gracias.
Saludos
  • 0

#18 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 28 enero 2011 - 09:33

En el caso que no queramos tener estado de la lista activo, lo normal cuando la impresora va a imprimir, la función puede modificarse como sigue:



delphi
  1. function IsPrinterAvailable(NamePrinter: String): boolean;
  2. var
  3.   dwStatus: DWORD;
  4.   Needed: DWORD;
  5.   hPrinter: THandle;
  6. begin
  7.   Result:= false;
  8.   if OpenPrinter(PCHAR(NamePrinter), hPrinter, 0) then
  9.     if GetPrinter(hPrinter, 6, PBYTE(@dwStatus), sizeof(DWORD), @Needed) then
  10.       Result:= not boolean(dwStatus);
  11. end;



Saludos.
  • 0

#19 oec2509

oec2509

    Newbie

  • Miembros
  • Pip
  • 2 mensajes

Escrito 19 mayo 2016 - 04:51

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;
Será que hay que cambiar algún parametro para que funcione en windows 10?
 
Agradecería much si me puediesen orientar, nuevamente muy agradecido por su ayuda.
 
 

  • 0

#20 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 19 mayo 2016 - 05:54

Prueba cambiando los tipos de datos, por ejemplo en vez de string - AnsiString, PCHAR - PAnsichar o PWideChar, es posible que tenga que ver con los asuntos unicode.

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.