Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Función para impresoras de Matriz, o mini printers,

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Función para impresoras de Matriz, o mini printers, Responder citando

hola, alguien sabe donde puedo encontrar una función que me permita impirmir directamente, y evitar el spooller de windos, es decir, al enviar a una impresora de matriz, para crear un inventario (digamoslo asi), que no se utilice el spooler de windows, si alguien sabe como hacerlo, le agradeceria que compartiera su conocimiento conmigo, esto debe servir para imprimir mas rapido, y no utilizar por mencionarlo al quickreport. o igual para imprimir una factura, es tambien funcionable..


de antemando, un saludo
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola Cesar.
Yo he pasado por algun apuro con esto mismo y al final lo he resuelto todo con la funcion Printer(). Sigue imprimiendo a través de Win, pero te permite un control mas directo de la impresión. Tal vez te pueda servir para algo, porque seguro que a través del puerto paralelo, dirigir algo a la impresora va ser muy dificil.
En cualquier caso desden hace mucho tiempo paso de queickreport, Crystal Report o o que sea Report. Para lo único que sirven es a la larga para dar problemas y al fial te hacen perder mas tiempo del que al principio creias.
Suerte!
Volver arriba
Mensaje    Asunto: Como se puede manejar los saltos Responder citando

Estimado CESAR.

He visto una funcion que pusiste en Trucos, pero a mi me se me corre ya que los enter me corren muy abajo las lineas en la factura y dejar inmediatamente los datos en la siguiente linea dejan corrido para arriba.

Espero me de a antener, la cosa es que cómo se puede indicar la medida del interlineado?....
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Viendo la función de Tips & Trucos, imagino que generas la impresion en un TStringList, (Memo->Lines) TStringList, etc etc, la cuestion en si es que en cada una de las lineas que usas, se imprimen por bandas, es decir
-------------------------
1.dir
2.nom
3.telf
4.
5.
6.
7.a 10.0 10.0
8.b 2.0 2.0
9.
10.
11. 12.00
12.
------------------------
supongamos que estas usando 12 lineas de un TStringList bien asi como lo estas manejando la impresion recorre las 12 lineas y las imprime a excepcion que la impresora que usas NO sea de matriz de puntos,

pero yo mismo he probado la funcion en una impresora Lasser y no he tenido ese problema que mencionas.

si puedes poner algo de tu codigo para pueda reproducir el error creo que puedo ayudarte con algo mas.

Saludos.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Lo unico que hago es lo siguiente Responder citando

Gracias por responer Cesar.

un ejemplo del Memo que genero es el siguiente. ( la enumeracion de lineas no se pone)

Código:

1-                    VIERNES          01        DICIEMBRE             06

2-           NOMBRE COMPLETO                              DIRECCION #CASA

3-                                                                      10.000

4-                                                                      1.900

5-                                                                      11.900

ya que la factura es prediseñada en papel continuo, y debo ponerle los espacios neccesarios para que se imprima en donde corresponda. La funcion la ocupo tal cual está en los trucos, no he puesto modificaciones

Al enviar la impresion del primer memo, la impresion se corre hacia abajo, ya que los saltos de linea no son proporsionales a los saltos que tiene el formulario continuo diseñado y queda todo corrido mas abajo que los titulos. el interlineado queda mas largo que lo necesario.

Ejemlo .... Señor (a) :
NOMBRE COMPLETO

En caso que no ponga los saltos de linea en el memo queda de esta forma
Código:

1-                    VIERNES          01        DICIEMBRE             06
2-           NOMBRE COMPLETO                              DIRECCION #CASA
3-                                                                      10.000
4-                                                                      1.900
5-                                                                      11.900


y los interlineados con muy cortos y queda asi de corrido.

NOMBRE COMPLETO
Ejemlo .... Señor (a) :


En ambos caso la primera linea queda super bien ajustada, pero los que vienen para abajo quedan corridos o para arriba o para abajo de la posicion que deben adoptar.

La llamada es la siguiente:

Código:

1//    TStringList* MyList = new TStringList();
2//    MyList->AddStrings(this->Memo1->Lines);
3//    ImprimirLineas(MyList,"\xF","\x12","\xC","HP DeskJet 420","PRUEBA");
4//----------
5// ANEXO ("\x0d\x0a" Fin y nueva linea)


Lo que me gustaria saber es que significa cada parametro, a lo mejor ahi está la solucion, y la linea 5 no entiendo.

La funcion que utilizo puesta por ti en trucos es la siguiente:

Código:

