Leitura de Código de Barras em Android com Delphi XE5

Nesta postagem vamos adicionar a uma aplicação Android desenvolvida com Delphi XE5 a funcionalidade da leitura de código de barras.

Fonte

Não resta dúvidas que a leitura de código de barras  significa um grande avanço em otimização de tempo em diversos processos no cotidiano de empresas e pessoas. Já imaginou a fila de um caixa de supermercado sem a utilização de código de barras?  Nosso tutorial de hoje se baseia na postagem The Inelegant Way to Scan Barcodes on Android with Delphi XE5 (A maneira deselegante para ler códigos de barras em Android com Delphi XE5). Fiz questão de começar a postagem citando a fonte por que esta postagem veio a solucionar de maneira simples um problema que me deparei em dezembro de 2013. Vamos começar?!

Preparando a casa

Na verdade a postagem chama de deselegante o fato de utilizar outro aplicativo para fazer a leitura do código de barras propriamente dito. Essa leitura é feita através do apk Barcode Scanner do ZXing Team disponibilizado para o Android na Google Play. Baixe e instale o aplicativo no dispositivo Android a ser utilizado.

ZXing

Agora seu dispositivo Android já está equipado com “tudo” que você precisa para ler código de barras. Mas como faremos para que nossa aplicação aproveite essa funcionalidade??? A resposta é simples: Intents! Já publiquei aqui no blog uma postagem sobre Intents e como elas funcionam fazendo a comunicação entre aplicações Android, se você ainda não leu acredito que valha a pena ler: INTENTS COM DELPHI XE5 COMUNICANDO APPS ATRAVÉS DO ANDROID.

 Simplificar… criando a interface da Aplicação

Abra o Delphi XE5 e inicie um novo projeto Mobile em Branco. Nele vamos inserir 1 Button, 1Label e 1 Image. Estes componentes terão suas propriedades alteradas conforme especificado abaixo:

  • Button1
    • Align -> alBottom
    • Text -> Iniciar Leitura
  • Label1
    • Align -> alBottom
    • Text -> “”
    • TextAlign -> taCenter
  • Image1
    • Align -> alClient

Ainda com o Image1 selecionado, vá até sua propriedade MultResBitmap e clique sobre o botão reticências para incluir uma imagem de sua preferência.

Propriedade MultiResBitmap do TImage

Em seguida, por ser uma propriedade composta, será exibida uma janela para sua edição. Nela vamos selecionar a opção Open (seta 1) para abrir uma imagem de nossa preferência e depois em Clear design time (seta 2) para confirmar e fechar a janela de edição (vide imagem abaixo).

Inserindo Imgem no TImage

 

Com isso finalizamos a interface da aplicação. Segue abaixo uma imagem a ser utilizada como referência:

Preview da Interface da Apicação

Hora do Show Delphi: vamos ao código

Uma vez criada a interface da aplicação, vamos inserir o código para efetuar a leitura dos códigos de barras. A ideia é simples: ao clicar no botão o usuário irá abrir o Leitor e poderá bipar um código de barras qualquer. No nosso caso o código de barras lido será retornado no Label1 posicionado logo acima do botão. Vamos lá!

 Na cláusula uses da seção Interface vamos acrescentar as seguintes Units/Namespaces:

uses
...
FMX.Dialogs,FMX.platform, fmx.helpers.android, androidapi.JNI.GraphicsContentViewText,
androidapi.jni.JavaTypes,FMX.Objects,
FMX.StdCtrls;

 Na seção Private do Formulário vamos inserir:

  private
    { Private declarations }
    ClipService: IFMXClipboardService;
    Elapsed: integer;

E na cláusula uses da seção Implementation adicionaremos:

implementation

{$R *.fmx}
uses Androidapi.NativeActivity;

Vamos inserir em nosso projeto 1 Timer.

No evento OnClick do Button1 vamos inserir uma variável do tipo JIntent para fazermos uso da Intent do ZXing. Logo seu código ficará como abaixo:

procedure TForm1.Button1Click(Sender: TObject);
var
 Intent : JIntent;
