Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki

Delphi: Cómo generar códigos de barras EAN8 y EAN13 con Delphi 6
AjpdSoft


Tutorial donde mostramos cómo generar códigos de barras EAN8 y EAN13 desarrollando una aplicación con el lenguaje de programación Delphi 6. Incluimos una aplicación con código fuente gratuito: AjpdSoft Generador de códigos de barras, que servirá como ejemplo. Publicamos esta aplicación gratuita y open source (con código fuente en Delphi 6) que permite generar códigos de barras EAN8 y EAN13. La aplicación permite imprimir el código generado o guardarlo en fichero de imagen y calcular el dígito de control.



     

    Videotutorial AjpdSoft Generador de códigos de barras, uso y funcionamiento

    A continuación mostramos un videotutorial sobre cómo usar y cómo funciona AjpdSoft Generador de códigos de barras:

     

    Estructura de un código de barras EAN13

    En el siguiente enlace mostramos un tutorial donde explicamos la estructura de un código de barras EAN13:

     

    Aplicación AjpdSoft Generador de códigos de barras en Delphi 6

    El desarrollo de la aplicación es bastante sencillo, en Delphi 6 crearemos un formulario donde coloraremos los siguientes componentes:

    • TLabel: para etiquetar los cuadros de texto y mostrar información.
    • TEdit: para la introducción de los códigos de barras EAN8 y EAN13.
    • TButton: para generar el código de barras, imprimir, guardar en fichero de imagen y cerrar la aplicación.
    • TImage: para mostrar el código de barras generado en pantalla.
    • TQuickRep: para mostrar el código de barras generado en vista previa antes de imprimir.

    A continuación mostramos cómo quedarían los componentes en el formulario principal de la aplicación AjpdSoft Generador de códigos de barras:

    Aplicación AjpdSoft Generador de códigos de barras en Delphi 6

    Más abajo listamos el código fuente de cada botón de la aplicación:

    Y la aplicación completa con el código fuente gratuito y open source:

    La aplicación en funcionamiento, generando un código de barras EAN8:

    Aplicación AjpdSoft Generador de códigos de barras en Delphi 6

    Generando un código de barras EAN13:

    Aplicación AjpdSoft Generador de códigos de barras en Delphi 6

    Si el dígito de control introducido por el usuario es incorrecto mostrará un mensaje con el dígito de control del código de barras correcto, lo modificará y lo generará:

    Aplicación AjpdSoft Generador de códigos de barras en Delphi 6

     

     

    Código fuente AjpdSoft Generador de códigos de barras en Delphi 6

    A continuación mostramos el listado del código fuente completo de AjpdSoft Generador de códigos de barras. Mostramos un ejemplo práctico sobre cómo generar códigos de barras EAN8 y EAN13 mediante Delphi sin usar componentes adicionales y cómo calcular el dígito de control de un EAN8 y EAN13, pues la aplicación AjpdSoft Generador de códigos de barras obtiene el último dígito introducido por el usuario y comprueba si es el dígito de control correcto, si no lo es muestra el correcto y genera el código de barras con el dígito recalculado:

    unit UnidadMenuPrincipal;
    interface
    uses
      Windows, SysUtils, Forms, Dialogs, Graphics, StdCtrls, 
      ExtCtrls, Classes, Controls, printers,
      Qrctrls, QuickRpt, shellapi;
    const
      EAN_izqA : array[0..9] of
      PChar=('0001101','0011001','0010011','0111101','0100011',
           '0110001','0101111','0111011','0110111','0001011');
      EAN_izqB : array[0..9] of
      PChar=('0100111','0110011','0011011','0100001','0011101',
           '0111001','0000101','0010001','0001001','0010111');
      EAN_dcha : array[0..9] of
      PChar=('1110010','1100110','1101100','1000010','1011100',
           '1001110','1010000','1000100','1001000','1110100');
      CodificaIzq : array[0..9] of
      PChar=('AAAAA','ABABB','ABBAB','ABBBA','BAABB','BBAAB',
           'BBBAA','BABAB','BABBA','BBABA');
    type
      TformMenuPrincipal = class(TForm)
        Panel1: TPanel;
        Grafico: TImage;
        Edit1: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        Button1: TButton;
        Panel2: TPanel;
        Button2: TButton;
        Button3: TButton;
        LImpresion: TQuickRep;
        TitleBand1: TQRBand;
        LImagen: TQRImage;
        Button4: TButton;
        LWEB: TLabel;
        SaveDialog1: TSaveDialog;
      procedure Edit1KeyPress(Sender: TObject; var Key: Char);
        procedure Button1Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure LWEBClick3(Sender: TObject);
      private
      { Private declarations }
      public
      { Public declarations }
      // procedimiento que codifica el número en un nº binario
      procedure Codifica(num : string);
      // procedimiento para dibujar el cód. de barras a partir del nº binario
      procedure Dibujar(matrix : string);
      // procedimiento para validar-corregir los códigos
      procedure EANCorrecto(var num : string);
    end;
    
    var
      formMenuPrincipal: TformMenuPrincipal;
    
    implementation
    
    {$R *.DFM}
    procedure TformMenuPrincipal.EANCorrecto(var num : string);
    var
      i,N : byte;
      sum : integer;
      flag : byte;
    begin
      sum:=0;
      N:=Length(num)-1;
      for i:=1 to N do
      begin
        if (i mod 2)=0 then
        begin
          if N=12 then
            sum:=sum+StrToInt(num[i])*3
          else
            sum:=sum+StrToInt(num[i]);
        end
        else
        begin
          if N=12 then
            sum:=sum+StrToInt(num[i])
          else
            sum:=sum+StrToInt(num[i])*3;
        end;
      end;
      if sum>99 then
        Flag:=10-(sum mod 100)
      else
        Flag:=10-(sum mod 10);
      if Flag=10 then Flag:=0;
      if not(StrToInt(num[N+1])=flag) then
      begin
        ShowMessage('El dígito de control no es válido y será cambiado'+#13+
        'El dígito correcto es '+IntToStr(Flag));
        num:=copy(num,1,length(num)-1)+IntToStr(Flag);
      end;
    end;
    
    
    procedure TformMenuPrincipal.Codifica(num : string);
    var
      matrix : string;
      i : integer;
    begin
      num:=Edit1.Text;
      matrix:='';
      case Length(num) of
      13: begin
        EANCorrecto(num);
        Edit1.Text:=num;
        matrix:=matrix+'x0x'; // barra inicio
        matrix:=matrix+EAN_izqA[StrToInt(num[2])];
        for i:=3 to 7 do
          if CodificaIzq[StrToInt(num[1])][i-3]='A' then
            matrix:=matrix+EAN_izqA[StrToInt(num[i])]
          else
            matrix:=matrix+EAN_izqB[StrToInt(num[i])];
        matrix:=matrix+'0x0x0'; // barra central
        matrix:=matrix+EAN_dcha[StrToInt(num[8])];
        matrix:=matrix+EAN_dcha[StrToInt(num[9])];
        matrix:=matrix+EAN_dcha[StrToInt(num[10])];
        matrix:=matrix+EAN_dcha[StrToInt(num[11])];
        matrix:=matrix+EAN_dcha[StrToInt(num[12])];
        matrix:=matrix+EAN_dcha[StrToInt(num[13])];
        matrix:=matrix+'x0x'; // barra final
        Dibujar(Matrix);
      end;
      8: begin
        EANCorrecto(num);
        Edit1.Text:=num;
        matrix:=matrix+'x0x';
        matrix:=matrix+EAN_izqA[StrToInt(num[1])];
        matrix:=matrix+EAN_izqA[StrToInt(num[2])];
        matrix:=matrix+EAN_izqA[StrToInt(num[3])];
        matrix:=matrix+EAN_izqA[StrToInt(num[4])];
        matrix:=matrix+'0x0x0';
        matrix:=matrix+EAN_dcha[StrToInt(num[5])];
        matrix:=matrix+EAN_dcha[StrToInt(num[6])];
        matrix:=matrix+EAN_dcha[StrToInt(num[7])];
        matrix:=matrix+EAN_dcha[StrToInt(num[8])];
        matrix:=matrix+'x0x';
        Dibujar(Matrix);
      end
      else
        ShowMessage('LONGITUD DE CODIGO NO VALIDA');
      end;
    end;
    
    procedure TformMenuPrincipal.Dibujar(matrix : string);
    var
      i : integer;
    begin
      Grafico.Canvas.Brush.Color:=clWhite;
      Grafico.Canvas.FillRect(Rect(0,0,Grafico.Width,Grafico.Height));
      Grafico.Canvas.Pen.Color:=clBlack;
      for i:=1 to Length(Matrix) do
        if matrix[i]='1' then
          Grafico.Canvas.PolyLine([Point(10+i,10),Point(10+i,50)])
        else
          if matrix[i]='x' then
            Grafico.Canvas.PolyLine([Point(10+i,10),Point(10+i,55)]);
          if Length(Edit1.Text)=13 then
          begin
            Grafico.Canvas.TextOut(3,50,Edit1.Text[1]); 
            Grafico.Canvas.TextOut(17,50,copy(Edit1.Text,2,6));
            Grafico.Canvas.TextOut(63,50,copy(Edit1.Text,8,6));
          end
          else
          if Length(Edit1.Text)=8 then
          begin
            Grafico.Canvas.TextOut(16,50,copy(Edit1.Text,1,4));
            Grafico.Canvas.TextOut(48,50,copy(Edit1.Text,5,4));
          end;
    end;
    
    procedure TformMenuPrincipal.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
      if Key = #13 then
      begin
        Codifica(Edit1.Text);
        Edit1.SelectAll;
      end;
    end;
    procedure TformMenuPrincipal.Button1Click(Sender: TObject);
    begin
      Codifica(Edit1.Text);
      Edit1.SelectAll;
    end;
    
    procedure TformMenuPrincipal.Button3Click(Sender: TObject);
    begin
      close;
    end;
    
    procedure TformMenuPrincipal.Button2Click(Sender: TObject);
    begin
      LImagen.Picture := grafico.Picture;
      LImpresion.Preview;
    end;
    
    procedure TformMenuPrincipal.Button4Click(Sender: TObject);
    begin
      if SaveDialog1.Execute then
        Grafico.Picture.SaveToFile(SaveDialog1.FileName);
    end;
    
    procedure TformMenuPrincipal.LWEBClick3(Sender: TObject);
    begin
      ShellExecute(Handle, Nil, PChar(LWEB.CAPTION),
          Nil, Nil, SW_SHOWNORMAL);
    end;
    
    end.
    
    

     

    Artículos relacionados


    Créditos

    Artículo realizado íntegramente por Alonsojpd miembro fundador del Proyecto AjpdSoft.

    Artículo en inglés.



    Nota: Actualizado por Alonso J. Pérez el 03-05-2014.
    Anuncios


Enviado el Lunes, 24 noviembre a las 15:01:09 por ajpdsoft
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A