Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-04-2011
maiquemasque maiquemasque is offline
Miembro
 
Registrado: nov 2009
Posts: 14
Poder: 0
maiquemasque Va por buen camino
Enviar a OKIPOS 410 cadena de apertura de cajon. I/Oerror, el archivo (LPT1)no existe

Hola;

No sabía si colocar esto en "Impresión" o "Varios".

Se trata de algo que me tiene ya quemado. No consigo, por más que he buscado y rebuscado en internet, abrir un cajón portamonedas que está conectado con cable RJ11 a una impresora OKIPOS 410.

Cuando intento hacerlo con alguno de los codigos que pongo más abajo, además de darme errores, desconfiguar totalmente las impresoras del sistema, las borra todas de un plumazo. Y esque lo que hace es detenerse el servicio "Cola de impresión". Tengo que activarlo para poder desinstalar la impresora OKI y despues volver a instalarla.

Este es el error que sale en pantalla:

"spooler subsystem app"

"ENUMPRINTERDRIVERS ERROR CODE: 1722"

Y al ejecutar el codigo, tambien aparece a veces esto:

"I/O ERROR 103"

Y además dice que no encontró el archivo.

La impresora está conectada en LPT1 y todo esto es en Windows XP

Y este es el codigo que he utilizado:

Código Delphi [-]
procedure AbreCaja; 
var 
nPrn:TextFile; 
abrir:string; 
begin 
AssignFile(nPrn, 'LPT1'); 
Rewrite(nPrn); 
WriteLn(nPrn,cadena); //cadena:='chr(27)+... dependiendo de la impresora' 
CloseFile(nPrn); 
end;


otro:

Código Delphi [-]
begin 
AssignFile(CajaRegistradora, tTipoCajon); 
Rewrite(CajaRegistradora); 
WriteLn(CajaRegistradora,#27+#112+#0); 
// . WriteLn(CajaRegistradora,#27+#112+#0+#10+#100); 
// . repite la secuencia SI observas que no va correctamente 
CloseFile(CajaRegistradora); 
end;


Código Delphi [-]
procedure AbrirCajon();
var
nPrn: TextFile;
begin
AssignFile(nPrn, 'COM2');
Rewrite(nPrn);
WriteLn(nPrn,#27+#112+#0+#27+#112+#0);
CloseFile(nPrn);
end;

La secuencia para las OKI 410 se supone que es esta:

27,112,0,25,255


Pero ya digo, da igual el codigo que utilice, se va todo el sistema de impresión a la porra.

Con las Epson y Samsung no tuve nunca este problema.

¿Alquien puede ayudarme?, gracias
Responder Con Cita
  #2  
Antiguo 04-04-2011
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.462
Poder: 21
newtron Va camino a la fama
Hola.

Yo mando la cadena a la impresora por su nombre en vez de abrir directamente el puerto y uso este código que te sirve tanto para impresoras locales como para impresoras en red:

Código Delphi [-]
// ****************************************************************************
// Rutina      : AbreElCajon
// Descripcion :
// ****************************************************************************
procedure AbreElCajon(var Impreso: TImpreso);

  function CreaLinea: String;
  var
    sAux: String;
  begin

    Result := '';

    sAux := Trim(DlgPropiedades.ComandoAperturaCajon);
    while Pos(' ', sAux) > 0 do begin

      try
        Result := Result + Chr(StrToInt(Copy(sAux, 1, Pos(' ', sAux)-1)));
      except

      end;

      sAux := TrimLeft(Copy(sAux, Pos(' ', sAux)+1, Length(sAux)));

    end;

    try
      Result := Result + Chr(StrToInt(sAux));
    except

    end;

  end;


  procedure AbreCajonSerie(sPuerto: String);
  var
    Puerto: THandle;
    Cadena: String;
    BytesEscritos: DWord;
  begin

    Cadena := #27 + #8;

    Puerto := CreateFile(PChar(sPuerto),
                         GENERIC_WRITE,
                         0,
                         nil,
                         OPEN_EXISTING,
                         FILE_ATTRIBUTE_NORMAL,
                         0);
                         
    WriteFile(Puerto,
              PChar(Cadena)^,
              Length(Cadena),
              BytesEscritos,
              nil);

    CloseHandle(Puerto);
  end;

var
  DocInfo1: TDocInfo1;
  Handle:   THandle;
  Linea:    String;
  N:        DWORD;
begin

  if DlgPropiedades.ImpresoraCajon < 0 then begin
    if DlgPropiedades.ImpresoraCajon = -1 then
      AbreCajonSerie('COM1')
    else if DlgPropiedades.ImpresoraCajon = -2 then
      AbreCajonSerie('COM2');
    Exit;
  end;

  if Printer.Printers.Count = 0 then Exit;


  if Pos(' on', Printer.Printers[Impreso.Impresora]) > 0 then begin
    if not OpenPrinter(PChar(Copy(Printer.Printers[Impreso.Impresora], 1, Pos(' on', Printer.Printers[Impreso.Impresora])-1)), Handle, nil) then begin
      ShowMessage('Error en OpenPrinter : ' + Printer.Printers[Impreso.Impresora]);
      Exit;
    end;

  end else begin
    if not OpenPrinter(PChar(Printer.Printers[Impreso.Impresora]), Handle, nil) then begin
      ShowMessage('Error en OpenPrinter : ' + Printer.Printers[Impreso.Impresora]);
      Exit;
    end;

  end;

  with DocInfo1 do begin
    pDocName    := PChar(Impreso.Nombre);
    pOutputFile := nil;
    pDataType   := 'RAW';
  end;

  StartDocPrinter(Handle, 1, @DocInfo1);

  StartPagePrinter(Handle);

//  Linea := #27 + #112 + #0 + #127 + #127;
  Linea := CreaLinea;
  WritePrinter(Handle, PChar(Linea), Length(Linea), N);

  EndPagePrinter(Handle);

  EndDocPrinter(Handle);

  ClosePrinter(Handle);

end;
Responder Con Cita
  #3  
Antiguo 04-04-2011
Avatar de newtron
[newtron] newtron is offline
Membrillo Premium
 
Registrado: abr 2007
Ubicación: Motril, Granada
Posts: 3.462
Poder: 21
newtron Va camino a la fama
nada... nada.... que he intentado editar el anterior y me ha creado uno nuevo
Responder Con Cita
  #4  
Antiguo 04-04-2011
lgarcia lgarcia is offline
Miembro
 
Registrado: jul 2004
Posts: 479
Poder: 20
lgarcia Va por buen camino
Abrir el cajon

hola:

yo use esta unit y la declaro en el formulario y hago el llamado al procedimiento

Código:
unit Escribe_directo;

interface

uses printers, WinProcs, WinTypes, SysUtils;

Procedure Prueba_impresora;

implementation

Type
  Tpasa_datos = Record
  nLong : Integer;
  Datos : Array[0..255] of byte;
end;

Procedure Impresion_directa(s : String);
var
  CadenaB : TPasa_datos;
Begin
  CadenaB.nLong := Length(s);
  StrPCopy(@CadenaB.Datos,s);
  Escape(printer.handle, PASSTHROUGH,0,@CadenaB,nil);
End;

Procedure Prueba_impresora;
Begin
  Printer.BeginDoc;
  Impresion_directa(#27 + 'p0' + #100 + #0 + 'Hello');
  //Impresion_directa(CHR(27)+'&l1O'+'Hello, World!'); // Aqui va el caracter de escape que abre el cajon
  Printer.EndDoc;
End;

end.

Saludos
Luis Garcia
Responder Con Cita
Respuesta



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
Problemas Apertura Cajon Fastreport+epson tm-t88iv hibero Impresión 3 09-04-2010 03:10:08
¿Existe función para asignar a una cadena el resultado de concatenarla con otra? noob Varios 8 13-02-2009 19:34:53
Apertura de un archivo de Word luxus OOP 2 20-12-2007 16:23:50
Como Abrir Cajon atravez del USB usando una impresora con puerto LPT1 Chogo Impresión 5 02-12-2007 01:53:49
Driver OKIPOS Phacko Impresión 5 08-05-2007 02:43:15


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


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