begin
 if assigned(ClipService) then
 begin
 clipservice.SetClipboard('nil');
 intent := tjintent.Create;
 intent.setAction(stringtojstring('com.google.zxing.client.android.SCAN'));
 SharedActivity.startActivityForResult(intent,0);
 Elapsed := 0;
 Timer1.Enabled := True;
 end;
end;

No evento OnActivate do Formulário codificaremos como abaixo:

procedure TForm1.FormActivate(Sender: TObject);
begin
 Label1.Text.Empty;
 ClipService.SetClipboard('nil');

end;

No evento OnCreate do Formulário vamos inserir o código:

procedure TForm1.FormCreate(Sender: TObject);
begin
  if not TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, IInterface(ClipService)) then
    ClipService := nil;

  Elapsed := 0;
end;

No evento OnTimer do Timer1 vamos inserir o código:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if (ClipService.GetClipboard.ToString <> 'nil') then
  begin
    timer1.Enabled := false;
    Elapsed := 0;
    Label1.Text := ClipService.GetClipboard.ToString;
  end
  else
    begin
      if Elapsed > 9 then
        begin
          timer1.Enabled := false;
          Elapsed := 0;
        end
      else
          Elapsed := Elapsed +1;
    end;
end;

Funcionando: Adapte à sua realidade

O nosso caso apenas adicionamos o resultado da leitura a um label:

Tela da aplicação apresentando resultado lido

Label1.Text := ClipService.GetClipboard.ToString;

Pois o intuito era apenas apresentar a leitura, obviamente as questões do dia a dia no desenvolvimento vão “um pouco além” não é verdade? No meu caso utilizo para buscar informações sobre produtos comunicando com o ERP da empresa através de um servidor Datasnap.

E você… em que aplicação a leitura de código de barras pode ser útil a você???

Espero ter ajudado. Bons códigos e até a próxima!

 

82 respostas para “Leitura de Código de Barras em Android com Delphi XE5”

    1. Olá Edilson… o tutorial está todo disponível para cópia. Acredito que copiando e colando os códigos você consiga efetuar os testes.
      Fique a vontade para efetuar cópias, alterações e melhorias.

      Abraço e obrigado pela participação!

  1. Landerson, parabéns por mais um tutorial, eles vem me ajudando muito. Admiro muito todo esse seu conhecimento e a sua vontade de compartilhar com o próximo.
    Obrigado pelos tutoriais e que venham muito mais deles, pois assim como eu, tenho certeza de que vem ajudando muito mais desenvolvedores!

    Abraço!

  2. Parabéns pelo post!

    Tenho tentado, sem sucesso, fazer a leitura sem entrar (ver) a tela do sistema de terceiros. Utilizo o sistema com o mesmo fundamento. Consultar produtos em beira de prateleira ou em estoque. O problema é que os dispositivos são fracos de memória e quando executa (muitas vezes) um sistema sobre o outro ele trava. Vi em um sistema do restaurante “LUKAS Gastronomia” em Itaipava-RJ onde o analista consegue em um timage ler o código e apresentar o resultado sem a utilização de telas de terceiros. E é este o meu objetivo. Achei algum material para iOS mas nada para Android. Sei como fazer em JAVA mas já tenho o sistema todo pronto em Delphi. Enfim, conseguindo algo, irei compartilhar com vcs.

    Abraços Digitais…

    1. Boa tarde Paulo e Landerson!!

      Conseguiram realizar algum teste sem necessitar de aplicativos externos? necessito muito entender como poderia fazer isto para implementar em consulta de promotores em revendas.

      OBrigado a todos.

  3. Primeiramente gostaria de Parabenizá-lo pelo post.

    Contudo, não consegui fazer funcionar corretamente.
    A aplicação esta abrindo e fazendo a leitura corretamente, porém não esta printando no label o valor do código de barras.

    Alguma ideia do que pode ser?

    1. Olá Jones… acredito que uma rápida revisada possa resolver seu problema… tente inserir um outro componente qualquer e jogar lá o resultado da Intent.
      De qualquer forma, acredito que tenha passado algum detalhe.
      Obrigado pela participação e poste aqui se encontrar o problema.

      Abraço.

    1. Grande Laercio!!! Fico realmente lisongeado com este comentário, afinal lá no meu início, alguns artigos seus no site CLUBE DELPHI foram norte de estudos meus quando iniciava no desenvolvimento Delphi. Depois conhecê-lo pessoalmente e tê-lo como parte do meu convívio e frequentador da minha querida Itaocara foi de uma enorme alegria.
      De qualquer forma obrigado pela participação aqui no Blog, e acima de tudo na comunidade Delphi participando na formação de diversos desenvolvedores.
      Um forte abraço e conte comigo no que precisar e estiver a meu alcance.

    1. Olá João que bom que vai ajudá-lo! Se for na questão que me consultou hoje cedo, lembre-se do que falei sobre deixar margem para a comunicação com outros dispositivos, como PC por exemplo, uma rotina simples de exportação de dados que possam ser importados e visualizados na “telona” da diretoria fará a diferença aí no processo.

      Um abraço e obrigado pela participação no blog.

  4. Landerson Gomes Parabéns pela publicação, estou desenvolvendo uma aplicação de leitura de codigo de barrras para verificar valores de produto, mais me deparei com alguns problemas, dentre eles a lentidao de quando leio o codigo de barras ele retorna para a minha aplicação, chegando até travar o app, não sei se pelo fato de trabalhar com uma base de dados muito grande possa vir a estar interferindo no desempenho. encontrei o mesmo Barcode Scanner em uma versão paga, gostaria se fosse possivel me informar se há possibilidades de resolver esta questão ou até mesmo adquirindo esse versao paga do Barcode ele vai funcionar normal ou não. Agradeço!

    1. Olá Johnson! Tente acessar as definições do aplicativo scan, lá você pode desativar algumas configurações que podem te dar um ganho de performance.
      Outro ponto também a ser verificado é a criação de um índice na sua base de dados na coluna de sua busca, isso também vai ajudá-lo na questão do desempenho.

      Espero que ajude… e obrigado por sua participação!

  5. Landerson, tem alguma forma de fazer a nossa nova aplicação verificar se o dispositivo já possui o barcode, e caso não possua, o proprio aplicativo direciona para o googleplay para instalar o Barcode Scanner?

    obrigado

  6. Parabéns pelo post, aqui funcionou. Contudo algumas vezes quando o código de barras é lido, e a aplicação delphi volta, fica travada inclusive com o item da tela fora do lugar correto (alinhamento), alguém já passou por isto?

    1. Marcelo beleza?! Em primeiro lugar obrigado pela participação… com relação ao problema informado eu particularmente não tive não.
      Você pode tentar configurar algumas opções no Apk do scan… talvez resolva.
      Tente e poste aqui se solucionar.

      Abraço.

  7. Parabéns Landerson pelo artigo muito bom.

    Landerson estou com um problema você poderia me dar uma luz? o problema é o seguinte:
    1 – Estou desenvolvendo um app que interage com um app desenvolvido por um terceiro através do intent;

    2 – O meu app consegue interagir com o app do terceiro, mas quando encera o uso do app do terceiro e retorna para o meu app o mesmo se encontra travado;
    3 – Observei que logo após a chamada da procedure startActivityForResult o meu app trava. desse ponto em diante mais nenhuma linha de código do meu app é executada;

    4 – Entrei em contato com a empresa(terceira) dona do app com o qual estou interagindo. A mesma me enviou um exemplo desenvolvido em JAVA e está funcionando perfeitamente. Assim concluo que o problema não está no app do terceiro e sim no meu;

    5 – Estou utilizando o delphi XE6;

    6 – cheguei implementar os métodos propostos nesse artigo http://blong.com/Articles/DelphiXE6AndroidActivityResult/ActivityResult.htm, mas o app trava no mesmo ponto;

    7 – Lembrando que preciso de alguns retornos gerados durante a execução do app do terceiro. (Estou usando o getStringArrayExtra, getIntExtra do intent que vem como parametro do método OnActivityResult, mas esse método nem chega a ser executado pois a aplicação trava no startActivityForResult ).

    Espero que você possa me dar uma luz, desde já muito obrigado pela atenção e mais uma vez parabéns pelo artigo.

    Att,
    Rodrigo Santos.

  8. Olá Landerson, estava à procura de algo muito parecido. Este é meu primeiro contato com aplicações Mobile. Gostaria de parabenizá-lo pelo artigo.
    Criei uma aplicação utilização seu exemplo, porém a mesma não está mostrando o conteúdo do label1. Ele apenas efetua a leitura usando a api do android e volta para o form de iniciar a leitura depois do tempo determinado. Pode me ajudar ? Estou querendo pegar o Codigo de Barras jogar em um parámetro, ocnsulta meu BD Oracle e mostar outros dados do produto.

    1. Olá Rinaldo, seja bem vindo!
      Obrigado pela parabenização, tem sido gratificante saber que o conteúdo tem auxiliado a várias pessoas, afinal esse era o propósito!
      Em relação ao funcionamento ideal seria você passar o modelo do aparelho e versão do Delphi que você está utilizando. Apenas exemplificando, este mesmo exemplo ontem não funcionou perfeitamente num Galaxy Tab 3 (T211) e rodou perfeito no Motorola D3, revisei o código várias vezes procurando erro e ao trocar de aparelho foi… o projeto que utilizo esta leitura de EAN é bem similar a essa arquitetura que você deseja, o usuário faz a leitura e o resultado da mesma é utilizado como parâmetro para busca num banco de dados, funciona perfeitamente aqui comigo.

      Aguardo seu feedback, mas sugiro também uma breve porém minuciosa revisada no fonte.

      E mais uma vez, obrigado por sua participação!

      Até +.

      1. Opa Landerson eu que agradeço a resposta rápida. Estou utilizando Delphi XE7 e o modelo do aparelho é um Sony Xperia M2 D2306. Vou efetuar um pente fino no código também. Se puder me mandar um exemplo do código que está usando para efetuar a operação eu agradeceria muito.

        1. Olá Rinaldo… veja abaixo como seria…Este código por exemplo é acionado no clique do botão:

          var
          Intent : JIntent;
          Info : JApplicationInfo;
          Ok : Boolean;
          begin
          Ok := False;
          try
          Info := SharedActivityContext.getPackageManager.getApplicationInfo(
          StringToJString('com.google.zxing.client.android'),0);
          if Info.packageName.equals(StringToJString('com.google.zxing.client.android')) then
          begin
          Ok := True;
          end;
          except on E: Exception do
          begin
          Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW);
          Intent.setData(TJnet_Uri.JavaClass.parse(StringToJString(
          'https://play.google.com/store/apps/details?id=com.google.zxing.client.android')));
          Intent.setPackage(StringToJString('com.android.vending'));
          SharedActivity.startActivity(intent);
          end;
          end;
          if OK then
          begin
          if Assigned(ClipService) then
          begin
          ClipService.SetClipboard('nil');
          Intent := TJIntent.Create;
          Intent.setAction(stringtojstring('com.google.zxing.client.android.SCAN'));
          SharedActivity.startActivityForResult(intent,0);
          Elapsed := 0;
          Timer1.Enabled := true;
          end;
          end;

          end;

          Todo o resto é realmente idêntico ao que você vê no post, bastando apenas copiar e colar. Ponto a ser mencionado é a necessidade da inclusão do namespace Androidapi.Helpers já que sua versão do Delphi é superior à XE5.

          Espero que ajude.

          1. Olá Landerson, boa tarde. Você teria esse exemplo usando o XE7? não estou conseguindo fazer ele funcionar. Ele roda o app, abre o leitor do barcode mas não traz os dados do código lido. O que pode ser?

  9. Bom dia Landerson,

    Novamente estou aqui com mais uma duvida. Gostaria de saber se você tem conhecimento da existência de uma maneira de captura o código de barras diretamente pela aplicação android!? Não gostaria de utilizar o intent (utilizando o intent e o app Zxing funcionou perfeitamente). Consegui utilizar a bibliotecas de leitura de código de barras libzbar para o iOS e funcionou, mas para o Android não encontrei nenhuma.

    1. Felipe bom respondê-lo novamente rapaz!!! Vamos lá!
      Acredito que fazendo a conversão da própria ZXing Java, ou qualquer outra biblioteca JAVA que faça a leitura dos códigos de barras, através do Java2OP, você terá sua solução. Ainda não fiz algo parecido, mas orientei algumas pessoas na utilização do procedimento e todos reportaram ser simples e eficaz.
      Então meu amigo, vale a pena tentar!

      Abração!

      1. Landerson,

        Bom dia.

        Conseguiu algm resultado em relação a biblioteca de leitura de código para delphi? Preciso algo parecido, segui seu tutorial e consegui realizar com o aplicativo externo. porém para o desenvolvimento de uma app mais profissional, necessito que a leitura seja realizada no próprio app que estou desenvolvendo.

        Obrigado e parabéns pelos tutoriais. Tenho seguido vários para iniciar no desenvolvimento em delphi.

        1. Olá Paulo… bem vindo! Vejo aqui que vou continuar te devendo!
          Não dei prosseguimento a essa busca devido a outras demandas, o que me deixa sem ter uma resposta favorável para sua questão.

          Mesmo sem poder ajudá-lo efetivamente fica meu agradecimento por sua participação e se achar algo, fique a vontade para, querendo compartilhar, usar o espaço aqui.

          Obrigado e até a próxima.

  10. Olá Leanderson

    Sou novo nessa área então me desculpe pela dúvida caso esteja sendo arrogante , meu código esta dando problema no TIMER1.ENABLED OU seja ele fica grifado em vermelho, seria por falta de algum USES ?

    1. Olá Igor! Seja muito bem vindo! Espero que seja a primeira de muitas interações então, no que puder ajudá-lo estarei a disposição!
      Com relação a seu questionamento, ao inserir um TTimer no seu formulário, automaticamente a Unit já será inserida na cláusula uses, isso acontecerá para todo componente visual que você inserir em todos os seus projetos no Delphi. Pois bem, acredito eu que você esteja tendo um erro de sintaxe… isso é muito comum quando estamos começando. Procure direitinho se não esqueceu um “;” para encerrar a linha, ou até mesmo uma “,” entre os namespaces das Units.
      Caso ainda persista o problema poste o seu código inteiro aqui para poder ajudá-lo. Caso tenha resolvido, poste um feedback.

      Obrigado por sua participação e força aí nos estudos e na caminhada!
      Até a próxima.

  11. Olá Landerson,

    Obrigado pela dica consegui verificar certinho aqui.

    Agora só estou com problema na compilação do mesmo que esta dando erro de ZipAlign.exe já dei uma pesquisa e creio que seja algum versão incompativel do SDK com o xe5 😀

    Valeuu

  12. Olá Landerson

    Estou com o seguinte erro em meu desenvolvimento, na hora de compilar o mesmo [DCC Fatal Error] F1026 File not found: ‘PlatformSDKsandroid-ndk-r8etoolchainsarm-linux-androideabi-4.6prebuiltwindowsbinarm-linux-androideabi-ld.exe’ já teve caso assim ou não ? Ja baixei varios SDK mas continua da mesma forma.

    Desde já Obrigado.

    1. Olá Igor! Como anda aí já resolveu???
      Na verdade a mensagem acusa a falta de um arquivo que você realmente não deve ter na pasta em questão. Tente um localizar pelo nome do arquivo.
      É meio “comum” entre uma atualização e outra do SDK Android os arquivos mudarem de pasta… já aconteceu com o zipalign por exemplo.

      Obrigado por sua participação, desculpe-me pela demora em interagir com seu comentário.
      A propósito, a título de curiosidade esse seu comentário é a interação de número 500 nos comentários, a grande maioria deles é resposta minha pois tento a medida do possível responder a todos.

      Poste algo depois sinalizando se conseguiu.

      Mais uma vez obrigado pela participação!

  13. Landerson , então achei o que estava errado, o delphi estava puxando errado o SDK ou seja estava puxando de um local que não existia nada hehe.

    Está funcionando perfeitamente joguei o APk para um moto G rodo legal.

    Agora estou verificando um artigo seu sobre o UNIDAC pois pretendo fazer uma consulta em um banco de dados Mysql com o código que for lido no label.

    Primeiro quero entender bem sobre o UNIDAC 😀

    Valeu pela ajuda cara tu é 10 ..

    Abraços

  14. Landerson, obrigado por colaborar seu conhecimento. Tem me ajudado a desenvolver uma aplicação para ler códigos de barras.
    Nos explica a função do Elapsed, pois pelo que entendi o aplicativo vai esperar o código de barras por 10 segundos timer 1000 * 10 do Elapsed, mas quando termina este prazo o scanner continua ativo e não retorna mais o código de barra para a applicação. O correto não seria fechar o scnner? Como fechar o intent depois deste tempo? Não consegui ainda.

  15. Ola Landerson,
    Venho tentando rodar esta aplicaçao!
    Mas quando jogo ela no smartphone simplesmente nao acontece nada ! Estou usando tanto o Delphi XE5 e o XE7 mas nas duas versoes da IDe nao consigo obter sucesso !
    Apresenta a tela toda e quando clico no botao “Iniciar Leitura” nao acontece simplesmente nada, ja verifiquei a ausencia do barcode e instalei novamente ! Mas nao obtive sucesso ! Se puder me ajudar ficarei grato!
    E parabens pelos Posts estou aprendendo muito com suas publicaçoes !

          1. Olá Raphael… Vou tentar refazer o projeto do zero e te posiciono!
            Desde já agradeço sua participação!
            Até a próxima.

    1. Olá Valdunier!
      Obrigado pelas palavras, na verdade fica um sentimento muito bacana de saber que têm sido úteis as postagens.

      Então mais uma vez obrigado pelas palavras e a medida do possível espero poder contribuir compartilhando alguns códigos, projetos, etc.

      Até uma próxima!

  16. Boa Tarde. Landerson Muito Obrigado… Cara o seu posto foi bem sucedido, sou iniciante na plataforma delphi android. mas preciso de um ajuda. eu utilizo o xe6 e o mesmo gera um erro is not a valid integer value, já rodei todo o código e percebi que tem algo errado, teria como você me ajuda. Valew Muito obrigado.

    1. Olá Marcio, seja bem vindo!
      Um único problema reportado até então por alguns leitores, inclusive espalhado pelos comentários nos diversos posts há a seguinte sinalização:
      A partir do Delphi XE6 a Android.Helpers passa a levar por exemplo a StringToJString, sendo assim basta declarar essa namespace na sua cláusula uses.

      Espero que ajude.
      Mais uma vez obrigado por sua participação e não esqueça de postar um feedback quando puder!

    1. Olá Gilmar…
      Pelos testes feitos por todos funciona perfeitamente, único ponto de atenção é adicionar na cláusula uses a namespace Android.Helpers que passa a levar por exemplo a StringToJString.
      Basicamente é isso, seguindo o tutorial acredito que você obterá êxito!

      Espero que consiga aí, obrigado por sua participação e não deixe de postar um feedback!

      Grande abraço e até uma próxima.

  17. Mas fiz o teste e nao da certo no xe8 nao, quando coloco estas
    uses

    FMX.Dialogs,FMX.platform, fmx.helpers.android, androidapi.JNI.GraphicsContentViewText,
    androidapi.jni.JavaTypes,FMX.Objects,
    FMX.StdCtrls;

    da erro no xe8

    1. Olá Gilmar… consegue mandar a mensagem de erro… ou até mesmo toda a unit ou projeto?

      Alguns usuários já compilaram e XE8 e nenhum outro reportou problema, de qualquer forma, envie que tento analisar aqui.

      Fico no seu aguardo!

      Até a próxima.

    1. Oscar, bem vindo!
      Existem alguns SDK próprios para isso, basta dar uma pesquisada básica aí no Google que devem aparecer alguns…
      Um desses SDK você pode encontrar neste link: http://www.scandit.com/
      (vale mencionar que nunca o utilizei, logo fica sendo por sua conta e risco a utilização e interação com o mesmo).

      Espero tê-lo ajudado.
      Obrigado por sua participação e até a próxima!

  18. Bom dia Landerson.
    Estou com problemas na hora de visualizar o código de barras, o meu código de barras possui 44 números, e só aparece uns 8 e mesmo assim nenhum dos números que aparece m fazem parte dos 44 que escaneei.

    1. Olá Eduardo!
      Tente me enviar a imagem do código de barras que você está tentando escanear.
      Por favor sinalize também a versão do Delphi e do Android que você está usando aí.

      Desde já obrigado por sua participação.

  19. Landerson, primeiramente parabéns pelas postagens. Aqui no meu funcionou certinho, estou usando o XE7, porém acontece o seguinte, tenho a aplicação e dela chamo o leitor, mas se eu voltar pelo botão do mobile (hardware) ele não fecha somente a tela com o leitor, mas sim o sistema todo.
    Detalhe é que em seguida se eu tentar entrar novamente no meu sistema, ele fica travado, como se estivesse esperando receber alguma coisa.
    Você sabe se existe alguma maneira de resolver isso?
    Desde já agradeço.

    1. Resolvi da seguinte forma (Não sei se é gambiarra ou não, mas funcionou)

      Caso retornar do leitor, alimento uma variavel publica boolean para false, e no evento OnCloseQuery coloco:

      CanClose := Variavel;

      Resolveu 🙂

  20. ola

    eu fiz o teste no delphi seattle e funcionou bem o teste.

    existe a possibilidade de integrar o codigo Zxing direto na no delphi, de forma que quando instalar meu projeto em um celular, não necessite instalar o aplicativo “barcode Scanner”

  21. muito bom o tutorial.
    agora gostaria da ajuda nesse mesmo exemplo:

    Ao ler o código de barras, registrar

    o primeiro código, na primeira linha
    segundo código, na segunda linha
    terceiro código, na terceira linha
    e assim por diante.

    exemplo no memo após 5 leituras consecutivas:

    78925820
    78925821
    78925822
    78925823
    78925824

    usar o componente memo ou outro similar.delphixe7

  22. fiz assim,
    adicionei um memo1.text para receber o valor do label1.text.

    no entanto, após a segunda leitura, o valor do label1.text não vai para a segunda linha do memo1.text;

    ja na terceira leitura do codigo pelo leitor, o codigo lido é registrado no label1.text e lancado tambem no memo1.text porém os codigos lidos antes, foram apagados recebendo o terceiro codigo lido..

    alguem pode ajudar!?

    procedure TForm1.Timer1Timer(Sender: TObject);
    var
    i: integer;
    begin
    if (ClipService.GetClipboard.ToString ‘nil’) then
    begin
    timer1.Enabled := false;
    Elapsed := 0;

    Label1.Text := ClipService.GetClipboard.ToString;
    memo1.text := (Label1.Text+#13+#10); {LINHA ADICIONADA}
    end
    else
    begin
    if Elapsed > 9 then
    begin
    timer1.Enabled := false;
    Elapsed := 0;
    end
    else
    Elapsed := Elapsed +1;
    end;
    end;
    end.

    1. Olá Aurino, seja bem vindo!
      Que bom que você mesmo já começou a caminhar. Em relação ao processo com o TMemo, use da seguinte forma:
      Memo1.Lines.Append(Label1.Text)
      Ou
      Memo1.Lines.Add(Label1.Text)

      Não deixe de postar um feedback aqui depois.
      Até a próxima!

  23. Bom dia, o meu esta com problema nessas USES:
    androidapi.JNI.GraphicsContentViewText, fmx.helpers.android, androidapi.jni.JavaTypes, Androidapi.Helpers,
    FMX.Helpers.Android;

    Msg de erro: Cannot resolve unit name “Androidapi.Helpers” e assim vai….

    Uso do Delphi 10.1 Berlin.

  24. Boa noite a todos, fiz em meu sistema o exemplo acima, porem toda vez que tento ler um codigo de barras, o sistema fecha por completo. Descobri que se eu usar qualquer tipo de alinhamento nos formularios ou nos componentes, o sistema fecha ao tentar ler o codigo de barras. Se tirar todos os alinhamentos, o leitor le normalmente. Alguem ja descobriu como resolver isso?
    Grato por qualquer ajuda.

Deixe uma resposta