Arquivo

Arquivo do Autor

Firemonkey – Movimentando Objetos com FloatAnimation

Neste artigo aprenderemos a dar movimento a objetos, fazendo animação com o componente TFloatAnimation.

Neste artigo vamos usar o componente TFloatAnimation propondo a criação de um efeito de movimento em Firemonkey. Lembrando que, na maioria dos efeitos  de animação o componente TFloatAnimation é necessario, compreendendo as propriedades do mesmo somos capazes de fazer qualquer tipo de efeitos de animações.  Vou tentar mostrar um exemplo simples em tempo de design e ser bem objetivo. Então vamos nessa!

Crie o projeto “Firemonkey HD Application” e então, inclua os componentes TButton, e um TCircle e posicione os componentes conforme mostra figura abaixo.  Dentro do componente TCircle inclua dois componentes TFloatAnimation, e troque o nome do componente FloatAnimation1 para FloatAnimationx e, FloatAnimation2  para FloatAnimationy. Ainda dentro do TCircle, inclua um componente TImage e na propriedade Bitmap.Edit… inclua imagem de uma bola conforme a imagem abaixo.

Figura 1. Layout e componentes do projeto.

No curso de física que conhecemos, os objetos raramente se movem uniformemente, até mesmo pelas influencias das forças naturais. No caso de uma bola  temos também a gravidade que influencia em seu movimento e trajetória, por isso vamos trabalhar com coordenadas eixo-X e coordenadas eixo-Y. Precisamos  entender tambem “Interpolation”, Interpolation e uma propriedade do componente TFloatAnimation que indica qual o movimento o objeto vai fazer.

Figura 2. Eixo X e Y.

A propriedade Interpolation tem vários gêneros de efeitos que se movimentam.  Podemos citar como outras propriedades importantes o StartValue e StopValue,  onde o próprio nome já descreve sua serventia. Confiram abaixo a imagem das propriedades a serem alteradas do componente FloatAnimationX e FloatAnimationY.

Alterando as propriedades do componente FloatAnimationx:

  • Enable = False
  • Duration = 4
  • Interpolation = itLinear
  • PropertyName = Position.X
  • StartValue = 24
  • StopValue = 800

Alterando as propriedades do componente FloatAnimationy:

  • AutoReverse = True // Anima para trás após a animação para a frente.
  • Duration = 2           // Tempo em segundos\Velocidade
  • Enabled = False      // habilitar movimento
  • Interpolation = itQuadratic // Tipo de movimento
  • Inverse = True  // inverte coordenadas
  • Loop = True  // Repete a animação indefinidamente.
  • PropertyName = Position.Y  //Nome da propriedade para animar
  • StartValue = 24  //coordenadas para iniciar
  • StopValue = 424 //coordenadas para parar

Figura 3. Propriedades a serem alteradas.

Listagem 1. Agora só precisamos habilitar a animação no evento OnClick do Button1:

procedure TForm1.Button1Click(Sender: TObject);
begin
  FloatAnimationx.Enabled := True;
  FloatAnimationy.Enabled := True;
end;

Apenas execute o projeto, e verá o resultado desejado. Observe que depois de terminar o efeito do eixo-X, o efeito do eixo-Y continua a ser executado. Isso pelas  propriedades AutoReverse = True e a propriedade Loop = True. Depois de executar o projeto estude um pouco as propriedades, você pode trocar as propriedade  StopValue dos componentes FloatAnimation, troque também a propriedade Interpolation do componente FloatAnimationy para itElastic veja como comporta-se a  animação. Para maiores informações consulte documentação oficial da Embarcadero: http://docwiki.embarcadero.com/RADStudio/XE2/en/Using_FireMonkey_Animation_Effects

Espero que tenham gostado, segue o código fonte para facilitar o trabalho de vocês.

Muito obrigado. Fico por aqui, e espero por vocês na próxima! Grande abraço.

BloodTransitionEffect e ReflectionEffect – Firemonkey no Delphi

