 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
Publicado: Mie 12 May, 2004 2:52 pm Asunto: Code 128 |
|
|
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 |
|
 |
laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
Publicado: Mie 12 May, 2004 2:55 pm Asunto: Origen |
|
|
| 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 |
|
 |
laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
Publicado: Vie 08 Jun, 2007 2:06 pm Asunto: |
|
|
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 |
|
 |
rockman2003 Master

Registrado: 27 Ene 2004Mensajes: 202Ubicación: Madrid
|
Publicado: Mie 07 Oct, 2009 12:07 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|