Olá! Sábado, 04 de Julho de 2009.


Dicas CódigoFonte.net
Domingo, 23 de Julho de 2006

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.

Clique para ver a imagem em seu tamanho real
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.

Clique para ver a imagem em seu tamanho real
Figura 2. Código de Barra EAN 13

Clique para ver a imagem em seu tamanho real
Figura 3. Código de Barra EAN 8

Abraços a Todos.


Conheça nosso parceiro:




Comentários do artigo [Novo comentário]

carlos escudeiro - 11 de Outubro de 2008 - 17:46
Só faltou o codigo do botão desenhar
Edilson Alves de Oliveira - 18 de Novembro de 2008 - 17:23
onde encontro esse tal de pictueBox no delphi?
Para adicionar um comentário você deve efetuar o login


Gostou do CódigoFonte.net? Quer indicar a um amigo?
Preencha os campos a seguir.
Seu Nome:
Seu E-mail:
E-mail de seu Amigo:



Melhor Visualizado com
800x600 de Resolução

CodigoFonte.net » CodigoFonte.eti.br » Compre De Tudo » Meu Mural » PelamorDeDeus » Todos os Direitos Reservados © 2002/2008

Procurando Notebooks, Câmeras Digitais, iPhones?

CompreDeTudo.com