Neste artigo aprenderemos a usar dois componentes de efeitos que são: BloodTransitionEffect e o ReflectionEffect do Firemonkey.

Firemonkey é uma plataforma para desenvolvimento de aplicativos visualmente atraentes usando os recursos do processador gráfico. Usando essa plataforma, você pode desenvolver aplicativos para Mac OS X, Win32, Win64 e iOS. Além disso, é importante dizer que Firemonkey é não compatível com VCL (biblioteca componente Visual). Se você começar a desenvolver seu aplicativo com a VCL, você não poderá usar componentes de Firemonkey (FMX) e vice-versa.

No total existem mais de 50 efeitos visuais no Firemonkey que são divididos em várias categorias, como exemplo podemos citar: alteração de contraste, efeito de desfoque, desenvolver uma suave transição de uma imagem para outra, efeito de iluminação, efeito 3D, rotação,  entre outros. Hoje iremos trabalhar com 2 componentes do Firemonkey que são eles TReflectionEffect e o BloodTransitionEffect.

Crie o projeto “Firemonkey HD Application” e então, inclua o componente TText e um TReflectionEffect.

Alterando propriedades do TText:

Text digite Firemonkey

Font.Size 30

Font.Style.fsBold para True

Alterando eventos do TText:

Listagem 1. No evento MouseEnter digite o codigo abaixo:

procedure TForm1.Text1MouseEnter(Sender: TObject);
begin
  ReflectionEffect1.AnimateFloat('Length', 0.7, 0.5);
end;

Listagem 2. No evento MouseLeave digite o codigo abaixo:

procedure TForm1.Text1MouseLeave(Sender: TObject);
begin
  ReflectionEffect1.AnimateFloat('Length', 0.3, 0.5);
end;

Para continuarmos, execute o projeto e passe o cursor do mouse sobre o Text e veja o resultado.

Talvez alguns de vocês não tenham sucesso na execução, não tendo o resultado esperado. Confira então a observação abaixo, e então entenderá a razão disso acontecer.

Observação Importante:

Lembre-se, que cada componente Firemonkey é recipiente para outros componentes, você pode colocar um TImage dentro do componente TButton e irá tornar-se pai do componente TImage.

Observe na imagem abaixo a janela de Estrutura (Structure) o nó do Image1 (TImage) pertence ao nó pai que é o Button1(TButton), se clicarmos no botão que está no formulário e arrastarmos ele para outra posição, a imagem irá junto, isso ocorre porque agora o Image1 está  dentro do Button1.

Figura 1. Observação Importante

Então para que nosso projeto funcione corretamente, o componente ReflectionEffect1 (filho) deve estar dentro do componente Text1 (pai), conforme a imagem da estrutura(Structure) mostra-nos abaixo:

Figura 2.Estrutura coreta

Agora, vamos ver como funciona um efeito de transição de imagens com componente BloodTransitionEffect, para isso adicione um componente Timage primeiramente, e vamos configurar as propriedades do mesmo.

Alterando propriedades do TImage:

Bitmap.edit escolha uma imagem qualquer

Bitmap Create New TBitmapAnimation com esta opção executada é criado um componente BitmapAnimation1.

Alterando propriedades do BitmapAnimation1.

StartValue.edit Escolha uma imagem qualquer.

StopValue.edit Escolha uma imagem qualquer.

Trigger IsMouseOver=true

Trigger Inverse IsMouseOver=true

Observe as propriedades do BitmapAnimation1 na imagem abaixo:

Figura 3. Propriedades BitmapAnimation1

Se executarmos o projeto com todo o procedimento que aprendemos, ao passar o mouse sobre a imagem já conseguiremos ter um efeito de transição de imagem. Caso queira algo mais aperfeiçoado, podemos fazer uma animação nessa transição, tudo o que temos que fazer é incluir o componente  BloodTransitionEffect no formulário, lembrando que o BloodTransitionEffect (filho) deve estar dentro do componente Timage(Pai) conforme o modelo abaixo:

Figura 4. Estrutura final do Projeto.

Temos só que implementar dois eventos do componente Timage.

Alterando eventos do TImage.

Listagem 3. No evento MouseEnter digite o código abaixo:

procedure TForm1.Image1MouseEnter(Sender: TObject);
begin
if BloodTransitionEffect1.Enabled = False then
BloodTransitionEffect1.Enabled := True;
BloodTransitionEffect1.AnimateFloat(‘Progress’, 100, 0.8);
end;

Listagem 4. No evento MouseLeave digite o código abaixo:

procedure TForm1.Image1MouseLeave(Sender: TObject);
begin
BloodTransitionEffect1.AnimateFloat(‘Progress’, 0, 0.8);
end;

E com sucesso, teremos um projeto como mostra a imagem abaixo:

Figura 4. Resultado Final.

Temos vários outros efeitos na paleta Effects além do BloodTransitionEffect, e que em breve, possamos usá-los através de mais artigos que pretendo postar.

Espero que tenham gostado afinal o efeito é muito bonito e não tão complexo de realizar.

Abraços. Fico por aqui, e até a próxima!

Como fazer o sistema falar

Veja neste artigo como fazer o sistema falar, através da importação de um Activex, podemos importar esta funcionalidade para dentro do Delphi
Já assisti muitos filmes sobre os hackers. Geralmente um homem jovem senta-se na frente de seu computador e fala com seus sistemas, dá comandos de voz e o computador como um servo estudioso, trabalha sem encostar no teclado. Apesar do fato da capacidade e  reconhecimento de fala está constantemente evoluindo e melhorando. Evidentemente, que neste momento, é muito difícil estabelecer um sistema de controle de computador, que seria reconhecido por milhares de comandos e executar esses comandos. Mas, temos o Speech API, um  conjunto de interfaces de Fala e Reconhecimento de Voz: Mais neste artigo usando SAPI vamos ensinar seu computador falar.

Microsoft Speech API (SAPI) tem um voz feminina e conhecida como Anna e fala a língua inglesa.

O primeiro passo para usar SAPI devemos importado o Activex para o Delphi. Então abra a IDE do Delphi, selecione menu principal, “Component Import Component” na janela seguinte escolha a opção “Import Type Library“, conforme imagem a  baixo e clique em “Avançar”:

Figura 1. Type of Component.

Agora encontrar o “Microsoft Speech Object Library”, selecioná-lo, clique em “Avançar”

Figura 2. Registered Type Libraries.

Na nova janela, selecione a opção “Generate Component Wrappers” e clique em “Concluir”:

Uma Unit chamada SpeechLib_TLB.pas será criada e salva por default no caminho que esta no campo Unit Dir Name: no código fonte esta disponível o arquivo SpeechLib_TLB.pas.

Figura 3. Component.

Agora estamos pronto para trabalhar com SAPI 5.4.

Crie um novo projeto VCL inclua um componente TEdit e um componente TButton como segue figura abaixo e vamos fazer a Anna ler nossas mensagens.

Figura 4. Layout do Formulário.

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

procedure TForm1.Button1Click(Sender: TObject);
var gpIVTxt: ISpVoice;
 Pool: LongWord;
begin
  gpIVTxt:=CoSpVoice.Create as ISpVoice;
  gpIVTxt.Speak(PChar(Edit1.Text),SVSFDefault,Pool);
end;

Agora você pode executar este programa, escreva no campo Edit1 “I LOVE DELPHI” ou qualquer outra frase em inglês, pressione o botão ouça a Anna falar.

Figura5. Programa em execução.

Existe outra forma de fazer a Anna ler, arquivos TXT, vamos incluir mais 2 componentes em nosso projeto mais um TButton e um TOpenDialog, como segue a imagem abaixo:

Figura 6. Layout do Formulário.

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

procedure TForm1.Button2Click(Sender: TObject);
var  gpIVTxt: ISpVoice;
  Pool: LongWord;
