Código de Barras EAN 13 e EAN 8

 

Nesse artigo mostrarei como desenhar dois tipos de código de barras EAN 13 e EAN 8, em um PictureBox, não enfocarei nesse artigo a explicação de como construir o algaritimo de desenho do Código de Barra, é necessário um estudo especifico no Padrão EAN para entender como é construído um Código de Barra, estaria disponibilizando as funções necessárias e explicando o processo para a confecção de um aplicativo simples.

Em outro artigo estarei demonstrando como imprimir esse Código de barra usando o componente PrintDocument.

Vamos iniciar uma novo Projeto Windows Forms, coloque um Label altere o Text para Código de Barra, um TextBox, um PictureBox altere a BackColor para Window, um Button altere o Text para Desenhar, seu formulário deve ficar parecido com a Figura 1.

BarCode1.gif 

Figura 1. Como deve ficar os componentes no Formulário

Declare a Função EANCodeBin, ela transforma o Código EAN em Binário essa função é usada pela função PrintEanBarcode, acompanhe a Listagem 1.

 

Listagem 1. Função EANCodeBIN

function EANCodeBIN(strEANCode: string): string;

var

  I : Integer;

  str, strAux, StrBinCode, StrCodigo : String;

begin

  strEANCode := Trim(strEANCode);

  strAux := strEANCode;

  If (strAux.Length <> 13) And (strAux.Length <> 8) Then

    Exception.Create('Código EAN Inválido');

 

  for  I := 0 to strEANCode.Length - 1 do

    if (strAux.Chars[I].ToString < '0') or (strAux.Chars[I].ToString > '9') then

      Exception.Create('Caracter Inválidos no EAN');

 

  If (strAux.Length = 13) Then

  begin

    strAux := Copy(strAux,2,Length(StrAux));

 

    Case Convert.ToInt32(Copy(strEANCode,1,1)) of

      0: StrCodigo := '000000';

      1: StrCodigo := '001011';

      2: StrCodigo := '001101';

      3: StrCodigo := '001110';

      4: StrCodigo := '010011';

      5: StrCodigo := '011001';

      6: StrCodigo := '011100';

      7: StrCodigo := '010101';

      8: StrCodigo := '010110';

      9: StrCodigo := '011010';

    end;

  end

  else

      StrCodigo := '0000';

 

  StrBinCode := '000101';

  For I := 1 To (Length(strAux) div 2) do

    Case Convert.ToInt32(Copy(strAux, I, 1)) of

      0:

        begin

          if Copy(StrCodigo, I, 1) = '0' then

            StrBinCode := StrBinCode + '0001101'

          else

            StrBinCode := StrBinCode + '0100111';

        end;

      1:

        begin

          if Copy(StrCodigo, I, 1) = '0' then

            StrBinCode := StrBinCode + '0011001'

          else

            StrBinCode := StrBinCode + '0110011';

        end;

      2:

        begin

          if Copy(StrCodigo, I, 1) = '0' then

            StrBinCode := StrBinCode + '0010011'

          else

            StrBinCode := StrBinCode + '0011011';

        end;

      3:

        begin

          if Copy(StrCodigo, I, 1) = '0' then

            StrBinCode := StrBinCode + '0111101'

          else

            StrBinCode := StrBinCode + '0100001';

        end;

      4:

        begin

          if Copy(StrCodigo, I, 1) = '0' then

            StrBinCode := StrBinCode + '0100011'

          else

            StrBinCode := StrBinCode + '0011101';

        end;

      5:

        begin

          if Copy(StrCodigo, I, 1) = '0' then

            StrBinCode := StrBinCode + '0110001'

          else

            StrBinCode := StrBinCode + '0111001';

        end;

      6:

        begin

          if Copy(StrCodigo, I, 1) = '0' then

            StrBinCode := StrBinCode + '0101111'

          else

            StrBinCode := StrBinCode + '0000101';

        end;

      7:

        begin

          if Copy(StrCodigo, I, 1) = '0' then

            StrBinCode := StrBinCode + '0111011'

          else

            StrBinCode := StrBinCode + '0010001';

        end;

      8:

        begin

          if Copy(StrCodigo, I, 1) = '0' then

            StrBinCode := StrBinCode + '0110111'

          else

            StrBinCode := StrBinCode + '0001001';

        end;

      9:

        begin

          if Copy(StrCodigo, I, 1) = '0' then

            StrBinCode := StrBinCode + '0001011'

          else

            StrBinCode := StrBinCode + '0010111';

        end;

    end;

    StrBinCode := StrBinCode + '01010';

 

    for I := (Length(strAux) div 2 + 1) To Length(strAux) do

      case Convert.ToInt32(Copy(strAux, I, 1)) of

        0 : StrBinCode := StrBinCode + '1110010';

        1 : StrBinCode := StrBinCode + '1100110';

        2 : StrBinCode := StrBinCode + '1101100';

        3 : StrBinCode := StrBinCode + '1000010';

        4 : StrBinCode := StrBinCode + '1011100';

        5 : StrBinCode := StrBinCode + '1001110';

        6 : StrBinCode := StrBinCode + '1010000';

        7 : StrBinCode := StrBinCode + '1000100';

        8 : StrBinCode := StrBinCode + '1001000';

        9 : StrBinCode := StrBinCode + '1110100';

      end;

 

      StrBinCode := StrBinCode + '101000';

 

      EANCodeBIN := StrBinCode;

    end;

 

Agora vamos a declarar a função PrintEANBarCode, é necessário passar os seguintes parâmetros, o Código de Barra e o Objeto PictureBox aonde será desenhado as Brras do Código de Barra, os outros parâmetros são opcionais, os quatro parâmetros seguintes são as posições e tamanho do desenho e o ultimo é a fonte da linha que imprimirá o código de barra,  acompanhe a Listagem 2.

 

Listagem 2. Função PrintEANCode

procedure PrintEANBarCode(strEANCode : String; objPicBox : PictureBox;

  const sngX1 : Single = -1; const sngY1 : Single = -1;

  const sngX2 : Single = -1; const sngY2 : Single = -1;

  const FontForText: Font = nil);

var

  I : Integer;

  sngPosX : Single;

  sngPosY : Single;

  sngScaleX : Single;

  strEANBin : String;

  strFormat : StringFormat;

  FontText : Font;

  sngXX1, sngYY1, sngXX2, sngYY2 : Single;

  BrushX : Brush;

begin

  StrFormat := StringFormat.Create;

  strEANBin := EANCodeBIN(strEANCode);

 

  If (FontForText = nil) Then

    FontText := Font.Create('Courier New', 10)

  else

    FontText := FontForText;

 

  If sngX1 = (-1) Then

    sngXX1 := 0

  else

    sngXX1 := sngX1;

 

  If sngY1 = (-1) Then

    sngYY1 := 0

  else

    sngYY1 := sngY1;

 

  If sngX2 = (-1) Then

    sngXX2 := objPicBox.Width

  else

    sngXX2 := sngX2;

 

  If sngY2 = (-1) Then

    sngYY2 := objPicBox.Height

  else

    sngYY2 := sngY2;

 

  sngPosX := sngXX1;

  sngPosY := sngYY2 - (1.5 * FontText.Height);

 

  BrushX := SolidBrush.Create(objPicBox.BackColor);

  objPicBox.CreateGraphics.FillRectangle(BrushX, sngXX1, sngYY1, sngXX2 - sngXX1, sngYY2 - sngYY1);

 

  sngScaleX := (sngXX2 - sngXX1) / strEANBin.Length;

 

  for I := 1 To Length(strEANBin) do

  begin

    If Copy(strEANBin, I, 1) = '1' Then

    begin

      BrushX := SolidBrush.Create(objPicBox.ForeColor);

      objPicBox.CreateGraphics.FillRectangle(BrushX, sngPosX, sngYY1, sngScaleX, sngPosY);

    end;

    sngPosX := sngXX1 + (I * sngScaleX);

 end;

 strFormat.Alignment := StringAlignment.Center;

 strFormat.FormatFlags := StringFormatFlags.NoWrap;

 BrushX := SolidBrush.Create(objPicBox.ForeColor);

 objPicBox.CreateGraphics.DrawString(strEANCode, FontText, BrushX, Convert.ToSingle((sngXX2 - sngXX1) / 2), Convert.ToSingle(sngYY2 - FontText.Height), strFormat);

 

end;

 

No evento Click do Button1 coloque o seguinte código para executar a Função de desenhar as barras do código de barra, Listagem 3.

 

Listagem 3. Executando a Função para Desenhar Barra

  PrintEANBarCode(TextBox1.Text, PictureBox1, 10, 10, PictureBox1.Width - 20, PictureBox1.Height - 20);

 

Não esqueça de colocar no uses SysUtils, agora basta você digitar um Código de Barra e clicar em desenhar que ele desenhará as barras no PictureBox veja a Figura 2 e Figura 3.

BarCode2.gif 

Figura 2. Código de Barra EAN 13

BarCode3.gif 

Figura 3. Código de Barra EAN 8

 

Abraços a Todos.