//-----------------------------------------------------------------------------
////////////Impresion EN MODO TEXTO PARA EVITAR EL SPOOLER DE WINDOW
//          PARA IMPRESORAS DE MATRIZ TAMBIEN SIRVE PARA IMPRESORA FISCAL
//          O MINIPRINTER
// REALIZADA POR:
//               CESAR CUAUHTEMOC SALAZAR GONZALEZ.
//               06/04/04, ESPERO LES SIRVA..
//
//  PARAMETROS DE LA FUNCION
//
// LINEAS    ->lo que se desea imprimir, ARREGLO DE LINEAS.
// INICIO    -> HABILITAR TIPO LETRAS EN MATRIZ, "\xF"-CONDENSADO "\xE"-EXPAND
// FIN       -> DESHABILITAR TIPO LETRAS "\X12" IMPRESION NORMAL
// EJECT     -> EXPULSAR HOJA O PONER MAS LINEAS "\xC"-EXPL "\N\N\N"-MAS LINEAS
// IMPRESORA -> A DONDE? LOCAL "EPSON" O RED "\\EPSON" // BAJO WINDOS.
// TITULO    -> TITULO DE IMPRESION.
//
// POR EJEMPLO
//    TStringList* MyList = new TStringList();
//    MyList->AddStrings(this->Memo1->Lines);
//    ImprimirLineas(MyList,"\xF","\x12","\xC","HP DeskJet 420","PRUEBA");
//----------
// ANEXO ("\x0d\x0a" Fin y nueva linea)
////////////////////////////////////////////////////////////////////////////
void __fastcall ImprimirLineas( TStringList *LINEAS,char *INICIO,char *FIN,
                                char *EJECT,AnsiString IMPRESORA,
                                AnsiString TITULO){
    struct {
        char *DocName;
        char *OutputFile;
        char *DataType;
    } DocInfo;
    DocInfo.DocName     = TITULO.c_str();
    DocInfo.OutputFile  = 0;
    DocInfo.DataType    = "RAW";
    // Obtener un handle de impresora
    HANDLE hPrinter;
    if (! OpenPrinter(IMPRESORA.c_str(), &hPrinter, 0))
        throw Exception("Operación inválida con la impresora");
    try {
        // Informar al spooler del comienzo de impresión
        if (StartDocPrinter(hPrinter, 1, LPBYTE(&DocInfo)) == 0)
            throw Exception("Operación inválida con la impresora");
        try {
            // Iniciar una página
            if (! StartPagePrinter(hPrinter))
                throw Exception("Operación inválida con la impresora");
            try {
                // Enviar los datos directamente
///////////////////////
                  // PREPARAR LA ULTIMA LINEA
                   for(int i=0;i < LINEAS->Count;i++){
                                        // INICIO CADENA           \R\N      FIN
                       AnsiString vLinea=INICIO+LINEAS->Strings[i]+FIN+"\x0d\x0a";
                       char* lineToPrint;
                       DWORD numBytesWritten;
                       lineToPrint=vLinea.c_str(); // convertir linea a cadena
                       WritePrinter(hPrinter,(LPVOID)lineToPrint,(DWORD) strlen(lineToPrint), &numBytesWritten);
                 }
                 char* lineToPrint;
                 DWORD numBytesWritten;
                 lineToPrint=EJECT; // si lleva se expulas "\xC"
                 WritePrinter(hPrinter,(LPVOID)lineToPrint,(DWORD) strlen(lineToPrint), &numBytesWritten);

////////////////////
            }
            __finally {
                // Terminar la página
                if (! EndPagePrinter(hPrinter))
                    throw Exception("Operación inválida con la impresora");
            }
        }
        __finally {
            // Informar al spooler del fin de impresión
            if (! EndDocPrinter(hPrinter))
            throw Exception("Operación inválida con la impresora");
        }
    }
    __finally {
        // Devolver el handle de impresora
        ClosePrinter(hPrinter);
    }
}


Me interesa demasiado el asunto ya que tengo que enviar a umpresora a imprimir unas 200 facturas continuas.

De antemano muchas gracias
Código:
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Bien lo de los parametros en la misma funcion esta definidos


Cita:

ImprimirLineas(MyList,"\xF","\x12","\xC","HP DeskJet 420","PRUEBA");
ImprimirLineas(LINEAS,INICIO,CONDENSADO,FIN,EJECT,IMPRESORA,TITULO);


Cita:

// PARAMETROS DE LA FUNCION
//
// LINEAS ->lo que se desea imprimir, ARREGLO DE LINEAS.
// INICIO -> HABILITAR TIPO LETRAS EN MATRIZ, "\xF"-CONDENSADO "\xE"-EXPAND
// FIN -> DESHABILITAR TIPO LETRAS "\X12" IMPRESION NORMAL
// EJECT -> EXPULSAR HOJA O PONER MAS LINEAS "\xC"-EXPL "\N\N\N"-MAS LINEAS
// IMPRESORA -> A DONDE? LOCAL "EPSON" O RED "\\EPSON" // BAJO WINDOS.
// TITULO -> TITULO DE IMPRESION.


Ahora bien los parametros, que pongo, tales como inicio, condensado, fin, y ejec, funcionan solo para impresoras de matriz, ya que son condigos de expancion, para cada uno de ellos

Por ejemplo uso esta forma para crear el ticket de una compañia

Código:

TStringList *Ticket = new TStringList();
int renglones;
// encabezado
Ticket->Clear();
Ticket->Add("\x1B\x74\x10");//Inicio de la MiniPrinter
FechaFolio += "          Folio:"+::Rellena(IntToStr(DMREMOTO->TicketTK_FOLIO->Value).Trim(),'0',5);
Ticket->Add("\x1B\x61\x31"+FechaFolio);
Ticket->Add("\x1B\x61\x31\x1B\x21\x5C"+DMREMOTO->EmpresaE_NOMBRE->Value+"\x1B\x21\x00");
Ticket->Add("\x1B\x61\x31RFC: "+DMREMOTO->EmpresaE_RFC->Value);
Ticket->Add("\x1B\x61\x31"+DMREMOTO->EmpresaE_CALLE->Value);
Ticket->Add("\x1B\x61\x31"+DMREMOTO->EmpresaE_CIUDAD->Value+"; "+DMREMOTO->EmpresaE_ESTADO->Value);
Ticket->Add("\x1B\x61\x31 CP:"+DMREMOTO->EmpresaE_CODIGO_POSTAL->Value);
Ticket->Add("\x1B\x61\x31---------------*--------------");

Los codigos Arriba mencionados tales como "\x1B\x61\x31" son codigos que la impresora de matriz acepta (Secuencias de Escape) y por cada linea le establezco el codigo, algo asi como centrado, izquierdad, derecha etc etc,
La impresora es una Epson TMD-200 de las minimprinter,

y la forma de Imprimir es la siguiente

Código:
ImprimirLineas(Ticket,"\x1B\x65\x4","","\x1B\xC",prnTicket,"Ticket de Venta");


y los parametros queda de la siguiente manera
LINEAS -> Ticket
INICIO -> "\x1B\x65\x4"
FIN -> ""
EJECT -> "\x1B\xC"
IMPRESORA -> prnTicket <- Es una cadena que tiene el nombre de la Impresora
TITULO -> "Ticket"

Espero que con esto puedas comprender el uso de la funcion.

puedes ubicar tu impresora y verificar los codigos o secuencias de Escape, en la página de fabricante tienen un manual que determina como enviar secuencias de escape a la impresora, eso puede ayudarte, es decir, debes preparar el Arreglo de Lineas, para que tenga las secuencias de escape correctas, asi tu impresora las va a respetar

Es como el trabajo de Previsualizacion que hace Word, debes indicar como queda, para que asi como quede deba imprimirse, pero esto debes hacerlo con las secuencias de Escape.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola.
Después de mucho tiempo queriendo evitar esta solución, me uno a vosotros. He hecho un pequeño programa con un timer, que cuando aparece un archivo para impresión desde un programa msdos, lo imprime. Pero tengo unos cuantos problemas, o mejor dicho, uno solo.

Los comandos ESC no todos acaban "bien". Hay algunos que al final terminan en 0, lo cual le indica al C que se ha acabado la linea (char). (ejem subrayado: ESC - 1 para activar y ESC - 0 para desactivar).
Como no se lo que queda detrás del 0 de desactivación, no puedo saber cuantos caracteres quedan. Lo que si puedo es cargar todo el archivo y mandarlo de golpe a la impresora.

Estoy en ello, pero agradecería sugerencias

Saludos, Bosoft
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: funcion Imprime Responder citando

Hola amigos, este problema lo he vivido desde hace mucho tiempo, bien que en Windows la impresora al final la ve como un archivo, entonces para mandarlo a la impresora ( y funciona para las impresoras de red tambien) uso:

Código:

#ifndef IMPRI_GRAPH
#define IMPRI_GRAPH

#include <vcl>
#pragma hdrstop

int imprime_gra (String nomarch_z);
int manda_imp (String nomarch_z, String rutaimp_z, int tipoimp, int ff);
int imprime_txt (String nomarch_z, String rutaimp_z, int ff);


//---------------------------------------------------------------------------

#pragma package(smart_init)
#endif

y

Código:

// Utilería que sirve para Imprimir un archivo de Modo Texto en Grafico
//   DRBR 26 de Agosto de 2002


