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 

Code 128

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Code 128 Responder citando

Hola.

Tras mucho volverme loco he desarrollado este código que permite generar un código de barras de tipo Code 128 B. En este código está basado el estándar EAN 128.
Se necesita antes de llamar a esta función tener instalado la fuente True Type PF_C128. Esta fuente me la bajé de un artículo que escribió alguien para hacer esto mismo en Fox. En cuanto encuentre como se llamaba lo pondré por aquí. Es a quien hay que agradecer esto.
Esta fuente esta en nuestro FTP: 200.68.70.249 (cbuilder, cbuildero, gracias Adrián Deccico). Además en el FTP He creado una carpeta en la que he metido todo lo que he podido reunir acerca de los códigos de barras (fuentes,ejemplos,etc...). El código que yo he hecho sirve para un tipo. Aquí tal vez encontreis ayuda para otros tipos.
Este código está funcionando ya dentro de mis programas. La parte del código de "cómo llamar a la función Code128" la he puesto sobre la marcha, así que seguro que me he dejado algún Canvas o algún Printer().
Lo he puesto lo más simple y clarito que se me ha ocurrido.Espero que os sirva de ayuda. (Y si alguien se le ocurre cómo mejorar esto, pues soy todo oídos)
Suerte!

//---------------------------------------------------------------------------
// Esto devuelve un AnsiString convertido en un AnsiString de código 128 B
// El Code 128 A admite letras mayúsculas y minúsculas
// El Code 128 B admite letras mayúsculas, minúsculas y números. Pero en total
// son 106 caracteres, no todos de la tabla ASCII. Ojo que esto puede originar
// problemas, ya que tú puedes poner una barra (/) y luego leer una coma(')
// El Code 128 C admite sólo números.
// Yo sólo trabajo con el B.
// Si se encuentra un carácter no válido lo cambia a espacio
// La fuente true type se ha organizado de manera que empieza en el 33.
// Se han hecho coincidir las codificaciones de cada caracter con su
// correspondencia en la tabla ASCII normal. Esto origina que para calcular
// el checksum se deba restar 32 y al final el caracter del checksum haya
// que buscarlo 32 más arriba
//---------------------------------------------------------------------------
AnsiString __fastcall Code128(AnsiString Literal)
{
char start,stop;
char *lit;
int checksum,caracter,asc;
AnsiString devuelve;
unsigned char check;

lit = new char[Literal.Length()+1];
strcpy(lit,Literal.c_str());

start = 136; // 104+32 que es donde se ha puesto el start del Code 128 B
stop = 138; //106+32 que es donde se ha puesto el stop
checksum = 104; //para el calculo del checksum se cuenta el start (pero el de verdad)

// La tabla del code 128 va del 0 al 106 (son 107 caracteres)
// El espacio es el 0 y el 106 es el STOP
// Los caracteres por encima de 94 son de control (aqui no se van a usar)
// Permiten en un momento dado cambiar el juego de caracteres entre 128A, 128B y 128C
// Hay que tener en cuenta que en la tabla ASCII los caracteres del Code 128
// están entre el 33 y el 126
for(caracter=0;caracter <Literal> 126 || lit[caracter] <32> 126) check += 65;
//No olvidar que a veces el checksum puede ser 32 y el 32 no vale, es el 232
if(check == 32) check = 232;

devuelve = AnsiString(start)+AnsiString(lit)+AnsiString(char(check))+AnsiString(stop);
delete lit;
return(devuelve);
}

//Para usar esta función:
void __fastcall TForm1::BotonClick(TObject *Sender)
{
TRect rectangulo;
int x = 50;
int y = 50;

Printer()->Title = "Imprimir Code 128";
Printer()->BeginDoc();
Printer()->Canvas->Font->Size = 44;
Printer()->Canvas->Font->Name = "PF Barcode 128"; //IMPORTANTE!!!
rectangulo.Left = x;
rectangulo.Top = y;
rectangulo.Right = x+Printer()->Canvas->TextWidth(literal);
rectangulo.Bottom = y+Printer()->Canvas->TextHeight(literal);
Printer()->Canvas->TextRect(rectangulo,x,y,"Code 128");
Printer()->EndDoc();
}


Ultima edición por laremi400 el Vie 08 Jun, 2007 2:09 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Origen Responder citando

Para hacer este código partí de uno que hizo una tal Luis María Guayán para hacer esto mismo (Y más cosas) en FOX Pro. Un fiera. Mi agradecimiento, y espero que el de los demás.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola de nuevo.
He detectado un par errores en el código que puse la primera vez y ahora lo he corregido. Si alguien enloqueció por mi culpa le ruego me disculpe.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Yo me basé en este mismo en su momento, pero es que ayer... despues de 3 años utilizandolo me di cuenta que cuando el resultado de hacer el modulo de 103, devuelve un 0, no funciona, ya que en vez de usar el caracter 32, hay que usar el 232.

Código:

   char start,stop;
   char *lit;
   int checksum,caracter,asc;
   String devuelve;
   unsigned char check;

   lit = new char[Literal.Length()+1];
   strcpy(lit,Literal.c_str());

   start = 136; // 104+32 que es donde se ha puesto el start del Code 128 B
   stop = 138; //106+32 que es donde se ha puesto el stop
   checksum = 104; //para el calculo del checksum se cuenta el start (pero el de verdad)    (104 = 136 -32)

   // La tabla del code 128 va del 0 al 106 (son 107 caracteres)
   // El espacio es el 0 y el 106 es el STOP
   // Los caracteres por encima de 94 son de control (aqui no se van a usar)
   // Permiten en un momento dado cambiar el juego de caracteres entre 128A, 128B y 128C
   // Hay que tener en cuenta que en la tabla ASCII los caracteres del Code 128
   // están entre el 33 y el 126
   for(caracter=0;caracter <Literal> 126 || lit[caracter] < 32)
      {
         //Hay un caracter no valido
         return "";
         //lit[caracter] = 32;
      }
      // El checksum se calcula a base de multiplicar el caracter por su posicion
      // (la posicion empieza en 1 ¡OJO!)
      // y sumandolo todo y luego sacandole el resto (módulo)
      checksum = checksum + ((lit[caracter]-32)*(caracter+1));
      // Una vez que ya se ha realizado la operacion se pone el caracter de espacio
      // ya que en vez de estar en el 32 esta en el 232 (en la tabla ASCII)

      if(lit[caracter] == 32)
         lit[caracter] = 232;

   }
   //El módulo de 103 es el checksum
   check = (checksum % 103)+32; //el caracter del checksum esta realmente 32 más arriba

   if(check == 127) check = 192;
   if(check == 128) check = 193;
   if(check == 32)  check = 232; //De locura!!! hasta que he dado con esto...
   devuelve = String(start)+String(lit)+String(char(check))+String(stop);
   delete lit;
   return(devuelve);
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
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.