Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como imprimir en pto vitual USB001 (https://www.clubdelphi.com/foros/showthread.php?t=54626)

sysmar 25-03-2008 21:41:42

Como imprimir en pto vitual USB001
 
Que tal amigos...

En muchas computadoras recientes ya no traen el puerto paralelo integrado, pero existen los adaptadores USB a CENTRONIC (que fue la solucion que adopte).

El detalle es que al instalar este tipo de adaptadores generan un puerto virtual (USB001, USB00x...) en Windows XP, para tener comunicacion con la impresora.

Estoy migrando una aplicacion FoxPro DOS 2.6 a Delphi 2007 (principiante) y las instrucciones para mandar imprimir que he encontrado son las siguientes:

procedure TForm2.Button1Click(Sender: TObject);
var
F: TextFile;
begin
AssignFile(F,'LPT1');
Rewrite(F);
WriteLn(F, 'Hello from Delphi.');
CloseFile(F);
end;

Esta prueba de impresion me funciono perfectamente para el puerto local LPT1, pero hice el cambio a USB001 y no manda imprimir la leyenda.

Podrian sugerirme alguna solucion.

Nota: Lo que deseo imprimir es el desgloce de partidas de una venta en una impresora para retail EPSON TM-U220, por lo que no es necesario configurar el tipo de hoja y margenes.

Gracias por su tiempo

seoane 25-03-2008 23:03:08

1 Archivos Adjunto(s)
Vamos a ver, esta función te puede útil:
Código Delphi [-]
function WriteRawDataToPrinter(PrinterName: String; Str: String): Boolean;
var
  PrinterHandle: THandle;
  DocInfo: TDocInfo1;
  i: Integer;
  B: Byte;
  Escritos: DWORD;
begin
  Result:= FALSE;
  if OpenPrinter(PChar(PrinterName), PrinterHandle, nil) then
  try
    FillChar(DocInfo,Sizeof(DocInfo),#0);
    with DocInfo do
    begin
      pDocName:= PChar('Printer Test');
      pOutputFile:= nil;
      pDataType:= 'RAW';
    end;
    if StartDocPrinter(PrinterHandle, 1, @DocInfo) <> 0 then
    try
      if StartPagePrinter(PrinterHandle) then
      try
        while Length(Str) > 0 do
        begin
          if Copy(Str, 1, 1) = '\' then
          begin
            if Uppercase(Copy(Str, 2, 1)) = 'X' then
              Str[2]:= '$';
            if not TryStrToInt(Copy(Str, 2, 3),i) then
              Exit;
            B:= Byte(i);
            Delete(Str, 1, 3);
          end else B:= Byte(Str[1]);
          Delete(Str,1,1);
          WritePrinter(PrinterHandle, @B, 1, Escritos);
        end;
        Result:= TRUE;
      finally
        EndPagePrinter(PrinterHandle);
      end;
    finally
      EndDocPrinter(PrinterHandle);
    end;
  finally
    ClosePrinter(PrinterHandle);
  end;
end;
Permite enviar datos directamente a la impresora, al igual que lo hacías antes a través del puerto paralelo, solo necesitas el nombre de la impresora. Si le echas un vistazo a la función seguro que averiguas como funciona y la puedes adaptar a tus necesidades, pero si te decides a utilizarla tal cual, el primer parámetro es el nombre de la impresora (tal cual aparece en la carpeta "Impresoras" de windows) y el segundo es el texto que se quiere enviar, con la particularidad que se pueden mandar secuencias de escape.

Por ejemplo, así mandaríamos el texto "Hola mundo":
Código Delphi [-]
WriteRawDataToPrinter('Mi impresora','Hola mundo');

Ahora lo mismo pero con un retorno de carro y avance de linea:
Código Delphi [-]
WriteRawDataToPrinter('Mi impresora','Hola mundo\x0D\x0A');

Y ahora un pitido (si la impresora lo soporta)
Código Delphi [-]
WriteRawDataToPrinter('Mi impresora','Hola mundo\x0D\x0A\x1B\007');

Estos días estoy probando unas nuevas impresoras de toshiba, de las que no acabo de encontrar sus secuencias de escape (logo, negrita, subrayado, etc ...). Así que me he creado una pequeña aplicación, donde puede escoger una impresora y mandarle una secuencia de escape, y así realizar algunas pruebas. Aquí te la dejo por si quieres hacer algunas pruebas:

sysmar 26-03-2008 01:58:53

muchas gracias por tu tiempo y solucion
 
esta excelente la solucion.

Voy hacer las pruebas al respecto estoy seguro que me va a funcionar tal y como lo necesito.

De verdad que eres todo un maestro.

Saludos

IVAND 26-03-2008 20:15:12

Buena solucion , pero puedes ademas utilizar el preport que permite imprimir en modo texto , secuencia de comandos etc , la buena solucion es que es un reporteador de manera visual soporta enduser y todas esas cosas asi te olvidas de programar reportes a mi me ha servido mucho

Lo malo de la primera opcion es cuando compartes una impresora con otro equipo , cuando mandan dos impresiones al mismo tiempo se mezclan si necesitas el preport te lo envio creo que ya no esta en la pagina de vtktools

sysmar 28-03-2008 05:41:43

Muchas gracias, de hecho ya puse a funcionar la solucion de seoane y me esta trabajando bien, mas sin embargo me gustaria evaluar tu solucion del preport sobre todo por lo del soporte enduser.

Si pudieras mandarmelo te lo agradeceria mucho.

Saludos

anubis 02-09-2014 02:54:40

Gracias por aporte,

Seoane, intente compilarlo en lazarus pero me da error en
Código Delphi [-]
if OpenPrinter(PChar(PrinterName), PrinterHandle, nil) then



Código:

unit1.pas(48,51) Error: Incompatible type for arg no. 2: Got "LongWord", expected "PHANDLE"
unit1.pas(50,21) Hint: Local variable "DocInfo" does not seem to be initialized
unit1.pas(57,37) Warning: Local variable "PrinterHandle" does not seem to be initialized
unit1.pas(73,54) Error: Incompatible type for arg no. 4: Got "LongWord", expected "PDWord"
unit1.pas(90) Fatal: There were 2 errors compiling module, stopping]

Primero lo saque directamente de tu codigo printtest, aunque de momento me interesa el que pusiste aqui.

No se puede compiar en lazarus, aunque le cambie el modo de sintaxis a delphi?

Lo que prentendo solo es imprimir en impresora de tickets y que solo imprima lo que envio y no me saque un feed del tamaño asignado.

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject); 
 var    iImpresora : TextFile; 
 begin    