//---------------------------------------------------------------------------
#include <stdio>
#include "imprigra.h"
#include "impre.h"
#include "Frm_prever.h"

int manda_imp (String nomarch_z, String rutaimp_z, int tipoimp, int ff)
{
  const int IMPRESORA_GRAFICA     = 1;
  const int IMPRESORA_MATRIZ      = 2;
  switch (tipoimp) {
     case IMPRESORA_GRAFICA: imprime_gra(nomarch_z); break;
     case IMPRESORA_MATRIZ : imprime_txt(nomarch_z, rutaimp_z, ff); break;
  }
  return 0;
}

int imprime_txt (String nomarch_z, String rutaimp_z, int ff)
{
  String cmd_z;
  cmd_z = "copy \"" + nomarch_z + "\" " + rutaimp_z + " /b";
  system(cmd_z.c_str());
  if(ff) {
    cmd_z = "copy \\windows\\ff.txt " + rutaimp_z + " /b";
    system(cmd_z.c_str());
  }
  return (mrOk);
}

int imprime_gra (String nomarch_z)
{
  const int OK                  = 1;
  const int MI_ERROR            = -1;
  const int PLANO               = 0;
  const int ESCAPE              = 1;
  const int SUBRAYADO           = 2;
  const int TAM_PICA            = 12;
  const int TAM_ELITE           = 10;
  const int TAM_PICA_COND       = 6;
  const int TAM_ELITE_COND      = 4;
  const int TAM_DOBLE           = 16;
  const int SCAPE               = 27;
  const int CONDENSED_ON        = 15;
  const int CONDENSED_OFF       = 18;
  const int EXPANDED_ON         = 14;
  const int EXPANDED_OFF        = 20;
  const int FORM_FEED           = 12;
  int MAX_LIN_X_PAG             = 66;

  int lineas_z=0, modo_z=0, tamfont_z, anttmfont_z, doble_z=0;
  String result_z = "";
  char car_z;
  FILE *archin;
  Timpre *graimpre;

  if ((archin = fopen((nomarch_z).c_str(), "rt")) == NULL) {
      Application->MessageBox(("No puedo abrir el archivo de Lectura\n"+nomarch_z).c_str(), "Archivo Invalido", MB_ICONEXCLAMATION);
      return (MI_ERROR);
  }

  graimpre = new Timpre();
  graimpre->cambia_nombrefont("Lucida Console");
  graimpre->cambia_tamfont(TAM_PICA);
  tamfont_z = TAM_PICA; anttmfont_z = tamfont_z; doble_z =0;
  while ( (car_z = fgetc(archin)) != EOF) {
    switch (modo_z) {
      case PLANO:
        switch(car_z) {
          case SCAPE: modo_z = ESCAPE; break;
          case '\n'  :
            if(doble_z) {
              graimpre->cambia_tamfont(doble_z); tamfont_z = doble_z;
              doble_z = 0;
            }
            lineas_z++; graimpre->saltalin();
            if(lineas_z > MAX_LIN_X_PAG) { graimpre->saltapag(); lineas_z = 0; }
            break;
          case FORM_FEED: graimpre->saltapag(); lineas_z = 0; break;
          case CONDENSED_ON:
            switch (tamfont_z) {
              case TAM_PICA: tamfont_z =TAM_PICA_COND; break;
              case TAM_ELITE: tamfont_z =TAM_ELITE_COND; break;
            }
            graimpre->cambia_tamfont(tamfont_z);
            break;
          case CONDENSED_OFF:
            switch (tamfont_z) {
              case TAM_PICA_COND: tamfont_z =TAM_PICA; break;
              case TAM_ELITE_COND: tamfont_z =TAM_ELITE; break;
            }
            graimpre->cambia_tamfont(tamfont_z);
            break;
          case EXPANDED_OFF:
            if(doble_z) {
              graimpre->cambia_tamfont(doble_z); tamfont_z = doble_z;
              doble_z = 0;
            }
            break;
          case EXPANDED_ON:
            anttmfont_z = tamfont_z; doble_z = anttmfont_z;
            switch (tamfont_z) {
              case TAM_PICA_COND: tamfont_z =TAM_PICA; break;
              case TAM_ELITE_COND: tamfont_z =TAM_ELITE; break;
              case TAM_PICA:
              case TAM_ELITE: tamfont_z =TAM_DOBLE; break;
            }
            graimpre->cambia_tamfont(tamfont_z);
            break;
          default    : graimpre->imprime_car(car_z); break;
        }
        break;
      case ESCAPE:
        switch(car_z) {
          case '-': modo_z = SUBRAYADO; break;
          case 'M':
          switch (tamfont_z) {
              case TAM_PICA_COND: tamfont_z =TAM_ELITE_COND; break;
              case TAM_PICA: tamfont_z =TAM_ELITE; break;
            }
            graimpre->cambia_tamfont(tamfont_z); modo_z = PLANO; break;
          case 'P':
            switch (tamfont_z) {
              case TAM_ELITE_COND: tamfont_z =TAM_PICA_COND; break;
              case TAM_ELITE: tamfont_z =TAM_PICA; break;
            }
            graimpre->cambia_tamfont(tamfont_z); modo_z = PLANO; break;
          case 'E': graimpre->font_bold_on(); modo_z = PLANO; break;
          case 'F': graimpre->font_bold_off(); modo_z = PLANO; break;
          case '0': graimpre->alto_z -= 2; MAX_LIN_X_PAG = 88; modo_z = PLANO; break;
          case '1': graimpre->alto_z += 2; MAX_LIN_X_PAG = 66; modo_z = PLANO; break;
          default : modo_z = PLANO; break;
        }
        break;
      case SUBRAYADO:
        switch(car_z) {
            case '0': graimpre->font_underline_off(); modo_z = PLANO; break;
            case '1': graimpre->font_underline_on(); modo_z = PLANO; break;
          }
          break;
    }
  }
  graimpre->cierraimpre();
  delete graimpre;
  fclose(archin);
// -> Fin del Archivo
  return (OK);
}
// ------------------------------------------

esta en una clase que mande hace tiempo en tips & tricks
espero que les sea útil,

ahora bien que para generar el reporte yo uso:

Código:

void __fastcall TForm_capentpro::imprimeExecute(TObject *Sender)
{
  double piva_z=0, importe_z=0, iva_z=0, total_z=0, costo_z=0, totcos_z=0,
  fletes_z=0, desxap_z=0, ctofincomp_z=0, ctofin_z=0, mub_z=0;
  String arch_z = Name+".txt", serie_z="", ciu_z="",
    prove_z="", codigo_z="", alm_z="";
  int nentrada_z=0, nartics_z=0;
  mensaje_z = "Desea imprimir " + este_z + " " + titulo_z;
  titmsg_z = "Impresión de " + titulo_z;
  if(Application->MessageBox(mensaje_z.c_str(), titmsg_z.c_str(), MB_ICONQUESTION+MB_YESNO) != mrYes) return;
  if( (archout = fopen(arch_z.c_str(), "wt")) == NULL) {
    Application->MessageBox("No puedo abrir el archivo textual de salida", "Error", MB_ICONQUESTION);
    return;
  }
  qry_renentra->DisableControls();
  qry_renentra->Tag == NO_REFRESH;
  nentrada_z = qry_entradas->FieldByName("numero")->AsInteger;
  prove_z = qry_entradas->FieldByName("prove")->AsString;
  alm_z = qry_entradas->FieldByName("alm")->AsString;
//  if(!qry_renentra->IsEmpty())
//    zona_z = qry_renpogas->FieldByName("zona")->AsInteger;
  pagina_z = 1; report_encab();
  for(qry_renentra->First(); !qry_renentra->Eof; qry_renentra->Next()) {
    if(lineas_z > LIN_X_PAG) {
      fprintf(archout, "%c", 12); pagina_z++; report_encab();
    }
    if(!nartics_z) {
      codigo_z = qry_renentra->FieldByName("codinv")->AsString;
    }
    if(codigo_z != qry_renentra->FieldByName("codinv")->AsString) {
      if(nartics_z > 1) {
        fprintf(archout, "%s|", cjust("Total de Este Articulo:", 44));
        fprintf(archout, "%s|", rjust(FormatFloat("####0", nartics_z), 5));
        fprintf(archout, "%s", rjust(FormatFloat("#,###,##0.00", totcos_z), 12));
      }
      fprintf(archout, "\n");
      codigo_z = qry_renentra->FieldByName("codinv")->AsString;
      nartics_z=0; totcos_z = 0;
    }
    if( sTipo != "Q") {
        costo_z = qry_renentra->FieldByName("costou")->AsFloat;
    } else {
        costo_z = qry_renentra->FieldByName("prvta")->AsFloat;
    }
    totcos_z += qry_renentra->FieldByName("costou")->AsFloat;
    nartics_z++; mub_z = -1;
    if (qry_renentra->FieldByName("precio")->AsFloat != 0)
      mub_z = (qry_renentra->FieldByName("precio")->AsFloat -
              qry_renentra->FieldByName("costoneto")->AsFloat ) /
              qry_renentra->FieldByName("precio")->AsFloat * 100;
    fprintf(archout, "%s %s|%s|%s|%s|%s|%s\n",
      ljust(qry_renentra->FieldByName("codinv")->AsString, 13),
      ljust(qry_renentra->FieldByName("descri")->AsString, 30),
      rjust(IntToStr(qry_renentra->FieldByName("folent")->AsInteger), 5),
      rjust(FormatFloat("#,###,##0.00", costo_z), 12),
      rjust(FormatFloat("#,###,##0.00", qry_renentra->FieldByName("costoneto")->AsFloat), 12),
      rjust(FormatFloat("#,###,##0.00", qry_renentra->FieldByName("precio")->AsFloat), 12),
      rjust(FormatFloat("##0.00", mub_z), 5)
    );
    piva_z = qry_renentra->FieldByName("piva")->AsFloat;
    importe_z += costo_z;
    iva_z += qry_renentra->FieldByName("costou")->AsFloat * (piva_z / 100);
    total_z = importe_z + iva_z;
  }
  if(nartics_z > 1) {
    fprintf(archout, "%s|", cjust("Total de Este Articulo:", 44));
    fprintf(archout, "%s|", rjust(FormatFloat("####0", nartics_z), 5));
    fprintf(archout, "%s\n", rjust(FormatFloat("#,###,##0.00", totcos_z), 12));
  }
  fprintf(archout, "%s\n",
    rjust(
      "Importe:" + FormatFloat("#,###,##0.00", importe_z) +
      "   Iva:" + FormatFloat("#,###,##0.00", iva_z) +
      "   Total:" + FormatFloat("#,###,##0.00", total_z), 63
    )
  );
  totcos_z = qry_entradas->FieldByName("importe")->AsFloat +
    qry_entradas->FieldByName("iva")->AsFloat;
  fletes_z = qry_entradas->FieldByName("fletes")->AsFloat;
  desxap_z = qry_entradas->FieldByName("desxap")->AsFloat;
  ctofincomp_z = qry_entradas->FieldByName("ctofincomp")->AsFloat;
  ctofin_z = qry_entradas->FieldByName("ctofin")->AsFloat;
  totcos_z = totcos_z- fletes_z + ctofin_z + ctofincomp_z + desxap_z;
  fprintf(archout, "Fletes: %s Descuento x Aplicar: %s Costo Financiero de Compra: %s\n",
    ljust(FormatFloat("#,###,##0.00", fletes_z), 12),
    ljust(FormatFloat("#,###,##0.00", desxap_z), 12),
    ljust(FormatFloat("#,###,##0.00", ctofincomp_z), 12)
  );
  fprintf(archout, " Costo Financiero de Proveedor: %s %s\n",
    ljust(FormatFloat("#,###,##0.00", ctofin_z), 12),
    rjust("Gran Total: " + FormatFloat("#,###,##0.00", totcos_z), 33)
  );
  fprintf(archout, "%s%s%s\n", serie_z.StringOfChar('=',80),
    dm->font_impre(dm->impre_z, ELITE),
    dm->font_impre(dm->impre_z, SUBRAYADO_ON)
  );
  fprintf(archout, "%s|%s|%s|%s|%s|%s|%s|%s%s\n",
    "Lta",
    cjust("Vence", 10),
    rjust("Costo_F.Comp", 12),
    rjust("Capital", 12),
    rjust("Interes", 12),
    rjust("IVA", 12),
    rjust("DescxAplicar",12),
    rjust("Saldo",12),
    dm->font_impre(dm->impre_z, SUBRAYADO_OFF)
  );
  qry_mventpag->Close();
  qry_mventpag->ParamByName("entrada")->AsInteger = nentrada_z;
  qry_mventpag->ParamByName("prove")->AsString = prove_z;
  qry_mventpag->ParamByName("cia")->AsInteger = cia_z;
  qry_mventpag->Open();
  totcos_z = 0;
  for(qry_mventpag->First(); !qry_mventpag->Eof; qry_mventpag->Next()) {
    fprintf(archout, "%s|%s|%s|%s|%s|%s|%s|%s\n",
      rjust(qry_mventpag->FieldByName("pagare")->AsString, 3),
      rjust(FormatDateTime("dd-mm-yyyy", qry_mventpag->FieldByName("vence")->AsDateTime), 10),
      rjust(FormatFloat("##,##0.00", qry_mventpag->FieldByName("cfc")->AsFloat), 12),
      rjust(FormatFloat("##,##0.00", qry_mventpag->FieldByName("capital")->AsFloat), 12),
      rjust(FormatFloat("##,##0.00", qry_mventpag->FieldByName("interes")->AsFloat), 12),
      rjust(FormatFloat("##,##0.00", qry_mventpag->FieldByName("iva")->AsFloat), 12),
      rjust(FormatFloat("##,##0.00", qry_mventpag->FieldByName("desxap")->AsFloat), 12),
      rjust(FormatFloat("##,##0.00", qry_mventpag->FieldByName("saldo")->AsFloat), 12)
    );
    totcos_z += qry_mventpag->FieldByName("saldo")->AsFloat;
  }
  fprintf(archout, "%sVencimiento:%s %s %s%s\n",
    dm->font_impre(dm->impre_z, SUBRAYADO_ON),
    rjust(FormatDateTime("dd-mm-yyyy", qry_entradas->FieldByName("vence")->AsDateTime), 10),
    rjust("Total:", 56),
    rjust(FormatFloat("##,##0.00", totcos_z), 12),
    dm->font_impre(dm->impre_z, SUBRAYADO_OFF)
  );
  TQuery *qry_observs = new TQuery (this);
  qry_observs->DatabaseName = qry_entradas->DatabaseName;
  qry_observs->SQL->Text=("select * from observent where tipo = :Tipo and alm =:Almac and numero = :Numero and cia = :Cia order by conse");
  qry_observs->ParamByName("tipo")->AsString = sTipo;
  qry_observs->ParamByName("almac")->AsString = alm_z;
  qry_observs->ParamByName("numero")->AsInteger = nentrada_z;
  qry_observs->ParamByName("cia")->AsInteger = cia_z;
  qry_observs->Open();
  for(qry_observs->First(); !qry_observs->Eof; qry_observs->Next()) {
      fprintf(archout, "%s %s\n",
        FormatDateTime("dd/mm/yyyy ", qry_observs->FieldByName("fecha")->AsDateTime),
        qry_observs->FieldByName("observs")->AsString
      );
  }
  qry_observs->Close();
  delete qry_observs;
  fclose(archout);

//  vehiculo, kmts, serv, descri, chofer, costo, cambio
  qry_renentra->Tag == SI_REFRESH;
  qry_renentra->EnableControls();
  if(dm->preview_z) {
    VistaPrevia(this, arch_z, dm->rutaimp_z, dm->tipoimp_z, dm->ff_z);
  } else {
    manda_imp(arch_z, dm->rutaimp_z, dm->tipoimp_z, dm->ff_z);
  }
}
//---------------------------------------------------------------------------

void __fastcall TForm_capentpro::report_encab()
{
  fprintf(archout, "%s%s%s\n", dm->font_impre(dm->impre_z, PICA_PITCH),
    dm->font_impre(dm->impre_z, CONDENSADO_OFF), cjust(dm->nemp_z, 80)
  );
  fprintf(archout, "%s%s%s%s Pag:%d\n", dm->font_impre(dm->impre_z, CONDENSADO_ON),
    FormatDateTime("dd-mm-yyyy hh:mm", Now()),
    dm->font_impre(dm->impre_z, CONDENSADO_OFF),  cjust(dm->diremp_z, 64), pagina_z
  );
  fprintf(archout, "Impresion de %s\n", titulo_z);
  fprintf(archout, "Numero:%6d Almacen:%s %s Fecha:%s\n",
    qry_entradas->FieldByName("numero")->AsInteger,
    qsAlmacen->FieldByName("clave")->AsString,
    qsAlmacen->FieldByName("nombre")->AsString,
    FormatDateTime("dd-mm-yyyy", qry_entradas->FieldByName("fecha")->AsDateTime),
    dm->font_impre(dm->impre_z, CONDENSADO_ON)
  );
  fprintf(archout, "%s%s%s|%s|%s|%s|%s|%s%s\n",
    dm->font_impre(dm->impre_z, SUBRAYADO_ON),
    dm->font_impre(dm->impre_z, CONDENSADO_ON),
    cjust("Articulo", 44),
    rjust("Folio", 5),
    rjust("Costo.Unitar", 12),
    rjust("Costo Neto", 12),
    ljust("Precio Lista", 12),
    "MUB",
    dm->font_impre(dm->impre_z, SUBRAYADO_OFF)
  );
  lineas_z = 5;
//  report_subencab();
}
//---------------------------------------------------------------------------


donde la funcion

dm->font_impre(dm->impre_z, SUBRAYADO_OFF)
esta definida como:

Código:

String __fastcall Tdm::font_impre(int impre, int font)
{
  String fnt_z, secuen_z;
  char car_z, cad_z[50];
  memset(cad_z, 0, 50);
  int ii_z=0;
  qry_fonts->Close();
  qry_fonts->ParamByName("impre")->AsInteger = impre;
  qry_fonts->ParamByName("font")->AsInteger = font;
  qry_fonts->Open();
  if(!qry_fonts->IsEmpty()) {
    secuen_z=qry_fonts->FieldByName("secuen")->AsString;
    for(ii_z = 1; ii_z <qry_fonts>FieldByName("ncars")->AsInteger; ii_z++) {
      car_z = secuen_z.SubString( ( (ii_z -1)*3 + 1   ), 3).ToIntDef(0);
      cad_z[ii_z - 1] = car_z;
    }
  }
  fnt_z = cad_z;
  return (fnt_z);
}
//---------------------------------------------------------------------------

uff, un poco largo no ?

bien que qry_fonts es
select * from fonts where impre = :IMPRE and numero = :FONT

y mi tabla fonts es:

CREATE TABLE FONTS (
IMPRE SMALLINT,
NUMERO SMALLINT,
NOMBRE CHAR(20),
NCARS SMALLINT,
SECUEN CHAR(150));

y el contenido es:
I fonts.dat Row 1 Col 1 11:38 Ctrl-K H for help
'1','1','ITALICAS_ON ','2','027052
'1','2','ITALICAS_OFF ','2','027053
'1','3','COURIER ','3','027107000
'1','4','SANSERIF ','3','027107001
'1','5','LETTER-GOTHIC ','3','027107002
'1','6','ORATOR ','3','027107003
'1','7','SCRIPT ','3','027107004
'1','8','OCR-B ','3','027107005
'1','9','TW-LIGHT ','3','027107006
'1','10','CINEMA ','3','027107007
'1','11','PICA-PITCH ','2','027080
'1','12','ELITE ','2','027077
'1','13','CONDENSADO_ON ','1','015
'1','14','CONDENSADO_OFF ','1','018
'1','15','ON LINE EXPANDED ON ','1','014
'1','16','ON LINE EXPANDED OFF','1','020
'1','17','EMPHAIZED ON ','2','027069
'1','18','EMPHAIZED OFF ','2','027070
'1','19','SUBRAYADO ON ','3','027045049
'1','20','SUBRAYADO OFF ','3','027045048
'1','21','SUPERAYADO ON ','3','027095049
'1','22','SUPERAYADO OFF ','3','027095048
'1','23','SUBSCRIPT ON ','3','027083049

'1','25','SUPER-SUBSCRIPT OFF ','2','027084
'1','26','REVERSE LF ','2','027010
'1','27','OCTAVOS ','2','027048
'1','28','ESPACIO 7/72 ','2','027049
'1','29','SEXTOS ','2','027050
'1','30','FORM-FEED FF ','1','012
'1','31','REVERSE FEED FF ','2','027012
'1','32','ZERO SLASH ','3','027126049
'1','33','ZERO NOT SLASH ','3','027126048
'1','34','RESET ','2','027064
'1','35','DISABLE PAPER-OUT ','2','027056
'1','36','ENABLE PAPER-OUT ','2','027057
'1','37','SET ON-LINE ','1','017
'1','38','SET OFF-LINE ','1','019
'1','39','MAST-COND-ENF-ON ','3','027033004
'1','40','MAST-COND-ENF-OFF ','3','027033000

esto es para una impresora Esc/P2

ufff. a ver si alguien se anima a leer todo esto. Espero que les sirva:

Wink
_________________
La caja decía, requiere Win95 o superior así que instalé Linux.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

He entendido la respuesta.
Reinterpretas la manera de imprimir, y lo haces desde windows.
Yo me refería a imprimir un archivo que contiene los comandos ESC, pero claro tiene algún que otro 0 por ahí metido.
Estoy haciendo pruebas y ya he conseguido hacer funcionar el programita, aunque faltan algunas cosillas. En cuanto chute bien lo publico. Hace lo mismo que el sistema de comandos copy prn, pero en modo automático y "de momento" sin problemas.

Estudiare tu código profundamente (tengo para rato) y sobre todo la conversión de los caracteres a modo win puesto que ya hace tiempo intente hacerlo y no me salia correcto. Mira mi post
https://cppbuilder.es/viewtopic.php?t=12128
Creo que tu lo has conseguido. En cambio yo no me aclaro con el tetxwidth.
Como ya te he dicho estudiare profundamente tu código.

Muchas gracias
Saludos, bosoft.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Imprime caracteres extra Responder citando

Buenas tardes,

Utilizo la funcion ImprimeLineas, y funciona bien. Pero no se porque al inicio de la impresión, me imprime los siguientes caracteres .nP

No son caracteres que mande yo imprimir, eso si, si apago la impresora y la enciendo, en la primera impresión no imprime dichos caracteres.

Os agradezco de antemano la ayuda

Gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.