Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Impresión
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-06-2014
comba comba is offline
Miembro
 
Registrado: feb 2004
Posts: 89
Poder: 21
comba Va por buen camino
Smile No funciana mandar fichero txt a impresora con XE2

Hola a todos

Me surge un problema y haber si alguien me puede orientar.

Antes trabajaba con D6 y utilizaba una funcion (que pongo más abajo) para mandar a imprimir un fichero txt con códigos de escape de una zebra, hasta aquí todo bien y utilizo este método porque es muy rápido ante un quickreport y demás.

El problema viene cuando ahora estoy utilizando XE2 y utilizó la misma función, el compilador no dice nada pero no se imprime lo que mando. Yo creo que el problema tiene que ver con los arrays of char y unicode, pero la verdad no se por donde metermano.

Por eso os pidó ayuda.


procedure imprimir(const sFileName:string;impresora:integer);
const
iBufferSize = 32768;
var
Count, BytesWritten: Cardinal;
hPrinter, hDeviceMode: THandle;
sDevice : array[0..255] of Char;
sDriver : array[0..255] of Char;
sPort : array[0..255] of Char;
DocInfo: TDocInfo1A;
f: File;
pBuffer: Pointer;
begin
Printer.PrinterIndex := impresora;
Printer.GetPrinter(sDevice, sDriver, sPort, hDeviceMode);

if not WinSpool.OpenPrinter(@sDevice, hPrinter, nil) then
exit;

DocInfo.pDocName := 'Probando';
DocInfo.pDatatype := 'RAW';
DocInfo.pOutputFile := nil;

if StartDocPrinter(hPrinter, 1, @DocInfo) = 0 then
begin
WinSpool.ClosePrinter(hPrinter);
exit;
end;

if not StartPagePrinter(hPrinter) then
begin
EndDocPrinter(hPrinter);
WinSpool.ClosePrinter(hPrinter);
exit;
end;

System.Assign(f, sFileName);
try
Reset(f, 1);
GetMem(pBuffer, iBufferSize);
while not eof(f) do
begin
Blockread(f, pBuffer^, iBufferSize, Count);
if Count > 0 then
begin
if not WritePrinter(hPrinter, pBuffer, Count, BytesWritten) then
begin
EndPagePrinter(hPrinter);
EndDocPrinter(hPrinter);
WinSpool.ClosePrinter(hPrinter);
FreeMem(pBuffer, iBufferSize);
exit;
end;
end;
end;
FreeMem(pBuffer, iBufferSize);
EndDocPrinter(hPrinter);
WinSpool.ClosePrinter(hPrinter);
finally
System.Closefile(f);
end;
end;
Responder Con Cita
  #2  
Antiguo 04-06-2014
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 13
engranaje Va por buen camino
¿Podrias aclararnos para poder ayudarte mejor si has trazado ese procedimiento y en que punto sale?
¿supera este paso sin problema?
Código Delphi [-]
if not WinSpool.OpenPrinter(@sDevice, hPrinter, nil) then
     exit;
Responder Con Cita
  #3  
Antiguo 04-06-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por comba Ver Mensaje
...
Recuerda poner los tags al código fuente, ejemplo:



Gracias
Responder Con Cita
  #4  
Antiguo 04-06-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.732
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
A qué ter refieres con "No se imprime lo que mando"
¿No se imprime nada?
¿Se imprime "basura"?
¿Se imprime solo parte?

¿Cómo generas el fichero?
Es Unicode / UTF8 o algo parecido
Responder Con Cita
  #5  
Antiguo 04-06-2014
comba comba is offline
Miembro
 
Registrado: feb 2004
Posts: 89
Poder: 21
comba Va por buen camino
Tomo nota Casimiro.
Y efectivamente engranaje, cuando llega a este punto no lo supera

if StartDocPrinter(hPrinter, 1, @DocInfo) = 0 then
begin
WinSpool.ClosePrinter(hPrinter);
exit;
end;
Responder Con Cita
  #6  
Antiguo 04-06-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por comba Ver Mensaje
Tomo nota Casimiro.
Y efectivamente engranaje, cuando llega a este punto no lo supera

if StartDocPrinter(hPrinter, 1, @DocInfo) = 0 then
begin
WinSpool.ClosePrinter(hPrinter);
exit;
end;
Tomaste nota pero... ¿ Y los Tag's ?

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 04-06-2014
comba comba is offline
Miembro
 
Registrado: feb 2004
Posts: 89
Poder: 21
comba Va por buen camino
Perdona ecfisa

Pero he puesto los tag y acabo de hacer la prueba en la vista previa y automáticamente los quita, por lo menos a mí
Responder Con Cita
  #8  
Antiguo 04-06-2014
comba comba is offline
Miembro
 
Registrado: feb 2004
Posts: 89
Poder: 21
comba Va por buen camino
Hola duilioisola

Lo que mando es un fichero txt con código epl para que la impresora zebra los imprimá, pero como he comentado anteriormente cuando llegá a este paso entra y va al exit.
Código Delphi [-]
if StartDocPrinter(hPrinter, 1, @DocInfo) = 0 then
begin
WinSpool.ClosePrinter(hPrinter);
  exit;
end;

De antemano gracias a todos.

Última edición por ecfisa fecha: 04-06-2014 a las 13:56:24. Razón: agregar etiquetas
Responder Con Cita
  #9  
Antiguo 04-06-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola comba.
Cita:
Empezado por comba Ver Mensaje
Perdona ecfisa

Pero he puesto los tag y acabo de hacer la prueba en la vista previa y automáticamente los quita, por lo menos a mí
No hay problema , tal vez sea resultado del navegador que usas y la selección de edición con WYSIWYG (What You See Is What You Get) en las opciones de tu panel de control de usuario. Para evitar eso uso "Editor estándard - Controles de formato extra".

Intenta la corrección usando las etiquetas manualmente de este modo: [delphi] tu_codigo [/delphi], de momento ya las agregué a tu último mensaje.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 04-06-2014 a las 14:08:59.
Responder Con Cita
  #10  
Antiguo 04-06-2014
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 13
engranaje Va por buen camino
has probado a modificar esto:
Código Delphi [-]
  DocInfo.pOutputFile := nil;

para pasar como poutputfile el puerto de la impresora en lugar de nulo?
mas o menos asi:

Código Delphi [-]
  DocInfo.pOutputFile := sPort;

Última edición por engranaje fecha: 04-06-2014 a las 14:16:58.
Responder Con Cita
  #11  
Antiguo 04-06-2014
comba comba is offline
Miembro
 
Registrado: feb 2004
Posts: 89
Poder: 21
comba Va por buen camino
Hola engranaje

He modificado lo que me habias comentado pero me da este error.

E2010 Incompatible types: 'PAnsiChar' and 'array[0..255] of Char'
Responder Con Cita
  #12  
Antiguo 04-06-2014
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 13
engranaje Va por buen camino
cierto, puedes probar con:
Código Delphi [-]
  DocInfo.pOutputFile := @sPort;

Aunque lo cierto es que creo que es mejor trabajar directamente sobr Pchar, declarando las variables asi:

Código Delphi [-]
 
var
   pDevice :PChar;
   PDriver :Pchar;
   pPort   :Pchar;
   hdMode  : Thandle;

cargandolas asi:
Código Delphi [-]
  getMem(pDevice, cchDeviceName);
  getmem(pDriver,MAX_PATH);
  GetMem(pPort,MAX_PATH);
  printer.GetPrinter(pDevice,pDriver,pPort,hDMode);

y liberando la memoria cuando corresponda:
Código Delphi [-]
  if assigned(pDevice) then 
    freeMem(pDevice, cchDeviceName);
  if assigned(pDevice) then   
    freemem(pDriver,MAX_PATH);  
  if assigned(pDevice) then 
    freeMem(pPort,MAX_PATH);
Responder Con Cita
  #13  
Antiguo 05-06-2014
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.232
Poder: 20
ElKurgan Va camino a la fama
Hola, Comba.

He probado tu código en un XE2 y en un XE5, sin cambiar nada, y en ambos casos ha funcionado correctamente.

Eso si, no tengo ninguna impresora de tickets, pero lo he lanzado a una LaserJet 4200 y ha ido de lujo.

El problema seguramente lo tendrás en otro sitio.

Saludos
Responder Con Cita
  #14  
Antiguo 15-06-2017
Avatar de hgiacobone
hgiacobone hgiacobone is offline
Miembro
 
Registrado: may 2003
Ubicación: La Plata, Bs. As., Argentina
Posts: 165
Poder: 21
hgiacobone Va por buen camino
Imprimir sobre Zebra desde XE4

Hola amigo Comba,
Parece mentira que a estas alturas tenga el mimo problema.
Por necesidades (ilogicas) hemos mudado el codigo del viejo D7 hacia un XE4 y, entre otras, la funcion de impresion siobre impresoras Zebra no ha funcionado nunca más.

En mi caso tambien, llega hasta el mismo punto y no produce ninguna salida. Aqui parte de mi código muy similar al tuyo:
Código Delphi [-]
var
   PrinterHandle: THandle;
   N: DWORD;
   DocInfo1: TDocInfo1;
begin
  Result:= FALSE;
  if not WinSpool.OpenPrinter(PChar(PrinterName), PrinterHandle, nil) then
  begin
    ShowMessage(PrinterName+#13+'OpenPrinter error ' + IntToStr(GetLastError));
    Exit;
  end
  else Try
      with DocInfo1 do
      begin
        pDocName := PChar('Keuken Doc');
        pOutputFile := nil;
        pDataType := 'RAW';
      end;
      if StartDocPrinter(PrinterHandle, 1, @DocInfo1) <> 0
      then ...

Como lo has resuelto?
__________________
Gracias de antemano por vuestra ayuda.
·.:*:.·Yako·.:*:.·
Responder Con Cita
  #15  
Antiguo 15-06-2017
Avatar de hgiacobone
hgiacobone hgiacobone is offline
Miembro
 
Registrado: may 2003
Ubicación: La Plata, Bs. As., Argentina
Posts: 165
Poder: 21
hgiacobone Va por buen camino
Actualizo la data.
Modifique la instruccion original:
Código Delphi [-]
WritePrinter(PrinterHandle, PChar(comando), Length( PChar(comando) ), N);
...por esta nueva instruccion sugerida por otro amigo:
Código Delphi [-]
WritePrinter(PrinterHandle, PChar( RawByteString(comando) ), Length( PChar( RawByteString(comando)) ), N);
...pero tampoco funciona. No sale nada por la impresora y en cambio con Delphi7 si lo hace.

¿Alguna idea o sugerencia?
__________________
Gracias de antemano por vuestra ayuda.
·.:*:.·Yako·.:*:.·
Responder Con Cita
  #16  
Antiguo 16-06-2017
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.232
Poder: 20
ElKurgan Va camino a la fama
A lo mejor el problema está en el soporte para caracteres Unicode de las últimas versiones de Delphi.

Desde la versión 2009 de Delphi se incluye soporte a caracteres Unicode por defecto, por lo que la clase String equivale a la antigua WideString. Lo mismo pasa con los tipos Char.

Si quieres que las cosas funcionen como estaban en versione anteriores de Delphi tienes que sustituir los String por AnsiStirng, y los Char por AnsiChar

A lo mejor tienes que cambiar todas las transformaciones tipo PChar(...) a PAnsiChar(...)

Espero que te sirva

Un saludo
Responder Con Cita
  #17  
Antiguo 16-06-2017
Avatar de hgiacobone
hgiacobone hgiacobone is offline
Miembro
 
Registrado: may 2003
Ubicación: La Plata, Bs. As., Argentina
Posts: 165
Poder: 21
hgiacobone Va por buen camino
Thumbs up Solucionado

Bueno amigos, luego de mucho andar, he aqui la solución.
La instruccion original, debe modificarse de esta forma:

Código Delphi [-]
WritePrinter(PrinterHandle , PAnsiChar( RawByteString(comando) ) , Length(comando) , N);

Con esto, sencillamente, funciona.
__________________
Gracias de antemano por vuestra ayuda.
·.:*:.·Yako·.:*:.·
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
seleccion de impresora y letra de la impresora emeceuy Impresión 6 13-08-2017 15:11:05
Mandar a Puerto de Impresora Carliviris Varios 1 11-01-2007 22:31:29
Obtener un fichero adjunto a un nodo de un fichero XML muntasil Internet 0 18-07-2006 13:57:57
Como mandar datos a la impresora Felix el Gato JAVA 3 27-04-2004 23:13:11
Mandar dos impresiones y cambiar de impresora Quick Report MRSAM Impresión 2 18-02-2004 12:18:51


La franja horaria es GMT +2. Ahora son las 18:41:32.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi