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.
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:
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.htmlVamos 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=zn4mIKMH7S4Veja onde usam o QRCode.
http://www.qrstuff.com/qr_code_examples.htmlQrcode em camisetas.
http://www.messa.com.br/eric/ecode/uploaded_images/qr_tshirt01-715400.jpgEspero que tenham gostado
Um grande abraço a todos!