begin
  if OpenDialog1.Execute then
   Edit1.Text := OpenDialog1.FileName;
  gpIVTxt := CoSpVoice.Create as ISpVoice;
 gpIVTxt.Speak(PChar(Edit1.Text), SVSFIsFilename, Pool);
end;

Agora crie um arquivo que contém um texto em inglês e tenha em conta todos os sinais de pontuação. Clique no botão Arquivo TXT e ouça a voz de Anna lendo todo o arquivo.

Este é um simples exemplo, pesquise sobre Microsoft Speech API que vai encontrar outros idiomas e outros Agent “vozes” além de Anna.

Código Fonte

Um grande abraço a todos e paz no coração!

Categorias:Artigos, Delphi Tags:, ,

Criar Formulários AERO

Veja neste artigo como criar formulários AERO. Como utilizar este efeito bem interessante implementado desde o Windows Vista.

Hoje iremos aprender a criar formulários, com efeito, vidro.

Para que o estilo AERO tenha o efeito vidro é necessário que tenha como sistema operacional Windows Vista, Windows 7 ou Superior.

O tema AERO terá que estar ativo em seu Windows, caso contrário o efeito de vidro é ignorado e impossível de ser realizado.

Bem… É muito simples, fácil e rápido realizar o efeito. Para que este seja realizado, temos que alterar somente três propriedades do Form, dando-nos um resultado criativo e bacana.

Para começar, abra um novo projeto VCL, e altere as propriedades que seguem abaixo:

Propriedades a serem alteradas:

DoubleBuffered = True

Veja a figura abaixo da propriedade DoubleBuffered alterada:

Figura 1. DoubleBuffered alterada para True.

Alterando as 2 ultimas propriedades a serem alteradas que são:

GlassFrame.Enabled = True

SheetOfGlass = True

segue figura abaixo da propriedade GlassFrame.Enabled e SheetOfGlass alterada:

 

Figura 2. GlassFrame.Enabled e  SheetOfGlass alterada para True.

Agora apenas execute-o, e o resultado será esse:

Resultado

Figura 3. Resultado.

Quando a propriedade SheetOfGlass alterado para True todo o formulário passa a ter o efeito vidro, mais também é possível fazer o efeito somente em uma área do formulário.

Passe a propriedade SheetOfGlass para False a propriedade, Left para 125 e a propriedade Rigth para 25 como segue a figura abaixo:

Figura 4. SheetOfGlass alterada para False, Left 125 e Right 25.

Para finalizar, apenas execute-o, e o resultado será esse:

Figura 4. Resultado Final.

Esta foi uma dica que com 3 cliques do mouse temos um efeito bacana.

Espero que o artigo tenha sido útil, e que acima de tudo tenham gostado.

Um abraço, e espero vocês na próxima.

 

 

 


Categorias:Artigos, Delphi Tags:, ,

Delphi Meeting 2012

Categorias:Noticícas

Desenvolvendo para iOS com FireMonkey e Delphi XE2

Categorias:FireMonkey Tags:, ,

Inicializar seu programa com o Windows

Como fazer seus programas serem executados na inicialização do Windows

É fácil o suficiente arrastar e soltar seu aplicativo ao grupo de inicialização do Windows para executá-lo na inicialização do Windows. Mas, se você quiser fazer isso no seu programa, no final do seu programa de instalação por exemplo, ou se você quisesse fazer seu programa execute apenas uma vez a próxima vez que o Windows iniciar, função a seguir poderia vir a calhar:

procedure RunOnStartup(sProgTitle, sCmdLine: string; bRunOnce: boolean);
var
 sKey: string;
 reg : TRegIniFile;
begin
if bRunOnce then
 sKey := 'Once'
else
 sKey := '';
 reg := TRegIniFile.Create('');
 reg.RootKey := HKEY_LOCAL_MACHINE;
 reg.WriteString('Software\Microsoft\Windows\CurrentVersion\Run' + sKey + #0, sProgTitle, sCmdLine);
 reg.Free;
end;

Utilização:

sProgTitle Titulo do programa. De um modo geral, esta poderia ser qualquer coisa que você quer.

sCmdLine Este é o nome do caminho completo onde o programa executável se encontra.

bRunOnce  Defina este como verdadeiro se você deseja executar o programa apenas uma vez.

Se este parâmetro estiver False, o programa especificado será executado sempre que Windows iniciar.

Exemplo:

RunOnStartup(‘Titulo do Progama’, ‘MeuProg.exe’, False);

Considerações importante

incluir Registry no uses

Se ao executar seu teste aparecer o seguinte erro

Figura 1.Mensagem de erro

Você que utiliza o Windows 7 como sistema operacional do seu computador, já deve ter passado por várias situações onde é obrigatório o uso do usuário “Administrador” para executar ou instalar determinado programa, e não é por menos, quem utiliza uma conta “normal”, usuário comum, ou ainda um “Usuário convidado” não tem privilégios para executar determinadas funções do sistema, isto (em partes) acaba sendo muito legal, já que dá maior segurança ao seu sistema, por outro lado, acaba sendo muito chato, já que na maneira convencional, temos que clicar com o botão direito do mouse  sobre o arquivo ou programa que desejamos executar como “Administrador” e selecionar  a opção “Executar como administrador”, como na imagem abaixo:

Figura 2.Menu ao clicar com o botão direito

clique com o botão direito do mouse sobre seu programa e escolha a opcao Executar como Administrador.

Caso queira habilitar sua conta de administrador no Windows 7 execute o cmd como administrador Digite “net user administrator /active:yes”, sem aspas, dentro do prompt de comando e depois tecle “enter”

Figura 3.Command prompt

Pronto, agora você pode notar que a conta vai aparecer na tela de logon.

Figura 4.Logon do Windows 7

Já estou fugindo do escopo principal, paro por aqui.

Um abraço e até a próxima.

Categorias:Artigos Tags:, ,

Transformar Ponteiro do mouse em ProgressBar

Veja neste artigo como transformar o ponteiro do mouse em um ProgressBar.

Veja neste artigo um exemplo de como transformar o ponteiro do mouse em um progressbar, quase sempre precisamos de um progressbar para informar o  usuário o percentual do processamento executado .

Com esse exemplo vamos informar o usuário com o ponteiro do mouse, então vamos nessa, crie um novo projeto Delphi Vcl e adicione um TButton, veja Layout abaixo.

Figura 1. Layout do Formulário

Vamos precisar de 3 funções create_prc_cursor, int_percent e create_curspace só que vou criar de uma maneira diferente uma dentro da outra, somente para mostras de uma outra maneira,  claro que você pode fazer do jeito tradicional escopo private ou public declara a função pressione CTRL+SHIFT+C .

Listagem 1

: Assim fica 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;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function create_prc_cursor(min, max, pos: integer): hicon;
var
  cwidth, cheight: integer;
  ii: iconinfo;
  bmc, bmm: tbitmap;
  icon: hicon;
  tw: integer;
  tx: string;

  function int_percent(umin, umax, upos, uabs: integer): integer;
  begin
    result := 0;
    if umax < umin then
      exit;
    if upos < umin then
      exit;
    if upos > umax then
    begin
      result := 100;
      exit;
    end;
    if (umin = upos) and (umax = upos) then
    begin
      result := 100;
      exit;
    end;
    result := round((upos - umin) / ((umax - umin) / uabs));
  end;

  function create_curspace: tbitmap;
  begin
    result := tbitmap.create;
    result.pixelformat := pf4bit;
    result.width := cwidth;
    result.height := cheight;
  end;

begin
  cwidth := getsystemmetrics(sm_cxcursor);
  cheight := getsystemmetrics(sm_cycursor);
  bmc := create_curspace;
  bmm := create_curspace;
  with bmm.Canvas do
  begin
    brush.color := clwhite;
    FillRect(rect(0, 0, bmm.width, bmm.height));
    brush.color := clblack;
    FillRect(rect(0, bmm.height - 8, bmm.width, bmm.height));
    brush.color := clwhite;
    framerect(rect(0, bmm.height - 8, bmm.width, bmm.height));
  end;
  with bmc.Canvas do
  begin
    brush.color := clblack;
    FillRect(rect(0, 0, bmc.width, bmc.height));
    brush.color := clwhite;
    FillRect(rect(1 + int_percent(min, max, pos, bmc.width - 2), bmm.height - 7,
      bmc.width - 1, bmc.height - 1));
    brush.color := clwhite;
    framerect(rect(0, bmc.height - 8, bmc.width, bmc.height));
  end;
  tx := inttostr(int_percent(min, max, pos, 100)) + '%';
  with bmm.Canvas do
  begin
    font.Size := 8;
    font.style := [fsbold];
    font.color := clwhite;
    brush.color := clwhite;
    tw := textwidth(tx);
    textout((cwidth - tw) div 2, 8, tx);
  end;
  with bmc.Canvas do
  begin
    font.Size := 8;
    font.style := [fsbold];
    font.color := clwhite;
    brush.color := clblack;
    textout((cwidth - tw) div 2, 8, tx);
  end;

  ii.fIcon := false;
  ii.hbmColor := bmc.Handle;
  ii.hbmMask := bmm.Handle;
  ii.xHotspot := 0;
  ii.yHotspot := 0;
  icon := createiconindirect(ii);
  result := copyicon(icon);
  destroyicon(icon);
  bmc.free;
  bmm.free;
end;
end.

Agora vamos implementar o Button1.

Listagem 2:

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

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin

  for i := 0 to 100 do
  begin
    Screen.Cursors[1] := create_prc_cursor(0, 100, i); // min, max, Atual
    Screen.Cursor := crNone;
    Screen.Cursor := 1;
    Sleep(100);
  end;

  // Voltar ponteiro Default
  Screen.Cursor := crDefault;
end;

Considerações finais:
Este exemplo pode ser usado quando precisamos percorrer um banco de dados ou quando um processamento demorado, download, upload etc.., assim o usuário fica informado quanto ao tempo.
Código Fonte clique aqui!

Um grande abraço a todos!

Categorias:Artigos

QrCode código de barras bi-dimensional

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 mude para L – [padrão] Permite a recuperação de até 7% de perda de dados

M – Permite a recuperação de até 15% de perda de dados

Q – Permite a recuperação de até 25% de perda de dados

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 .

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.

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;

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:

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 vidêos 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!

Código Fonte clique aqui

Categorias:Artigos Tags:,

Guia de endereço GoogleMaps – Delphi

Neste Artigo vamos criar um exemplo simples de busca de endereço com o Google Maps onde digitaremos o endereço, cidade, estado e fazer a busca, onde será mostrado o mapa da busca solicitada.

Neste Artigo vamos criar um exemplo simples de busca de endereço com o Google Maps onde digitaremos o endereço, cidade, estado e fazer a busca, onde será mostrado o mapa da busca solicitada.

Iniciaremos agora criando um novo projeto em Delphi e iremos adicionar um TPanel, TLabel, TMemo, TButton e um TWebBrowser, abaixo temos o layout bem simples do formulário.

Figura 1. Layout do Formulário

Agora vamos mudar algumas propriedades dos componentes:

Form1 WindowState mude para wsMaximized

Panel1 Align mude para alTop

WebBrowser1 Align mude para alClient

Label1 Caption mude para Endereço

Button1 Caption mude para Localizar Endereço

Memo1 ScrollBars mude para ssBoth

Memo1 Lines mude para Av. Paulista, São Paulo, SP

Observação: para fazer a busca de endereço pelo Google Maps o padrão é: endereço, cidade, estado; e sempre teremos que separar por vírgula.

Agora vamos implementar nosso código:

1. Inclua as classes MSHTML e ActiveX no uses e crie uma variável private:

HTMLWindow2: IHTMLWindow2 ; .

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.OleCtrls, SHDocVw, Vcl.StdCtrls,
  Vcl.ExtCtrls, MSHTML , ActiveX;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Memo1: TMemo;
    Button1: TButton;
    WebBrowser1: TWebBrowser;
  private
    { Private declarations }

    HTMLWindow2: IHTMLWindow2;

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.

2. Agora vamos criar uma constante HTMLStr com o script da GoogleMaps, logo abaixo do Implementation, deixando o código desta maneira:

unit Unit1;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, SHDocVw, Vcl.StdCtrls,
  Vcl.ExtCtrls, MSHTML,  ActiveX;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Memo1: TMemo;
    Button1: TButton;
    WebBrowser1: TWebBrowser;
  private
    { Private declarations }
    HTMLWindow2: IHTMLWindow2;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}

const
  HTMLStr: AnsiString = '<html> ' + '<head> ' +
    '<meta name="viewport" content="initial-scale=1.0, user-scalable=yes" /> ' +
    '<script type="text/javascript" src=
     "http://maps.google.com/maps/api/js?sensor=true"></script> '
    + '<script type="text/javascript"> ' + '' + '' + '  var geocoder; ' +
    '  var map;  ' + '  var trafficLayer;' + '  var bikeLayer;' +
    '  var markersArray = [];' + '' + '' + '  function initialize() { ' +
    '    geocoder = new google.maps.Geocoder();' +
    '    var latlng = new google.maps.LatLng(-23.563596,-46.653883); ' +
    '    var myOptions = { ' + '      zoom: 13, ' + '      center: latlng, ' +
    '      mapTypeId: google.maps.MapTypeId.ROADMAP ' + '    }; ' +
    '    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); '
    + '    trafficLayer = new google.maps.TrafficLayer();' +
    '    bikeLayer = new google.maps.BicyclingLayer();' +
    '    map.set("streetViewControl", false);' + '  } ' + '' + '' +
    '  function codeAddress(address) { ' + '    if (geocoder) {' +
    '      geocoder.geocode( { address: address}, function(results, status) { '
    + '        if (status == google.maps.GeocoderStatus.OK) {' +
    '          map.setCenter(results[0].geometry.location);' +
    '          PutMarker(results[0].geometry.location.lat(), results[0].geometry.location.lng(),
 results[0].geometry.location.lat()+","+results[0].geometry.location.lng());'
    + '        } else {' +
    '          alert("Geocode was not successful for the following reason: " + status);'
    + '        }' + '      });' + '    }' + '  }' + '' + '' +
    '  function GotoLatLng(Lat, Lang) { ' +
    '   var latlng = new google.maps.LatLng(Lat,Lang);' +
    '   map.setCenter(latlng);' + '   PutMarker(Lat, Lang, Lat+","+Lang);' +
    '  }' + '' + '' + 'function ClearMarkers() {  ' +
    '  if (markersArray) {        ' + '    for (i in markersArray) {  ' +
    '      markersArray[i].setMap(null); ' + '    } ' + '  } ' + '}  ' + '' +
    '  function PutMarker(Lat, Lang, Msg) { ' +
    '   var latlng = new google.maps.LatLng(Lat,Lang);' +
    '   var marker = new google.maps.Marker({' + '      position: latlng, ' +
    '      map: map,' + '      title: Msg+" ("+Lat+","+Lang+")"' + '  });' +
    ' markersArray.push(marker); ' + '  }' + '' + '' +
    '  function TrafficOn()   { trafficLayer.setMap(map); }' + '' +
    '  function TrafficOff()  { trafficLayer.setMap(null); }' + '' + '' +
    '  function BicyclingOn() { bikeLayer.setMap(map); }' + '' +
    '  function BicyclingOff(){ bikeLayer.setMap(null);}' + '' +
    '  function StreetViewOn() { map.set("streetViewControl", true); }' + '' +
    '  function StreetViewOff() { map.set("streetViewControl", false); }' + '' +
    '' + '</script> ' + '</head> ' + '<body onload="initialize()"> ' +
    '  <div id="map_canvas" style="width:100%; height:100%"></div> ' +
    '</body> ' + '</html> ';