Assignfile(iImpresora,'LPT1'); //Puerto: LPT1, COM1, etc;    
Rewrite(iImpresora); 
 Writeln(iImpresora,'Esto debe salir por la impresora.');    
CloseFile(iImpresora);  
end;


[font=Arial]Este metodo no me funciona porque no imprime nada.

Código Delphi [-]
with Printer do      
begin        
PRINTER.PrinterIndex:=COMBOBOX1.ItemIndex;       
 r := Rect(200,200,(Pagewidth - 200),(PageHeight - 200));        
BeginDoc;        
Canvas.Brush.Style := bsClear;       
 for i := 0 to IMPRIMIR.Count -1 do        
 Canvas.TextOut(200,200 + (i *                    
 Canvas.TextHeight(IMPRIMIR.Strings[i])),                    
 IMPRIMIR.Strings[i]);        
 Canvas.Brush.Color := clBlack;       
 Canvas.FrameRect(r);       
 EndDoc;


Este si funciona pero me hace feed de papel.

La impresora es una epson tm-u220pa por puerto paralelo.

Tambien he visitado la pagina de epson en relación a los codigos

Código:

PRINT #1 "Hola"; -Imprime texto
PRINT #1 CHR$(&H1B); "d"; CHR$(11); -Avanza 11 líneas
PRINT #1 CHR$(&H1B); "i"; -Ejecuta corte completo

Pero primero hay que hacer un assignfile que no funciona.

Alguna idea del cómo, ya no se donde mas buscar.


Gracias y perdon por ser tan largo.

escafandra 04-09-2014 17:25:10

Para compilar con Lazarus debes realizas los cambios siguientes:

Código Delphi [-]
uses
  Windows, Printers, Winspool;

function WriteRawDataToPrinter(PrinterName: String; Str: String): Boolean;
var
  PrinterHandle: THandle;
  DocInfo: TDocInfo1;
  i: Integer;
  B: Byte;
  Escritos: DWORD;
begin
  Result:= FALSE;
  if OpenPrinter(PChar(PrinterName), @PrinterHandle, nil) then
  try
    FillChar(DocInfo,Sizeof(DocInfo),#0);
    with DocInfo do
    begin
      pDocName:= PChar('Printer Test');
      pOutputFile:= nil;
      pDataType:= 'RAW';
    end;
    if StartDocPrinter(PrinterHandle, 1, @DocInfo) <> 0 then
    try
      if StartPagePrinter(PrinterHandle) then
      try
        while Length(Str) > 0 do
        begin
          if Copy(Str, 1, 1) = '\' then
          begin
            if Uppercase(Copy(Str, 2, 1)) = 'X' then
              Str[2]:= '$';
            if not TryStrToInt(Copy(Str, 2, 3),i) then
              Exit;
            B:= Byte(i);
            Delete(Str, 1, 3);
          end else B:= Byte(Str[1]);
          Delete(Str,1,1);
          WritePrinter(PrinterHandle, @B, 1, @Escritos);
        end;
        Result:= TRUE;
      finally
        EndPagePrinter(PrinterHandle);
      end;
    finally
      EndDocPrinter(PrinterHandle);
    end;
  finally
    ClosePrinter(PrinterHandle);
  end;
end;

Saludos.

anubis 04-09-2014 20:31:09

sí, gracias, las units del uses ya las tenia puestas, ya reviso de nuevo sino da error.
de todas formas agarre el ejemplo q viene con Lazarus sobre raw y si funciona aunque meterle códigos especiales, como q corte la hoja, esta difícil.
gracias por contestar

oscarac 17-10-2014 07:25:30

hice unas pruebas con este codigo...
el problema es que por cada linea impresa no me salta la linea
como soluciono eso??

felixbcastillo 27-04-2016 07:55:37

Seoane...La verdad que muchas...muchas gracias!
Tu codigo, aunque es del 2004 es lo que me pudo resolver el poder abrir la gaveta en en un impresora USB ahora en el 2016 y Delphi 10 Seattle

Dios te colme de bendiciones...
GRACIAS!

enterleo 30-03-2017 16:15:01

Cita:

Empezado por IVAND (Mensaje 275449)
Buena solucion , pero puedes ademas utilizar el preport que permite imprimir en modo texto , secuencia de comandos etc , la buena solucion es que es un reporteador de manera visual soporta enduser y todas esas cosas asi te olvidas de programar reportes a mi me ha servido mucho

Lo malo de la primera opcion es cuando compartes una impresora con otro equipo , cuando mandan dos impresiones al mismo tiempo se mezclan si necesitas el preport te lo envio creo que ya no esta en la pagina de vtktools

buenas tardes ser posible que me envies ese componente a mi correo porfavor.

Casimiro Notevi 30-03-2017 17:59:14

Cita:

Empezado por enterleo (Mensaje 514957)
buenas tardes ser posible que me envies ese componente a mi correo porfavor.

Lee nuestra guía de estilo, gracias.


La franja horaria es GMT +2. Ahora son las 01:11:01.

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