Neste artigo iremos aprender como criar código de barras 2d QRCode

O QR Code é uma tecnologia que poucas pessoas no Brasil conhecem, é um código de barras 2D que está sendo cada vez mais utilizado em anúncios publicitários, videoclipes e uma série de outras situações.

Ficou curioso para saber como funciona? Então confira este artigo.

Trata-se de um código de barras 2D capaz de armazenar até 4.296 caracteres alfanuméricos de texto.

Códigos QR pode ser lido por um dispositivo que vão desde leitores de código QR e para qualquer celular que permite ao usuário apontar a câmera para uma figura.

O mais legal é que você mesmo pode criar um QR Code !

Então vamos nessa, crie um novo projeto Delphi VCL e iremos adicionar um TImage, TMemo, TButton, 2 TMaskEdit, TComboBox e 3 TLabel, , abaixo temos o layout do formulário.

Layout do Formulário

Figura 1. Layout do Formulário.

Mudando as propriedades dos componentes no projeto.

  • Image1: Height e Width mude para 321
  • Memo1: Lines mude para digite aqui sua mensagem
  • EditMask1: EditMask mude para !999;1;
  • EditMask2: EditMask mude para !999;1;
  • EditMask1: Text mude para 300
  • EditMask2: Text mude para 300
  • ComboBox1: Text mude para L - [padrão] Permite a recuperação de até 7% de perda de dados
  • ComboBox1: Items Adicione - L - [padrão] Permite a recuperação de até 7% de perda de dados
  • ComboBox1: Items Adicione - M - Permite a recuperação de até 15% de perda de dados
  • ComboBox1: Items Adicione - Q - Permite a recuperação de até 25% de perda de dados
  • ComboBox1: Items Adicione - H - Permite a recuperação de até 30% a perda de dados
  • ComboBox1: Style mude para csDropDownList
  • ComboBox1: ItemIndex mude para 0
  • Button1: Caption mude para Gerar Etiqueta

Codificando o projeto, incluir 3 classes no uses PngImage, HTTPApp, WinInet, procedure WinInet_HttpGet, procedure GetQrCode, constante UrlGoogleQrCode e uma variável enumerada na sessão Type com o nome TQrImage_ErrCorrLevel.

Observação: variável enumerada é um tipo de variável pré-definida criada na sessão Type Exemplo:


Type
TDiaSemana =  (segunda, terça-feira, domingo);

Assim que definir um tipo de dados enumerado, podemos declarar variáveis ​​para ser desse tipo:

var algumdia: TDiaSemana; 

O objetivo principal de um tipo de dados enumerado é deixar claro quais dados o programa irá manipular. Um tipo enumerado é realmente apenas uma maneira abreviada de atribuição de valores seqüenciais a constantes. Dadas estas declarações, terça-feira é uma constante do tipo TDiaSemana .

Listagem 1.Ficando assim nosso código até o momento!


unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Mask, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Memo1: TMemo;
    Button1: TButton;
    MaskEdit1: TMaskEdit;
    MaskEdit2: TMaskEdit;
    ComboBox1: TComboBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  PngImage,
  HTTPApp,
  WinInet;

{$R *.dfm}

type
  TQrImage_ErrCorrLevel = (L, M, Q, H);

const
  UrlGoogleQrCode =
    'http://chart.apis.google.com/chart?chs=%dx%d&cht=qr&chld=%s&chl=%s';
  QrImgCorrStr: array [TQrImage_ErrCorrLevel] of string = ('L', 'M', 'Q', 'H');

procedure WinInet_HttpGet(const Url: string; Stream: TStream);
const
  BuffSize = 1024 * 1024;
var
  hInter: HINTERNET;
  UrlHandle: HINTERNET;
  BytesRead: DWORD;
  Buffer: Pointer;
begin
  hInter := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(hInter) then
  begin
    Stream.Seek(0, 0);
    GetMem(Buffer, BuffSize);
    try
      UrlHandle := InternetOpenUrl(hInter, PChar(Url), nil, 0,
        INTERNET_FLAG_RELOAD, 0);
      if Assigned(UrlHandle) then
      begin
        repeat
          InternetReadFile(UrlHandle, Buffer, BuffSize, BytesRead);
          if BytesRead > 0 then
            Stream.WriteBuffer(Buffer^, BytesRead);
        until BytesRead = 0;
        InternetCloseHandle(UrlHandle);
      end;
    finally
      FreeMem(Buffer);
    end;
    InternetCloseHandle(hInter);
  end
end;

procedure GetQrCode(Width, Height: Word;
  Correction_Level: TQrImage_ErrCorrLevel; const Data: string;
  StreamImage: TMemoryStream);
Var
  EncodedURL: string;
begin
  EncodedURL := Format(UrlGoogleQrCode,
    [Width, Height, QrImgCorrStr[Correction_Level], HTTPEncode(Data)]);
  WinInet_HttpGet(EncodedURL, StreamImage);
end;

end.

Listagem 2. No Evento OnClick do Button1 implemente o código abaixo:


procedure TForm1.Button1Click(Sender: TObject);
var
  ImageStream: TMemoryStream;
  PngImage: TPngImage;
begin
  Image1.Picture := nil;
  ImageStream := TMemoryStream.Create;
  PngImage := TPngImage.Create;
  try
    try
      GetQrCode(StrToInt(Trim(MaskEdit1.Text)), StrToInt(Trim(MaskEdit2.Text)),
        TQrImage_ErrCorrLevel(ComboBox1.ItemIndex), Memo1.Lines.Text,
        ImageStream);
      if ImageStream.Size > 0 then
      begin
        ImageStream.Position := 0;
        PngImage.LoadFromStream(ImageStream);
        Image1.Picture.Assign(PngImage);
      end;
    except
      on E: exception do
        ShowMessage(E.Message);
    end;
  finally
    ImageStream.Free;
    PngImage.Free;
  end;

Listagem 3. No Evento OnCreate do Form1 implemente o código abaixo:


  Button1Click(Sender);

Neste momento se você executar o projeto vai ter o seguinte resultado:

Exemplo Completo

Figura 2. Exemplo Completo

Considerações finais:

Podendo criar uma rotina para impressão da etiqueta.

Para decifrar o códigos é necessário de um aplicativo instalado em seu celular segue o site do aplicativo:

http://i-nigma.com/i-nigmahp.html

Vamos ver imagens e vídeos como são usados o QRCode.

Programa de TV francês: caça ao tesouro com QR Code .

http://www.youtube.com/watch?v=zn4mIKMH7S4

Veja onde usam o QRCode.

http://www.qrstuff.com/qr_code_examples.html

Qrcode em camisetas.

http://www.messa.com.br/eric/ecode/uploaded_images/qr_tshirt01-715400.jpg

Espero que tenham gostado

Um grande abraço a todos!