end.

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

procedure TForm1.FormCreate(Sender: TObject);
var
  aStream: TMemoryStream;
begin
  WebBrowser1.Navigate('about:blank');
  if Assigned(WebBrowser1.Document) then
  begin
    aStream := TMemoryStream.Create;
    try
      aStream.WriteBuffer(Pointer(HTMLStr)^, Length(HTMLStr));
      aStream.Seek(0, soFromBeginning);
      (WebBrowser1.Document as IPersistStreamInit)
        .Load(TStreamAdapter.Create(aStream));
    finally
      aStream.Free;
    end;
    HTMLWindow2 := (WebBrowser1.Document as IHTMLDocument2).parentWindow;
  end;
end;

4. No Evento OnClick do Button1 implemente o código abaixo

procedure TForm1.Button1Click(Sender: TObject);
var
  address: string;
begin
  address := Memo1.Lines.Text;
  address := StringReplace(StringReplace(Trim(address), #13, ' ', [rfReplaceAll]
    ), #10, ' ', [rfReplaceAll]);
  HTMLWindow2.execScript(Format('codeAddress(%s)', [QuotedStr(address)]),
    'JavaScript');
end;

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

Figura 2. Executando o projeto

5. Agora vamos disponibilizar 3 funções criada no script do GoogleMaps para isso insira 3 TCheckBox como mostra a figura abaixo:

Figura 3. Incluindo 3 TCheckBox

Alterando propriedades dos componentes TCheckBox:

CheckBox1 Caption mude para Tráfego

CheckBox2 Caption mude para Ciclovia

CheckBox3 Caption mude para Street View

6. No Evento OnClick do CheckBox1 implemente o código abaixo:

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  if CheckBox1.Checked then
    HTMLWindow2.execScript('TrafficOn()', 'JavaScript')
  else
    HTMLWindow2.execScript('TrafficOff()', 'JavaScript');
end;

7. No Evento OnClick do CheckBox2 implemente o código abaixo:

procedure TForm1.CheckBox2Click(Sender: TObject);
begin
  if CheckBox2.Checked then
    HTMLWindow2.execScript('BicyclingOn()', 'JavaScript')
  else
    HTMLWindow2.execScript('BicyclingOff()', 'JavaScript');
end;

8. No Evento OnClick do CheckBox3 implemente o código abaixo:

procedure TForm1.CheckBox3Click(Sender: TObject);
begin
  if CheckBox3.Checked then
    HTMLWindow2.execScript('StreetViewOn()', 'JavaScript')
  else
    HTMLWindow2.execScript('StreetViewOff()', 'JavaScript');
end;

Figura 4. Imagem Final do Projeto

Considerações finais:

Lembrando que a pesquisa tem que ter o padrão endereço, cidade, estado e que sempre teremos que separá-la por vírgula, o número do endereço é opcional.

Exemplo: Av. Paulista 1000, São Paulo – SP

O mapa tem todas as funcionalidades como: +Zoom; -Zoom; duplo clique no mapa, entre outros.

Quando o projeto é executado esta vindo por default o mapa da cidade de São Paulo na Av. Paulista, claro que isso pode ser alterado de várias maneiras em tempo de execução alterando o método LatLng(-23.563596,-46.653883); Longitude e a Latitude no script criado.

Segue a linha a ser alterada no script :

var latlng = new google.maps.LatLng(-23.563596,-46.653883);

Conclusão

Em um sistema comercial que faz entrega seria interessante ter uma busca online de endereços, claro que um exemplo simples, porém espero que tenham gostado .

arquivos fonte clique aqui

Um grande abraço a todos!

Categorias:Artigos, Blogs e Sites
%d blogueiros gostam disto: