the club - megazine - the club - o maior clube de ... · banco de dados delphi c# android...

32
dezembro 2012

Upload: others

Post on 24-Jul-2020

26 views

Category:

Documents


13 download

TRANSCRIPT

Page 1: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012

Page 2: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012

Page 3: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012 03

Desafio The Club

30

Banco de Dados Delphi

AndroidC#

ComunicadoSeguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

de 2012 a 31 de dezembro de 2012.

índiceAndroid - Arquivo de Configuração

Editorial

1004Visual Studio 2012

05FireMontkey - Formulário base de cadastro com barra de ferramentasparte II 17 24

LegendaInicianteIntermediárioAvançado

Autor: Thiago Cavalheiro Montebugnoli

Autor: Lucas Vieira de Oliveira

Autor: Luciano Pimenta

Autor: Victory Fernandes e Mu-rilo Plínio

Biometria - Uma abordagem prática para impressão digital

Page 4: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 201204

Bem-vindo

Delphi© é marca registrada da Embarcadero Technologies®™, as demais marcas citadas são registradas

pelos seus respectivos proprietários.

Thiago Montebugnoli - Editor [email protected]

Já estamos no fim do ano, dá pra acreditar?

O mês de Dezembro se caracteriza por ser uma época de muitas festas e comemorações. Nós do The Club desejamos a todos um Feliz Natal e um Ano Novo repleto de realizações e que nossa parceria se estenda por muitos e muitos anos.

Nesta edição, nosso colaborador Luciano Pimenta muda um pouco o foco dos artigos e nos demonstra algumas das novidades da nova versão do Microsoft Visual Studio 2012.

Nosso consultor técnico Lucas de Oliveira nos ensina a Montar um formulário Base de cadastro com barra de ferramentas utilizando o “FireMonkey”, sendo que nesta segunda e última parte nos mostra a possibilidade de trabalhar com acesso a dados.

Victory Fernandes em parceria com Murilo Plinio, vem com um artigo específico para integração de sistemas utilizando a Biometria, com o título “Biometria, uma abordagem prática para impressão digital”. Neste artigo eles implementam conceitos importantes da Biometria junto com o Delphi.

No artigo “Android – Arquivo de Configuração”, montei um exemplo de utilização destes tipos de arquivos, possibilitando uma parametrização de várias situações como Configurações de FTP, Bases de Dados, entre outros.

Não podemos nos esquecer da seção “Desafio The Club”.

Espero que gostem desta última revista do ano de 2012,

Abraços

Av. Profº Celso Ferreira da Silva, 190 Jd. Europa - Avaré - SP - CEP 18.707-150

Informações e Suporte: (14) 3732-1529

Internethttp://www.theclub.com.br

Cadastro: [email protected]: [email protected] Informações: [email protected] Cadastro: theclub_cadastro

Skype Suporte: theclub_linha1 theclub_linha2 theclub_linha3

www.twitter.com/theclubbr

Copyright The Club 2012

Diretor TécnicoMarcos César Silva

DiagramaçãoEduardo Massud

ArteVitor M. Rodrigues

RevisãoCíntia Amaral

ColunistasMarcos César Silva

Thiago Cavalheiro MontebugnoliLucas de OliveiraLuciano Pimenta

Impressão e acabamento:GRIL - Gráfica e Editora

Taquarituba-SP - Tel. (14) 3762-1345

ReproduçãoA utilização, reprodução, apropriação, armazenamento em banco de dados, sob qualquer forma ou meio, de textos, fotos e outras criações intelectuais em cada publicação da revista “The Club Megazine” são terminantemente proibidos sem autorização escrita dos titulares dos direitos autorais.

Page 5: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012 05

No mês de setembro foi lançada oficialmente a nova versão da ferramenta de desenvolvimento da Microsoft, o Visual Studio 2012. Essa nova versão trás muitas novidades para o desenvolvedor, seja na parte prática do desenvolvi-mento, como nas tecnologias.

Tivemos em São Paulo o Visual Sumitt, evento gratuito para mostrar a comunidade as principais novidades da ferramenta, e quero mostrar neste artigo algumas das novidades vistas. Já podemos adiantar que muitas funcionalidades produtivas foram incorporadas como Intellisense para CSS, HTML e JQuery, possibilidade de debugar Stored Procedures, Code Snippets no editor de HTML, SQL Server Objects e muito mais. Figura 1. Novo visual do Visual Studio 2012

Page 6: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 201206

Novo visual

De cara, o Visual Studio 2012 tem um novo visual (Figura 1).

Esse novo visual é baseado em um esquema de cores em tons de cinza claro (chamado Light). Para muitos (eu me ex-cluo disso), que gostam de mudar a cor de fundo do editor de código do Visual Studio precisam configurar muitas alterações nos opções da ferramenta.

Agora, basta mudar o tema para Dark. Acesse Tools>Options>Environment>General e altere Color theme para Dark (Figura 2).

Figura 2. Alterando o tema do Visual Studio 2012

Assim, todo o layout do Visual Studio 2012, muda para um esquema de cores escuro (editor de código, janelas, barra de ferramentas etc). Veja na Figura 3 o novo visual.

Figura 3. Novo esquema de cores do Visual Studio 2012

Assim, não precisamos de muitas configurações para alterar o fundo do editor de código.

Projetos

A quantidade de projetos disponíveis vai depender da ver-são do Visual Studio 2012 instalada (Professional, Premium, Ultimate e Test Profissional).

Mas uma coisa é certa, criar aplicações com o estilo Me-tropolis (antigo Metro) só é possível se o sistema operacional for o Windows 8 (veja na Figura 4 o template do projeto Me-tropolis – Fonte: msdn.microsoft.com/pt-br/library/windows/apps/br211380.aspx).

Figura 4. Template para Metropolis no Visual Studio 2012 com Windows 8.

Segundo as informações, a criação de projetos, assim como o carregamento da IDE e build estão mais rápidos. É testar para ver. O Visual Studio 2012 abre qualquer projeto de versões ante-riores, utilizando o seu wizard de conversão. Projetos do Visual Studio 2010 com Service Pack 1 não necessitam do wizard.

Você pode usar seus projetos atuais para trabalhar com o Visual Studio 2012, assim, você estará usando as novidades e funcionalidades da ferramenta. Caso deseja voltar a alguma versão anterior, poderá fazer normalmente.

Agora, se você quer migrar de versão do .NET, deve tomar cuidados. A partir do momento que você escolheu a versão mais atual do framework, não poderá voltar atrás.

Essa migração deve ser muito bem avaliada antes de ocor-rer, pois você deve atentar para controles e ferramentas de terceiros, pois as mesmas devem ter seus softwares atualizados para o Visual Studio 2012.

Nota: Sempre é bom fazer um backup do projeto quan-do for realizar qualquer tipo de migração. Se estiver usando uma ferramenta de controle de versão, assegure-se que a versão do servidor seja a mais atual.

Pesquisas

Page 7: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012 07

A forma como pesquisamos no Visual Studio 2012 ficou mais fácil. No Solution Explorer, temos uma caixa de texto para pesquisar em toda Solution (Figura 5).

Figura 5. Pesquisas no Solution Explorer

Essa pesquisa não é feita apenas em arquivos do projeto, mas em todo o projeto. Por exemplo, ao pesquisar “Cliente”, arquivos, classes, métodos, propriedades, controles de tela, enfim, tudo que estiver no Solution Explorer será mostrado.

Outra pesquisa interessante. Acesse o Quick Lanch na parte superior direita do IDE ou aperte CTRL + Q (admito que muito pouco usei essa opção). Experimente digitar “Color” nessa caixa. As opções mostradas levam diretamente aos editores ou funcionalidades referentes a cores no Visual Studio. Rápido e prático (Figura 6).

Figura 6. Pesquisando funcionalidades e opções no Visual Studio 2012

Para pesquisas no editor de código, usando as teclas CRTL + F, o editor fica “dockado” no lado direito superior e é uma pesquisa incremental, assim, ao digitar as palavras, as mesmas são destacadas no editor.

Caso o valor digitado não seja encontrado, será mostrada uma borda vermelha na caixa de texto.

Editor de código

O que mais recebeu atenção nas novidades. Mudanças substanciais ocorreram no editor, principalmente para arqui-vos HTML (ASPX), CSS e de script (Script/JQuery). Agora temos um Intellisense mais completo, Code Snippets nesses tipos de arquivos. O que seriam Code Snippets?

São blocos de código salvos na ferramenta para agilizar a utilização dos mesmos no editor. Faça um teste: no editor de código, digite a palavra “foreach” e depois aperte duas vezes a tecla TAB. Veja que foi criado um bloco de código para foreach com declaração do tipo da variável e a coleção que o laço irá percorrer.

Isso ajuda para blocos de código muito grandes onde preci-saríamos codificar várias vezes a mesma coisa. Existem vários no Visual Studio e você pode visualizá-los acessando Tools>Code Snippets Manager (Figura 8).

Figura 8. Gerenciador de Code Snipptes no Visual Studio

Figura 7. Pesquisa incremental do Visual Studio 2012

Page 8: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 201208

A novidade que agora temos essa facilidade também em outros tipos de arquivos, como HTML, ASPX, CSS e de scripts. Faça um teste, no editor, digite: “<table” e aperte por duas vezes a tecla TAB.

Igual ao anterior, um bloco de código será adicionado, faci-litando a criação de fechamento de tags para um objeto table (com tr e td). Muito fácil e prático.

Você pode criar Code Snippets deixando assim mais pro-dutivo seu trabalho para blocos de códigos comuns no seu dia a dia.

Outra novidade muito interessante para auxiliar o desen-volvimento de aplicações Web, é a alteração automática para a tag de fechamento. Por exemplo: é comum a necessidade de modificação de uma tag HTML/ASPNET. Ao adicionarmos um Button, na verdade deveríamos usar um LinkButton.

Para não remover todo o código e adicionar novamente, muitas vezes, apenas renomeamos a tag.

Ao renomear a tag de abertura, também precisamos pro-curar e renomear a tag de fechamento. Agora, isso fica por conta do Visual Studio. Ele renomeia a tag de fechamento automaticamente para você.

Para quem é desenvolvedor, sabe que trabalhar com CSS muitas vezes é mais complicado que para o web designer. Eu sempre tive problemas na escolha ou modificação de cores, pois o valor em hexadecimal é difícil de compreender. Utilizava ou-tras maneiras para conseguir o valor para colocar na classe CSS.

Agora, basta acessar a classe que possui a propriedade de cor e usar seu Intellisense. O Visual Studio disponibiliza para você um editor de cores (Figura 89.

Figura 9. Editor de cores em arquivos CSS

Com o editor, a escolha de cores é muito mais simples e automaticamente o arquivo CSS é atualizado com a cor sele-cionado. Podemos ainda, escolher a cor de qualquer janela para transformar em hexadecimal, usando a ferramenta Pincel (semelhante ao Paint). Definitivamente, será mais simples trabalhar com arquivos CSS.

Ainda no editor para arquivos ASPX/HTML, caso tenhamos um método de Script ou JQuery e gostaríamos de ver sua implementação, agora podemos usar a tecla F12 (Go To Defi-nition) e seremos direcionados para a declaração do método, propriedade etc.

Toolbox, preview etc

No Toolbox também temos uma pesquisa para facilitar a busca de controles de tela. Imagine a sua ferramenta instalada com uma suíte grande de controles.

Essa pesquisa auxilia bastante. No Solution Explorer, pode-mos visualizar (preview) para alguns tipos de arquivos, como por exemplo, imagens.

Isso mesmo passe o mouse sobre arquivos do tipo imagem no Solution Explorer e veja o preview do mesmo, sem precisar abri-lo (Figura 10).

Banco de dados

Em versões anteriores, já tínhamos acesso a objetos do banco de dados onde poderíamos mudar seus dados, tipos e características.

O SQL Server Objects Explorer não veio substituir o Server Explorer, mas sim adicionar novas características para trabalhar com banco de dados.

Figura 10. Preview de imagens no Solution Explorer

Page 9: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012 09

Você estará praticamente com o SQL Server Management Studio dentro do Visual Studio. O editor agora possui Intelli-sense, onde fica mais fácil criar queries onde não lembramos o nome de objetos (tabelas, colunas), como podemos ver na Figura 11.

Figura 11. Intellisense para consultas no banco de dados

Nas versões anteriores do Visual Studio, usávamos um ar-quivo MDF para criar um database local, mas dependíamos do SQL Server Express instalado. Agora temos o SQL Server Express LocalDB para trabalhar com arquivos de dados.

Agora podemos debugar uma Stored Procedure. Isso mes-mo, dentro do Visual Studio, podemos debugar uma Stored Procedure. Clique com o botão direito na Stored Procedure e escolha Debug Procedure.

A Stored Procedure será executada e caso a mesma tenha parâmetro (s) será mostrado um editor para a inserção dos valores. Após isso, a execução da SP será iniciada. Um SQL será criado para execução da SP com os valores digitados. Para “entrar” na procedure, basta apertar F11.

Assim, podemos visualizar valores, fazer verificação de objetos, enfim, como se estivéssemos em uma classe C# por exemplo. Veja na Figura 12 um exemplo.

Versões Express

O Visual Studio 2012 possui versões Express (gratuitas). O Visual Studio for Web, for Windows 8 e for Windows. Como podemos notar temos uma versão especifica para Windows 8 onde podemos criar aplicações Metropolis.

No primeiro momento, uma versão para Windows não estava disponível, mas a comunidade solicitou e essa versão

foi disponibilizada.

Conclusões

Vimos nesse artigo uma pequena parte das novidades do Visual Studio 2012. A ferramenta esta a cada versão mais oti-mizada e auxiliando o desenvolvedor no seu trabalho maçante do dia a dia. Vale a pena baixar a versão trial e conhecer mais a fundo suas novidades.

Um grande abraço a todos e até a próxima!

Figura 12. Debugando uma Stored Procedure no Visual Studio

2012

É Técnico em Processamento de Dados, desenvolvedor Delphi/C# para aplicações Web com ASP.NET e Windows com Win32 e Windows Forms. Palestrante da 4ª edição da Borland Conference (BorCon).

Autor de mais de 60 artigos e de mais de 300 vídeos aulas publicadas em revistas e sites especializados. É consultor da FP2 Tecnologia (www.fp2.com.br) onde ministra cursos de programação e banco de dados. É desenvolvedor da Paradigma Web Bussi-ness em Florianópolis-SC.

Sobre o autor

Luciano Pimenta

www.lucianopimenta.net

Page 10: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 201210

Os Arquivos de Configurações sempre foram usados pelos aplica-tivos ou sistemas operacionais. São arquivos onde podemos guardar informações que podem ser facilmente alteradas sem a necessidade de recompilação da aplicação, ou seja, basta alterarmos o mesmo para que tais configurações sejam aplicadas. No Windows utilizamos o Registro, no Delphi temos o “.ini” e em outras linguagens como o C# o “.XML”, que são arquivos que possuem estruturas onde definimos as configurações, nas quais são definidas dentro de elementos através de atributos pré--definidos (chave/valor). Em se tratando da linguagem Java, temos as “Properties” – as denominadas Propriedades, na qual iremos usá-la neste artigo.

Classe “Properties” (Propriedades)

No Android, um objeto da classe “Properties” é um “Hashtable”, onde as

chaves e os valores devem ser Strings. Cada propriedade pode ter um padrão de lista de propriedades que especifica os valores para serem usados quando uma determinada chave não é encontrada.

A codificação de caracteres utilizada é a ISO-8859-1 em vez de UTF-8. A ISO-8859-1 é capaz de representar apenas um pequeno subconjunto de Unicode, podendo usar ambos os métodos “LoadFromXML/ StoreToXML” (que usam UTF-8 por padrão) ou as sobrecargas que levam um “OutputStrea-mWriter”. É importante ressaltar que podemos salvar arquivos do tipo “.XML” e ”.properties”, sendo que este último será o qual iremos basear nosso exemplo.

Os principais métodos públicos desta classe são:

SetProperty: método utilizado para definir os atributos, como par chave/valor.

GetProperty: método responsável por recuperar os valores definidos, usando par chave/valor.

Android Arquivo de Configuração

Page 11: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012 11

Store: este método armazena os dados, possuindo também o “Storeto-XML” que guarda as configurações no formato padrão XML.

Load: responsável por carregar as propriedades do tipo “InputStream”. Já o método “LoadFromXML” lê as informações contidas em um arquivo no padrão XML.

Criando um exemplo

Depois de conhecermos um pouco desta classe, montaremos um pequeno exemplo para maior aprendizado. Este exemplo será responsável por armazenar dados referentes às configurações básicas de um servidor FTP, como: Usuário, Senha, Url e diretório. Pelo fato destas configurações serem parametrizadas, tomei como base este tipo de aplicação. O Primeiro passo será de criar um projeto em Android e alterar o arquivo de configuração “AndroidManisfest.xml”, permitindo a leitura e escrita em um arquivo externo da aplicação, Veja a seguir o código XML para esta tarefa:

<?xml version=”1.0” encoding=”utf-8”?><manifest xmlns:android=”http://schemas.android.com/apk/res/android” package=”pct.Android_ArquivosConfiguracao” android:versionCode=”1” android:versionName=”1.0”>

<uses-sdk android:minSdkVersion=”8” /> <uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>

<application android:icon=”@drawable/icon” android:label=”@string/app_name”> <activity android:name=”.Android_ArquivosConfiguracaoActivity” android:label=”@string/app_name”> <intent-filter> <action android:name=”android.intent.action.MAIN” /> <category android:name=”android.intent.category.LAUNCHER” /> </intent-filter> </activity></application></manifest>

Esta tarefa também pode ser feita pela interface gráfica de configurações. Clique no botão “Add...” para adicionar os tipos de permissões desejadas. Ver Imagem 01.

Figura 01: Adicionando Permissões.

Classe Configuração

Definimos uma classe para manuseio destas configurações, clique com o botão direito em “New/class...” com o nome de “configuracao.java”. Crie as seguintes propriedades privadas: Usuário, Senha , Url e Diretório e os métodos “Getters and Setters” encarregados de trabalhar com estas propriedades.

package pct.Android_ArquivosConfiguracao;

public class configuracao { private String usuario; private String senha; private String url; private String diretorio; public String getUsuario() { return usuario; }

public void setUsuario(String usuario) { this.usuario = usuario; }

public String getSenha() { return senha;

Page 12: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 201212

}

public void setSenha(String senha) { this.senha = senha; }

public String getUrl() { return url; }

public void setUrl(String url) { this.url = url; }

public String getDiretorio() { return diretorio; }

public void setDiretorio(String diretorio) { this.diretorio = diretorio; }}

Criando o Lay-Out

Adicione 4 TextViews, 4 EditTExts e 2 Buttons para a criação do Lay-Out. Ver Imagem 02.

Figura 02: Lay-Out.

O botão salvar será responsável por guardar as informações dentro do arquivo, já o carregar por ler os dados contidos.

O XML correspondente:

<?xml version=”1.0” encoding=”utf-8”?><LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:orientation=”vertical” > <TextView android:textAppearance=”?android:attr/textAppearanceMedium” android:id=”@+parametros/txtUrl” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Url:” android:typeface=”sans”> </TextView> <EditText android:id=”@+parametros/edtUrl” android:layout_height=”wrap_content” android:layout_width=”320dp” android:typeface=”sans”> </EditText> <LinearLayout android:layout_width=”match_parent” android:id=”@+parametros/linearLayout1” android:layout_height=”wrap_content”> <LinearLayout android:layout_width=”wrap_content” android:id=”@+parametros/LinearLayout02” android:orientation=”vertical” android:layout_height=”wrap_content”> <TextView android:textAppearance=”?android:attr/textAppearanceMedium” android:id=”@+parametros/txtUsuario” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Usuário:” android:typeface=”sans”>

Page 13: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012 13

</TextView> <EditText android:id=”@+parametros/edtUsuario” android:layout_height=”wrap_content” android:layout_width=”190dp” android:typeface=”sans”> </EditText> </LinearLayout> <LinearLayout android:layout_width=”wrap_content” android:id=”@+parametros/linearLayout2” android:layout_height=”match_parent” android:orientation=”vertical”> <TextView android:textAppearance=”?android:attr/textAppearanceMedium” android:id=”@+parametros/txtSenha” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Senha:” android:typeface=”sans”> </TextView> <EditText android:id=”@+parametros/edtSenha” android:layout_height=”wrap_content” android:layout_width=”130dp” android:typeface=”sans”> </EditText> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width=”match_parent” android:id=”@+parametros/linearLayout7” android:layout_height=”wrap_content”> <LinearLayout android:id=”@+parametros/linearLayout6” android:layout_height=”match_parent” android:orientation=”vertical” android:layout_width=”match_parent”> <TextView android:textAppearance=”?android:attr/textAppearanceMedium”

android:id=”@+parametros/txtDiretorio” android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:text=”Diretório Ftp:” android:typeface=”sans”> </TextView> <EditText android:id=”@+parametros/edtDiretorio” android:layout_height=”wrap_content” android:typeface=”sans” android:layout_width=”match_parent”> </EditText> </LinearLayout> </LinearLayout> <LinearLayout android:id=”@+id/linearLayout1” android:layout_height=”wrap_content” android:layout_width=”match_parent”> <LinearLayout android:id=”@+parametros/linearLayout9” android:layout_height=”wrap_content” android:orientation=”horizontal” android:layout_gravity=”center” android:gravity=”center|center_horizontal” android:layout_width=”match_parent”> <Button android:id=”@+parametros/btnCarregar” android:layout_height=”wrap_content” android:layout_width=”150dp” android:onClick=”salvar” android:typeface=”sans” android:text=”Salvar” android:layout_gravity=”center_horizontal”> </Button> <Button android:id=”@+parametros/btnSalvar” android:layout_height=”wrap_content” android:layout_

Page 14: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012

width=”150dp” android:onClick=”carregar” android:typeface=”sans” android:text=”Carregar” android:layout_gravity=”center_horizontal”> </Button> </LinearLayout> </LinearLayout> </LinearLayout>

Codificando o exemplo

Na atividade principal programarei três métodos, sendo:Inicializalisteners: Método que irá iniciar os componentes.Salvar: Salvar os dados no arquivo de propriedade.Carregar: Ler os dados no arquivo de propriedade.Segue a seguir o código completo comentado.package pct.Android_ArquivosConfiguracao;

import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.util.Properties;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.EditText;import android.widget.Toast;

Importe as seguintes bibliotecas. A principal neste caso é a “Java.util.Properties”.

public class Android_ArquivosConfiguracaoActivity extends Activity { EditText edtUrl, edtUsuario, edtSenha, edtDiretorio;

Estas variáveis irão armazenar as propriedades contidas no arquivo de propriedades.

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

InicializaListeners(); }

No início do programa chamaremos o método “Inicializalisteners”, nos permitindo trabalhar com os componentes na tela.

public void InicializaListeners() { edtUrl = (EditText) findViewById(R.parametros.edtUrl); edtUsuario = (EditText) findViewById(R.parametros.edtUsuario); edtSenha= (EditText) findViewById(R.parametros.edtSenha); edtDiretorio = (EditText) findViewById(R.parametros.edtDiretorio); }

Faremos o uso do “findViewById()” para atribuir o “ID” dos componentes às variáveis criadas anteriormente.

public void salvar(View v) { configuracao conf = new configuracao(); conf.setUrl(edtUrl.getText().toString()); conf.setUsuario(edtUsuario.getText().toString()); conf.setSenha(edtSenha.getText().toString());conf.setDiretorio(edtDiretorio.getText().toString()); Properties properties = new Properties();properties.setProperty(“conf.Usuario”, conf.getUsuario()); properties.setProperty(“conf.Senha”, conf.getSenha()); properties.setProperty(“conf.Url”, conf.getUrl());properties.setProperty(“conf.Diretorio”, conf.getDiretorio()); try { FileOutputStream fos = new FileOutputStream(“/mnt/sdcard/configuracao.properties”); properties.store(fos, “CONFIGURACAO FTP:”);fos.close(); Toast.makeText(Android_

Page 15: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 201214 15

ArquivosConfiguracaoActivity.this, “Dados Salvos com sucesso!!”, Toast.LENGTH_SHORT).show();} catch (IOException ex) { ex.printStackTrace(); }}

O método Salvar irá guardar os dados no arquivo de propriedades. No primeiro momento instancie a classe “configuração” e atribua os dados necessários, neste caso estamos usando o EditText como entrada de Dados. Atribuímos para a URL, Usuário, Senha e Diretório. Logo após crie um objeto da classe “Java.util.Properties”, setando as propriedade e os seus valores. Através de um bloco “Try...Catch” criamos um objeto do tipo “FileOutputStream”, indicando o caminho onde será salvo e o nome do arquivo. O método “Store” grava os dados no arquivo e por final o comando “close” o libera da memória.

Damos uma mensagem informativa ao usuário que o comando foi exe-cutado com sucesso.

O arquivo “configuração.properties” deverá possuir a seguinte estrutura:

#CONFIGURACAO FTP:#Mon Nov 19 17:00:05 GMT+00:00 2012conf.Diretorio=theclubconf.Url=ftp.teste.com.brconf.Senha=teste123conf.Usuario=thiago

public void carregar(View v) { Properties properties = new Properties(); try {FileInputStream fis = new FileInputStream(“/mnt/sdcard/configuracao.properties”); properties.load(fis); String Url = properties.getProperty(“conf.Url”);String Usuario = properties.getProperty(“conf.Usuario”); String Senha = properties.getProperty(“conf.Senha”);String Diretorio = properties.getProperty(“conf.Diretorio”); edtUrl.setText(Url); edtUsuario.setText(Usuario); edtSenha.setText(Senha); edtDiretorio.

setText(Diretorio); Toast.makeText(Android_ArquivosConfiguracaoActivity.this, “Dados Carregados com sucesso!!”, Toast.LENGTH_SHORT).show();

} catch (IOException e) { e.printStackTrace(); }

}}

O método carregar faz o trabalho inverso do Salvar. Instancie a classe “Proprierties” e utilize uma variável do tipo “FileInputStream” setando o arquivo que será lido. O método “Load” faz a leitura através do objeto criado anteriormente. Em seguida capturamos o valor da propriedade informando através da classe “Toast” uma mensagem informativa ao usuário.

Ver Imagem 03 e 04 o exemplo em “Run-Time”.

Figura 03: Método salvar.

Page 16: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 201216

Thiago Cavalheiro Montebugnoli é tecnólogo, formado pela Faculdade de Tecnologia de Botucatu – SP (FATEC) foi consultor técnico do The Club, já desenvolveu softwares utilizando a plataforma .NET, Delphi junto com Banco de Dados SQL Server e Firebird. Atualmente trabalha no Centro de Proces-samento de Dados da Prefeitura Municipal de Itaí-SP. Possui as seguintes certificações: MCP - Microsoft Certified Professional, MCTS - Microsoft Certi-fied Technology Specialist, MCAD - Microsoft Certified Application Developer e MCSD - Microsoft Certified Solution Developer.

Sobre o autor

Thiago Cavalheiro Montebugnoli

[email protected]

Figura 04: Método Carregar.

Salvando em XML

Outra opção que temos também é de salvar em XML utilizando o método “StoreToXML” e “LoadFromXML” tendo como resultado um arquivo neste mesmo formato. Veja a seguir um exemplo.

Para salvar em XML:

properties.storeToXML(fos, “CONFIGURACAO FTP:”,”ISO-8859-1”);

Passamos como parâmetro o “OutPutStream”, o título e o tipo de XML.

Para carregar em XML:

properties.LoadfromXML(fis);

Para ler utilizamos apenas o “InputStream”.

O Arquivo gerado deverá fica idêntico ao XML a seguir:

<?xml version=”1.0” encoding=”ISO-8859-1”?><!DOCTYPE properties SYSTEM “http://java.sun.com/dtd/properties.dtd”><properties><comment>CONFIGURACAO FTP:</comment><entry key=”conf.Diretorio”>ftp.teste.com</entry><entry key=”conf.Url”>ftp.teste.com.br</entry><entry key=”conf.Senha”>teste123</entry><entry key=”conf.Usuario”>thiago</entry></properties>

Conclusão

A classe “Java.util.Properties” se torna muito importante quando traba-lhamos com parametrização nos sistemas. Neste artigo achei necessário criar uma classe “configuração” para um melhor entendimento ao decorrer do desenvolvimento. Vimos que com pouco trabalho podemos guardar informa-ções importantes em arquivos externos de configurações, como por exemplo: as configurações de um servidor FTP. Estes tipos de arquivos também são utilizados em configurações de Banco de Dados, definindo o Usuário, a senha ou o Caminho da Base de Dados. Fica a dica, Um Abraço e até o mês que vem!

Referências

http://developer.android.com/reference/java/util/Properties.html

Page 17: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012 17

Olá pessoal, esta é a segunda parte do artigo “Firemonkey – Formu-lário base de cadastro com barra de ferramentas” da revista The Club. Na primeira parte, foi feita a criação do projeto FireMonkey_FormBase com três units, unPrincipal, unFormBase e unPesquisa. Lembrando que a unPesquisa foi adicionada ao projeto apenas a fim de complemento e o artigo para a criação da tela de pesquisa no FireMonkey encontra-se na revista The Club do mês de outubro de 2012 ou na sessão de revistas do site www.theclub.com.br.

O principal foco do primeiro artigo foi à criação e manipulação das funções da barra de ferramentas do formulário base. Adicionamos os componentes de acesso a dados que estarão já configurados ao se herdar o formulário base. Neste artigo iremos adicionar mais alguns métodos co-muns em formulários de cadastro e para finalizar o artigo iremos mostrar como utilizar o formulário base com um banco de dados que criaremos como exemplo com apenas uma tabela. Mãos a obra então, vamos lá.

Criação de métodos para o frmFormBase

No artigo anterior criamos dois métodos de uso específico da barra de ferramentas. Neste artigo vamos criar mais alguns métodos e funções, além é claro de fazer algumas configurações visuais em alguns componentes do frmFormBase.

Primeiramente vamos fazer as configurações mais comuns. Sabemos que para se utilizar um ClientDataSet é necessário que ele esteja aberto, ou ativado. Sabemos também que para motivo de desempenho do sistema é necessário que ao fechar o formulário, não será mais necessário o uso do ClientDataSet, o que indica que teremos que fechá-lo para não sobrecarregar a memória. Percebem-se aqui dois eventos a serem configurados no formulário, um é o evento onCreate e o outro é o evento onClose. Veja na listagem 1 como ficará o código destes eventos.

FireMonkey Formulário base de cadastro com barra de ferramentasparte II

Page 18: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 201218

procedure TfrmFormBase.FormClose(Sender: TObject; var Action: TCloseAction);begin if (cdsBase.State in [dsInsert, dsEdit]) then begin if (MessageDlg(‘Formulário em edição ou inserção, deseja cancelar e fechar?’, TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0) = mrYes) then cdsBase.Close else Abort; end;end;

procedure TfrmFormBase.FormCreate(Sender: TObject);begin cdsBase.Open;end;

Listagem 1 – Codificação dos eventos onClose e onCreate do frmFormBase

Com estes dois métodos criados no formulário base, raramente esta ação terá de ser feita novamente, mesmo quando se tratar de um formulário mestre detalhe, onde se utiliza mais de um ClientDataSet, pois numa relação como esta o ClientDataSet mestre controla a abertura e fechamento do(s) ClientDataSet(s) detalhe.

Bom, agora temos outro método bastante utilizado em conexões com a ferramenta DBExpress, como já sabemos o ClientDataSet armazena os dados temporariamente em memória RAM, ou seja, para gravarmos os dados na base de dados devemos fazer o uso do método ApplyUpDates passando o parâmetro (0 - zero) que representa a quantidade de erros aceita pelo método, neste caso estamos dizendo que não aceitamos nenhum erro e apenas serão salvas as atualizações caso esteja tudo certo referente ao que é exigido pela base de dados. Este método é chamado toda vez que é gravada alguma atualização nos dados manipulados pelo formulário, ou seja, no evento afterPost e afterDelete (depois de gravar e depois de excluir algum registro) do componente cdsBase. Porém vamos fazer de uma forma genérica onde podemos reutilizar o mesmo procedimento para os demais ClientDataSet. Veja na listagem 2 como ficará a chamada do método que irá aplicar as atualizações na base de dados.

procedure TfrmFormBase.cdsBaseAfterDelete(DataSet: TDataSet);begin TClientDataSet(DataSet).ApplyUpdates(0);end;

Listagem 2 – Chamada do método ApplyUpDates do cdsBase

O método ApplyUpDates foi chamado apenas no evento afterDelete do cdsBase, porém, ainda iremos utilizá-lo no evento afterPost. Para isso basta selecionar no evento afterPost do cdsBase o valor ‘cdsBaseAfterDelete’ e dar um duplo clique para confirmar, desta forma este evento fará uso do procedi-mento criado na listagem 2. Isso pode se repetir também nos formulários que receberem a herança do frmFormBase.

O próximo método é uma função que criaremos para realizar a contagem de todos os registros de uma determinada consulta SQL passada como parâ-metro e retornará um número inteiro com a quantidade de registros. Este método é útil numa situação onde se precisa saber se há registros na tabela para realizar alguma ação, porém não podemos utilizar o método RecordCount do cdsBase, pois este pode estar trazendo os registros de uma determinada consulta onde pode ter algum parâmetro. Ou seja, este método realizará uma consulta onde trará realmente todos os registros da consulta sem nenhum parâmetro WHERE. Posteriormente este método será chamado para verificar se há algum registro na tabela após realizar a exclusão de um registro, para poder zerar o generator do Id da tabela caso não haja mais nenhum produto na tabela. Veja na listagem 3 o código desta função denominada ContaRegistros.

function TfrmFormBase.ContaRegistros(sql: string; Con: TSQLConnection): Integer;var query: TSQLQuery;begin query := TSQLQuery.Create(nil); query.SQLConnection := Con; query.Close;

if (sql = ‘’) then query.CommandText := ‘SELECT * FROM ‘ + TABELA else query.CommandText := sql;

query.ExecSQL; Result := query.RecordCount; query.Close; query.Free;end;

Listagem 3 – Codificação da função ContaRegistros

Os parâmetros da função ContaRegistros são ‘sql’ e ‘con’ que represen-tam respectivamente a consulta SQL e a conexão com a base de dados. Uma observação que podemos fazer referente a esta função é que se o parâmetro ‘sql’ for passado vazio, a consulta será feita na tabela informada na variável global TABELA, criada na primeira parte deste artigo, se não faz a consulta pela SQL passada mesmo.

No próximo método será um procedimento que terá como função espe-cífica atualizar o valor do generator passado como parâmetro. Lembrando que para fazer a chamada deste procedimento deve-se antes garantir que

Page 19: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012 19

não haverá nenhum registro na tabela, caso contrário pode dar erro com os valores das chaves primárias podem se repetir. Segue na listagem 4 o código para a implementação deste procedimento.

procedure TfrmFormBase.setGeneratorToZero(gen: string);var query : TSQLQuery;begin query := TSQLQuery.Create(nil); query.SQLConnection := CONEXAO; query.Close; query.CommandText := ‘SET GENERATOR ‘+ gen +’ TO 0’; query.ExecSQL; query.Free;end;

Listagem 4 – Codificação do procedimento setGeneratorToZero

Existem casos em que o uso deste procedimento não seria uma boa ideia, como exemplo num generator que armazena o número de notas fiscais. Por-tanto pode-se criar uma variável global booleana para habilitar ou não o uso do procedimento setGeneratorToZero. Então vamos deixar desta forma, vamos criar uma variável global pública chamada ZERAR_GEN, e no evento onCreate do frmFormBase vamos atribuir o valor dela como False. Veja na listagem 5 a declaração desta nova variável juntamente com as demais variáveis que foram criadas na primeira parte do artigo e também a atribuição do valor false a ela deixando por padrão o uso do procedimento de zerar generator desativado.

public { Public declarations } SQL_PADRAO, TABELA, CAMPO_BUSCA, CAMPO_CHAVE, DESCRICAO_PESQUISA, GEN_NAME : string; FOCO : TObject; CONEXAO : TSQLConnection; ZERAR_GEN : Boolean;

procedure TfrmFormBase.FormCreate(Sender: TObject);begin cdsBase.Open; ZERAR_GEN := False;end;

Listagem 5 – Criação da variável booleana ZERAR_GEN

Bom, até agora temos o procedimento que irá zerar o generator e a variável que será utilizada para habilitar e desabilitar a chamada deste procedimento. Como foi citado anteriormente, este procedimento será realizado apenas se não existir mais nenhum registro na tabela, por isso utilizaremos a função

ContaRegistros para garantir que não aconteça erros e que realmente a tabela esteja vazia. Outra coisa que devemos ter em mente é que este procedimento será chamado depois da exclusão de um registro na tabela, ou seja uma atu-alização, portanto iremos fazer a toda esta codificação no evento afterDelete do componente cdsBase que é onde já foi feita a chamada do método ApplyU-pDates. Veja na listagem 6 como é feita a verificação da variável ZERAR_GEN para a chamada do procedimento setGeneratorToZero.

procedure TfrmFormBase.cdsBaseAfterDelete(DataSet: TDataSet);begin TClientDataSet(DataSet).ApplyUpdates(0);

if (ZERAR_GEN) then begin if (cdsBase.Active = true) and (GEN_NAME <> ‘’) and (Assigned(CONEXAO)) then if (ContaRegistros(‘’, CONEXAO) < 1) then setGeneratorToZero(GEN_NAME); end;end;

Listagem 6 – Chamada do método setGeneratorToZero

Logo após gravarmos as atualizações no banco de dados, verificamos se é para zerar o generator, por padrão a variável ZERAR_GEN será false, então caso queria utilizar este recurso posteriormente nos formulários de cadastro deverá alterar o valor da variável ZERAR_GEN para True em cada formulário que desejar utilizar este recurso. Se o procedimento estiver habilitado, fazemos uma nova verificação, ou seja, para continuar a chamada do procedimento o cdsBase deverá estar ativo, a variável GEN_NAME deverá estar preenchida e por fim a conexão utilizada deverá estar atribuída na variável global CONE-XAO. Caso atenda todos estes requisitos, faremos a última verificação, onde fazemos a chamada da função ContaRegistros, e a partir do retorno da função verificamos se a tabela está vazia ou não. Caso o valor retornado seja menor que 1, fazemos a chamada do método setGeneratorToZero.

Note que foi passado na função ContaRegistros o parâmetro sql em branco, desta forma estaremos fazendo a contagem de registros da tabela principal do formulário, informada pela variável global TABELA. Esta função pode ser utilizada para qualquer consulta SQL válida. Posteriormente mostraremos outro exemplo utilizando a função ContaRegistros.

Levando em consideração que estaremos trabalhando com o ClientDataSet no formulário, outro método que seria comum em formulários de cadastro é o auto-incremento de chaves primárias, que neste caso serão realizados pela aplicação, a fim de atender corretamente a possíveis relacionamentos mestre/detalhe.

Page 20: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 201220

No artigo “FireMonkey - Utilizando Mestre/Detalhe e Formulário de Pes-quisa - Parte I” do mês de setembro de 2012 da revista The Club, foi utilizada em um DataModule, do projeto de exemplo, uma função chamada AutoInc, esta que por sua vez resgata o valor do generator passado como parâmetro e incrementa em 1 o seu valor. Iremos utilizar esta mesma função para este artigo, onde o frmFormBase irá executar a chamada da função AutoInc. Esta revista pode ser encontrada também

Então vamos criar o DataModule para este nosso projeto no menu (File/ New/ Other/ Delphi Files/ DataModule). O nome do DataModule será DM e sua unit será salva no projeto como unDm. O código da função AutoInc é bem simples, veja na listagem 7 a sua implementação.

function TDM.AutoInc(Gen: string; Con: TSQLConnection): Integer;var Sds: TSQLDataSet;begin Sds := TSQLDataSet.Create(nil); Sds.SQLConnection := Con; Sds.Close; Sds.CommandText := ‘SELECT GEN_ID(‘+ Gen +’, 1) AS CODIGO FROM RDB$DATABASE’; Sds.Open; Result := Sds.FieldByName(‘CODIGO’).AsInteger; Sds.Close; Sds.Free;end;

Listagem 7 – Função AutoInc implementada no DM

No DM até o momento é e será só este código. Vamos voltar ao frmForm-Base para o método que realizará o auto incremento de id passado como parâmetro. O nome do procedimento será IncrementaId, e a sua utilização é bem simples, através dos parâmetros que ele recebe, DataSet, FieldId e GEN, executa uma verificação com o estado do DataSet, onde se estiver em inserção realiza a chamada do método AutoInc, passando como parâmetro a conexão atribuída na variável global. Segue na listagem 8 a sua implementação.

procedure TfrmFormBase.IncrementaId(DataSet: TDataSet; FieldId: TIntegerField; GEN: string);begin if (TClientDataSet(DataSet).State = dsInsert) then FieldId.AsInteger := DM.AutoInc(GEN, CONEXAO);end;

Listagem 8 – Codificação do procedimento IncrementaId

Com este último método terminamos a codificação do frmFormBase e o que temos que fazer agora é ver na prática como irá funcionar a utilização deste formulário nos próximos formulários de cadastro.

Banco de dados de exemplo

Bom, primeiro vamos criar uma base de dados simples para facilitar a exemplificação do artigo. Segue na listagem 9 a tabela Veículos de um banco de dados chamado FMX_EXEMPLO.

CREATE TABLE VEICULOS ( ID_VELICULO INTEGER NOT NULL, PLACA VARCHAR (7) CHARACTER SET NONE COLLATE NONE, MARCA VARCHAR (30) CHARACTER SET NONE COLLATE NONE, MODELO VARCHAR (30) CHARACTER SET NONE COLLATE NONE, PRIMARY KEY (ID_VELICULO));

CREATE GENERATOR “GEN_ID_VEICULO”;

Listagem 9 – Tabela de veículos utilizada para exemplificação

Note que o ID da tabela terá o generator de nome GEN_ID_VEICULO.

Estabelecendo a conexão com o banco de dados

Agora no Delphi XE2, abra o DM de nosso projeto iremos adicionar uma conexão com o banco de dados recém criado, neste exemplo foi utilizado o servidor de banco de dados Firebird. Para criar uma nova conexão, acesse a aba DataExplorer do Delphi XE2, localizada logo acima da ToolPalete (palheta de ferramentas). No menu tree-view clique com o botão direito do mouse em cima do nó Firebird e depois em Add Connection, preencha o nome da nova conexão. Depois abra o nó firebird no menu tree-view e clique com o direito do mouse na conexão que acabou de criar e selecione a opção Modify Con-nection, preencha corretamente os campos que indicam respectivamente o caminho físico, o nome de usuário e a senha de acesso do seu banco de dados.

Adicione ao DM um componente TSQLConnection (DBExpress) e nomeie-o Conexão, marque False para a sua propriedade LoginPrompt.

Depois de configurada corretamente a conexão, adicione ao DM um componente TSQLDataSet e aplique a ele o nome sdsVeiculos, vincule-o ao componente de conexão (TSQLConnection), e adicione na propriedade Com-mandText a consulta “SELECT * FROM VEICULOS”, e por fim carregue os seus TFields e configure suas propriedades ProvidersFlags, de forma que a chave primária seja atualizada através da aplicação (pfInUpDate= True, pfInWhere =

Page 21: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012 21

True e pfInKey = True) e os demais TFields apenas com a propriedade pfInU-pdate marcada como True.

Aplicando a herança do frmFormBase

Agora vem a melhor parte, depois de toda esta codificação no formulário base de cadastro, vamos criar um formulário de cadastro de veículos, este que fará a herança do frmFormBase, ou seja, utilizará toda a codificação realizada no mesmo. Acesse o menu (File/ New/ Other) e abrirá a janela New Itens, no menu tree-view clique em Inheritable Items, que está dentro do nó Delphi Projects. Na janela central serão exibidos os formulários do projeto atual, selecione o frmFormBase e depois clique em ok. Veja na figura 1 o exemplo desta ação na janela New Item.

Figura 1 – fazendo a herança do frmFormBase para um novo formulário

Ao clicar em ok, será criada uma nova unit, e aparecerá na tela um formulário idêntico ao frmFormBase, com todos os componentes visuais e os de acesso a dados nele adicionado, note que a sugestão de nome para o formulário não é Form1 como de costume e sim frmFormBase1. Salve a unit como unVeiculos e altere o nome do formulário para frmVeiculos. Vamos adi-cionar a unDm na uses do novo formulário para podermos fazer o acesso ao sdsVeiculos (TSQLDataSet), configurado no DataModule anteriormente, para fazer isso acesse o menu (File/ Use Unit) e selecione a unDm.

Depois de adicionada a unDm, agora basta ligar o dspBase (TDataSetPro-vider) presente no frmVeiculos ao sdsVeiculos do DM através da propriedade DataSet do primeiro. O seguinte passo é carregar os TFields no cdsBase (TClientDataSet), para isso basta clicar duas vezes no componente e clicar com o botão direito do mouse e selecionar a opção Add All Fields. Serão carregados os quatro campos presentes na tabela de veículos, ID_VEICULO, PLACA, MARCA e MODELO.

Nesta etapa já podemos fazer uso de um dos métodos criados no formulá-rio base, o IncrementaId. Selecione o cdsBase e vá à aba Events da janela Object Inspector, e no evento BeforePost (antes de salvar/gravar) dê um duplo clique para abrir sua procedure na unit. Para a utilização do método IncrementaId, basta fazer a sua chamada e passar os três parâmetros, DataSet, FieldId e GEN.

Segue o exemplo da utilização deste método na listagem 10.

procedure TfrmVeiculos.cdsBaseBeforePost(DataSet: TDataSet);begin inherited; IncrementaId(cdsBase, cdsBaseID_VEICULO, GEN_NAME);end;

Listagem 10 – Utilizando o método IncrementaId

Como é de costume, apareceu o cabeçalho da procedure e o bloco begin/end. Note que apareceu também a palavra inherited (herdou/herdado), esta é uma palavra reservada do Delphi, que indica que esta ocorrendo uma herança de classe, ou seja, além dos códigos adicionados na unit atual, serão inter-pretados pelo compilador os códigos ancestrais, neste caso são os códigos da unFormBase. O primeiro parâmetro é o cdsBase o qual terá o ID de um registro incrementado, não se preocupe em verificar se o cdsBase está em estado de inserção, pois esta verificação já feita na unFormBase, o segundo parâmetro é o TField que terá o valor incrementado e por fim o nome do generator, neste foi indicado a variável global GEN_NAME, mas até o momento ela ainda não tem nenhum valor, posteriormente iremos alimentar este valor.

Vamos adicionar ao frmVeiculos os componentes visuais, edits e labels. Adicione quatro TEdit (edtIdVeiculo, edtPlaca, edtMarca e edtModelo) e quatro TLabel. Como o Id deve ser único e será gerado automaticamente, não é interessante que o usuário possa manipular o seu valor, portento altere a propriedade Enabled do edtIdVeiculo para False. Veja na figura 2 como ficarão dispostos os componentes no formulário frmVeiculos.

Figura 2 – Exemplo de disposição dos componentes no frmVeiculos

Como estamos num projeto FireMonkey e iremos fazer acesso a banco de dados, portanto não podemos nos esquecer de usar a tecnologia LiveBindings, que fará a ligação dos componentes de acesso a dados com o s componentes visuais. Como podemos ver na figura 2, a ligação do DataSoruce (dsBase) com o BindScopeDB (BinScopeDBBase) já foi realizada no formulário base, isso indica que não precisaremos mais configurar esta ligação, o que nos resta agora é adicionar os BindLinks para cada componente Edit relacionando-os com seus respectivos campos na base de dados. Para isso clique com o botão direito do mouse no edtIdVeiculo e escolha a opção Link To DB Field, na janela que

Page 22: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 201222

aparecer selecione o campo ao qual deseja ligar o componente, pronto é só isso, agora faça o mesmo com os demais componentes. Para verificar se foram adicionados os Links corretamente, pode conferir através do componentes BindingsList, dando um duplo clique no mesmo, abrirá uma janela onde será listada todas as ligações binding do formulário. Segue na figura 3 a lista de LiveBindings do frmVeiculos.

Figura 3 – Lista de expressões LiveBindings do frmVeiculos

Alimentando as variáveis globais no frmVeiculos

No evento onCreate do formulário frmVeiculos é onde vamos informar os valores das variáveis globais, criadas no frmFormBase, para que este possa manipular corretamente os métodos genéricos. Segue na listagem 11 os valores a serem passados para as variáveis globais do formulário base.

procedure TfrmVeiculos.FormCreate(Sender: TObject);begin inherited; TABELA := ‘VEICULOS’;

// Exemplo de uso da SQL_PADRAO // SQL_PADRAO := ‘SELECT V.*, C.NOME ‘ + // ‘FROM VENDAS V ‘+ // ‘LEFT OUTER JOIN CLIENTES C ‘+ // ‘ON V.ID_CLIENTE = C.ID_CLIENTE’;

CAMPO_CHAVE := ‘ID_VEICULO’; CAMPO_BUSCA := ‘PLACA’; DESCRICAO_PESQUISA := ‘Pesquisa de veículos por placa’; GEN_NAME := ‘GEN_ID_VEICULO’; CONEXAO := DM.Conexao; FOCO := edtPlaca;

// Exemplo para habilitar o método setGeneratorToZero // ZERAR_GEN := True;end;

listagem 11 – Alimentando as variáveis globais no evento onCreate do frmVeiculos

Informamos primeiramente qual a tabela do banco de dados que esta-remos manipulando neste formulário, neste caso é a tabela VEICULOS, mas

poderia ser uma consulta SQL com JOINS trazendo campos inferidos, neste segundo caso devemos informar a consulta SQL na variável SQL_PADRAO. Na variável CAMPO_CHAVE informamos o nome da chave primária da tabela, na variável CAMPO_BUSCA informamos os campo pelo qual será realizado a busca no frmPesquisa, na variável DESCRICAO_PESQUISA informamos a descrição que será exibida ao usuário final referente a pesquisa a ser realizada, neste caso a frese utilizada foi “Pesquisa de veículos por placa”.

Anteriormente utilizamos a variável GEN_NAME no método IncrementaId e agora atribuímos o seu valor com o nome do generator que armazenará o valor da chave primária da tabela de veículos, neste caso o nome é GEN_ID_VEICULO. A variável CONEXAO se faz necessária para a realização do auto-incremento do campo Id, poderíamos ter deixado uma conexão padrão, para não ter que informar toda vez uma conexão, porém limitaríamos o projeto a apenas um Data Module, e não poderíamos por exemplo, separar uma consulta que traga dados apenas para exibir em relatórios de uma consulta que traga os dados para serem manipulados pelo usuário final, ou seja, é interessante ter mais de um Data Module para fazer esta separação, mas isto fica a critério de cada desenvolvedor certo?

Na variável FOCO atribui-se o objeto que será focado caso o DataSet alterne para o estado de inserção ou de edição, neste caso eu vou mandar o foco para o edtPlaca, que é o primeiro campo após o edtIdVeiculo. Muita atenção no objeto ao qual atribuir nesta variável, o foco não pode, por exemplo, ser mandado em um objeto com a propriedade Enabled = False, como é o caso do edtIdVeiculo.

Para finalizar, nas últimas linhas da na listagem 11, eu citei em um comen-tário um exemplo de como habilitar a função que irá zerar o generator caso o usuário realize uma exclusão e após esta exclusão não haja mais nenhum registro na tabela em questão. Por padrão este método não será chamado, e caso haja a necessidade é só habilitá-lo passando o valor True para a variável global ZERAR_GEN.

Não precisa fazer mais nenhuma codificação no formulário de veículos, porém, antes de executar para ver em funcionamento nosso exemplo, é impor-tante lembrar de fazer a configuração do projeto no menu (Project/ Options), onde definiremos a ordem dos formulários a serem criados automaticamente ao executar a aplicação, o DM e o frmPrincipal, os demais formulários deixa-remos para criar dinamicamente em memória. Segue na figura 4 um exemplo de como deve ficar os formulários.

Figura 4 – Project Options

Page 23: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012 23

Agora sim, o projeto será executado com sucesso, basta agora criar um botão no formulário principal que fará a criação e a exibição do frmVeiculos. Veja na figura 5 esta aplicação de exemplo em tempo de execução com alguns registros cadastrados através da aplicação.

Figura 5 – Aplicação de exemplo em tempo de execução

Conclusão

No primeiro artigo abordado como criar o formulário base visando prin-cipalmente a barra de navegação entre registros, foi apresentado os métodos

utilizados para realizar cada ação dos botões da barra de ferramentas e também foram adicionados os componentes de acesso a dados.

Nesta última parte o foco foi nos métodos mais comuns entre formu-lários de cadastro e após realizar toda a codificação no formulário base, foi demonstrado como fazer a herança do mesmo num novo formulário já com a conexão ao banco de dados estabelecida. Por fim foi mostrado uma imagem com a aplicação de exemplo sendo executada.

Procuramos mostrar o quanto de serviço pode ser poupado trabalhando desta forma, neste exemplo criamos apenas um formulário recebendo a heran-ça do frmFormBase, porém, a quantidade de códigos é surpreendentemente menor, bastou apenas fazer a herança e depois preencher as variáveis globais para o novo formulário estar funcionando. Uma outra vantagem desta forma de trabalhar é que cada formulário terá a sua unit mais limpa, apenas com seus códigos específicos mesmo como cálculos ou verificações de campos.

Bom pessoal eu espero que tenham gostado do artigo, eu vou ficando por aqui e até uma próxima. Um grande abraço a todos.

Consultor Técnico The Club.

Sobre o autor

Lucas Vieira de Oliveira

[email protected]

Page 24: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 201224

Seguindo a linha de publicações voltadas à integração de sistemas computacionais a dispositivos externos diversos, apresentamos neste artigo uma abordagem prática para integração de aplicativos a dispo-sitivos biométricos, neste caso específico, dispositivos de leitura de impressões digitais.

Um dos maiores problemas enfrentados hoje em dia em termos de segu-rança em informática é a autenticação de usuários, que implica em garantir que a pessoa que está tentando acessar um sistema é quem ela realmente diz ser.

Na maioria dos sistemas de informação, a autenticidade dos usuários é garantida através de senhas alfanuméricas que devem ser memorizadas pelos usuários. Apesar de ser a forma de autenticação mais difundida na atualida-de, a autenticação por senhas apresenta diversas vulnerabilidades bastante evidentes [Milton 2003].

Primeiramente senhas devem ser memorizadas. Quando não memoriza-das, são comumente anotadas em local nem sempre seguro, ficando assim propensas a cair em mãos erradas. Em segundo lugar, senhas estão também sujeitas a observadores não autorizados durante a digitação.

Devido a estes problemas, técnicas de autenticação baseadas em carac-terísticas biométricas físicas, como impressões digitais, exames de retina e da palma das mãos vêm sendo cada vez mais utilizadas para garantir a autentici-dade dos usuários [Riha 2000].

Neste artigo serão abordados os conceitos básicos envolvendo a leitura, cadastro e autenticação de impressões digitais utilizando dispositivo de har-dware FDU01 (Interface USB e resolução de 500DPI para uso em aplicações PC) da empresa Nitgen e banco de dados Borland Interbase 6.01 Freeware Opensource para o desenvolvimento de aplicações completas, com base na tecnologia de autenticação biométrica.

A escolha específica do dispositivo da empresa Nitgen visa a exemplificação

dos conceitos teóricos apresentados através de uma implementação prática e detalhada dos mesmos, não constituindo portanto restrição ao uso e aplicação dos mesmos em hardwares de outros fabricantes.

O artigo apresenta toda a estrutura de software e hardware utilizada e tem por objetivo familiarizar o usuário com os conceitos básicos que envolvem este tipo de integração, fornecendo ao leitor uma visão ampla sobre o tema, suas características, desafios e principais problemas. Para a leitura e entendi-mento deste artigo não se faz necessário um vasto conhecimento a respeito do processo de integração de dispositivos biométricos, uma vez que a API para implementação de tal integração é vastamente documentada pelo fabricante e acompanha diversos aplicativos de demonstração.

Biometria - Conceitos gerais

Biometria é o conjunto de métodos automatizados para reconhecer uma pessoa com base em características comportamentais ou fisiológicas.

São exemplos de características comportamentais: Escrita manual, assi-natura, gestos.

São exemplos de características físicas: Face, impressões digitais, geo-metria da mão, íris.

Este artigo é focado no que diz respeito à autenticação biométrica utili-zando a característica física da impressão digital.

A autenticação de um usuário pode ser feita através de informações que o usuário conhece, como senhas, ou através de dispositivos que o usuário possua, como cartões magnéticos, códigos de barras ou chaves. O que acontece é que em todos os casos citados, os dispositivos de autenticação podem ser perdidos ou roubados. A biometria vem para tentar solucionar este problema, pois, ao contrário das outras técnicas, ela se baseia no que você é, ou seja, em informações contidas em seu corpo ou com base no seu comportamento, dificultando e muito o processo de fraude.

BiometriaUma abordagem prática para impressão digitalPOR VICTORY FERNANDES E MURILO PLINIO

Page 25: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012 25

Tipicamente o processo de uso de tecnologias biométricas passa por duas etapas bem definidas, o Registro e a Validação, conforme mostrado na Figura01.

Figura 01: Etapas de Registro e Verificação dos processos biométricos.

Durante o processo de registro, ocorre: [1] a captura dos parâmetros biométricos, utilizando-se para tanto o dispositivo de captura adequado, [2] a extração das características biométricas para a geração do padrão biométrico dos dados lidos e [3] o armazenamento do padrão biométrico gerado em uma estrutura de banco de dados para consulta posterior.

Durante o processo de validação, ocorre [1] a captura dos parâmetros biométricos utilizando-se para tanto o dispositivo de captura adequado, [2] a extração das características biométricas para a geração do padrão biométrico dos dados lidos e [3] a comparação do padrão lido com as informações arma-zenadas no banco de dados de padrões biométricos.

A precisão de um sistema biométrico é dada pela curva ROC (Receiver Operating Characteristics), mostrada na Figura02.

Figura02: Curva ROC (Receiver Operating Characteristics) define a precisão de um sistema biométrico. [Adilson]

Na curva ROC mostrada na Figura02, o eixo dado pela variável FAR – False Accept Rate, representa o número de indivíduos aceitos que não deveriam ser aceitos, e o eixo dado pela variável FRR – False Reject Rate, representa o nú-mero de indivíduos rejeitados e que não deveriam ter sido rejeitados [Adilson].

A análise da curva na Figura02 nos leva à classificação de alguns perfis de aplicativos, são eles:

Aplicativos policiais: desejam identificar o padrão biométrico mesmo à custa de examinar um alto número de falsas aceitações, alto valor de FAR. O objetivo é analisar todos os prováveis suspeitos.

Aplicativos de alta segurança, devem ter baixa taxa de falsa aceitação, FRR, mesmo que rejeite muitos indivíduos. O objetivo é assegurar o máximo de con-fiabilidade na informação de que a pessoa que terá acesso é a pessoa correta.

Aplicativos civis devem trabalhar num ponto ótimo de baixo FAR e baixo FRR. Devem-se identificar corretamente os padrões, mas sem acarretar alto custo de análise computacional ou alta taxa de releitura por rejeição.

Biometria por impressões digitais

No caso da autenticação biométrica por impressões digitais, o dispositivo de captura capta e analisa padrões na pele da ponta dos dedos, gerando um padrão biométrico baseado em uma das principais abordagens utilizadas: casamento de minúcias (método policial), casamento de padrões retilíneos, padrões moiré ou uso de ultra-som.

Uma coisa interessante a ser observada sobre impressões digitais é que ela não se modifica durante todo o curso da vida. Portanto, o desenho digital de uma criança, por exemplo, sofre apenas uma alteração de tamanho em função de seu crescimento, de forma semelhante a uma ampliação fotográfica [Seama 2005].

Algumas das vantagens do uso da autenticação biométrica por impressões digitais quando comparada com outras formas de autenticação biométrica são: baixo custo do hardware, tamanho reduzido dos dispositivos de captura e fácil integração dos dispositivos com a aplicação.

A seguir na Tabela01 é apresentado um comparativo das principais tec-nologias de biometria existentes.

A autenticação por impressão digital é hoje um dos meios mais difundidos de autenticação biométrica, principalmente devido ao relativo baixo custo de seus dispositivos, que hoje já se encontram embutidos em mouses, teclados e notebooks permitindo a implementação de uma série de aplicativos baseados em suas funcionalidades.

A API Nitgen

O conjunto de funções oferecidas pelo fabricante é disponibilizado em dois níveis: API Primitiva e API em Alto Nível.

Para o estudo e uso das APIs - Application Programming Interfaces dis-ponibilizadas faz-se necessário o conhecimento de algumas terminologias, dentre as quais destacam-se:

• FIR- Fingerprint Identification Record: O FIR é o registro de iden-tificação de impressão digital. Um FIR é composto pelos campos de formato,

Tabela01: comparativo das principais tecnologias de biometria existentes

Page 26: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 201226

cabeçalho e dados da impressão digital e armazena todas as informações necessárias à identificação biométrica.

• Payload: Espécie de chave associada a um FIR utilizada para trans-ferência criptografada da identificação. É uma informação do tipo senha ou nome do usuário.

Caso necessário, o conhecimento das demais terminologias pode ser obtido através do manual oferecido pelo fabricante.

Algumas aplicações são atendidas pelas funções em alto nível, tais como aplicativos stand-alone simples que não possuem conectividade web ou va-lidação através de estrutura cliente/servidor. As funções da API em alto nível são implementadas utilizando as funções da API Primitiva e tem por propósito ser mais amigáveis e fáceis de usar.

FunçõesdaAPIemAltoNívelFunção Descrição

Enroll Usada para extrair pontos característicos de uma leitura e armazená-los. Esta função pode também receber um FIR antigo e gerar um novo registro (FIR) com um Payload associado.

Verify Usada para confrontar uma impressão FIR lida com infor-mações previamente armazenadas. O resultado é retornado pela função e, se existir um Payload associado, este também é retornado.

Funções da API Primitiva

Já aplicações que, por exemplo, capturam dados da leitura num cliente e as confrontam com informações dos usuários num servidor, exigem funções descritas na API Primitiva. A API Primitiva permite o acesso direto a todos os recursos do equipamento, sendo necessário também um maior conhecimento para utiliza-la.

Funções da API Primitiva

Função DescriçãoCapture Utilizada para capturar uma imagem do dispositivo e

extrair pontos que formarão um modelo. Diversas amos-tras são utilizadas para gerar tal modelo. Uma vez que o processo de captura é finalizado, a função “Capture” retorna um registro de identificação (FIR) como resulta-do. A aplicação é quem determina o propósito da função que pode ser para registro, verificação ou identificação. Este propósito é passado como parâmetro e gravado no cabeçalho do registro FIR.

VerifyMatch Confronta um novo registro de identificação FIR com os dados previamente armazenados. O resultado da comparação é retornado pela função.

CreateTemplate Processa uma amostra para construir um registro de FIR. Pode receber como entrada tanto um FIR inter-mediário como um definitivo. Esta função pode também receber um FIR antigo e gerar um novo registro (FIR).

Uma forma de acesso a essas funções é a NBioBSP.dll oferecida pelo fabricante e que implementa todas as funções descritas acima. Para desen-volvedores que não se sentem familiarizados com o uso de dlls, é interessante ressaltar que o fabricante também disponibiliza bibliotecas de classes para desenvolvimento em ambiente .Net e módulo NBioBSP COM. Entretanto, neste artigo vamos nos ater à descrição do uso do dispositivo através da NBioBSP.

dll. Maiores informações sobre COM e .Net podem ser encontradas na docu-mentação disponibilizada com o produto.

Exemplo de integração com dispositivo biométrico

Agora que o leitor está familiarizado com a API dos dispositivos biométricos da Nitgen, apresentaremos o aplicativo desenvolvido para demonstrar o uso desta tecnologia em conjunto com aplicações Delphi.

A aplicação proposta visa demonstrar de forma prática o processos básicos de Registro e Validação descritos no tópico “Biometria - Conceitos gerais” e demonstrado na Figura01 através de um sistema de cadastro e autenticação de funcionários.

Inicialmente criamos a tabela no banco de dados que irá receber as informações dos funcionários tais como nome, foto, bem como informações recebidas do dispositivo que incluem a identificação do dedo e da impressão digital do usuário codificada em formato texto. A tabela deve ser criada conforme segue.

CREATE TABLE “FUNCIONARIO” ( “CODIGO” INTEGER NOT NULL, “NOME” VARCHAR(50), “FOTO” VARCHAR(255), “USERID” VARCHAR(10), “FINGERID” VARCHAR(10), “SAMPLENUMBER” VARCHAR(10), “TEXTENCODEFIR” BLOB SUB_TYPE 0 SEGMENT SIZE 80, PRIMARY KEY (“CODIGO”));

Uma vez criado o banco de dados, partimos para a criação do sistema. Na Figura03 temos a tela inicial do sistema, onde se pode cadastrar as informações de nome e foto do funcionário no banco de dados através de um DBGrid.

Figura03: Tela inicial do sistema. Cadastro do funcionário e registro da impressão digital.

Após salvar as informações cadastradas de nome e foto do funcionário, devemos cadastrar as informações relativas aos dados biométricos do funcio-nário. Para isso basta selecionar o funcionário desejado no DBGrid e clicar o botão “Cadastra Digital”.

Neste momento surge a tela mostrada na Figura04. Esta tela faz parte da API Nitgen e permite que o usuário selecione o dedo a ser utilizado na captura dos dados biométricos do funcionário.

Page 27: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012 27

Após selecionar o dedo desejado clicando em um dos dez círculos azuis disponíveis, surge a tela mostrada na Figura05. Ao entrar nesta tela, o sistema passa a aguardar a leitura de uma impressão digital e os leds do dispositivo piscam até que o funcionário coloque o dedo sobre o leitor.

Ao colocar o dedo sobre o leitor o sistema faz uma primeira amostra dos dados biométricos do funcionário, conforme mostrado na Figura06, e passa a aguardar uma segunda leitura para comparar com a primeira leitura e confirmar a validade das informações lidas.

Neste momento podem acontecer duas situações distintas.

1. A segunda amostra pode não guardar semelhanças suficientes com a primeira, seja por má leitura, ou seja, porque os dedos lidos na primeira e na segunda amostragem não coincidem. Nesse caso é apresentada a tela da Figura07 informando erro na comparação das leituras.

2. A segunda amostra coincide com a primeira. Nesse caso o sistema apresenta por alguns instantes a tela da Figura08 indicando que está gerando a codificação da impressão digital, e logo em seguida apresenta a tela da Figura09 que indica o fim do processo de registro de informações biométricas.

Após o término do processo o aplicativo é responsável por editar o registro

da base de dados armazenando as informações codificadas do funcionário nos seus respectivos campos.

A codificação em formato texto da digital é armazenada no campo TEX-TENCODEFIR, do tipo Blob, pois as informações armazenadas neste campo serão semelhantes aos dados mostrados a seguir, obtidos a partir da leitura de uma digital.

AQAAABQAAAAkAQAAAQASAAMAZAAAAAAAIAEAAOl32Zcf5RvZO-H6OK9sI5dIXgZGNqOeM6TOD/CG2g6P/YF4YtIsOuYtcftn7FjUSA7pRgJIR-xNeoIFxBR6w5rUhwqlzSh4E5*YY*NhxPB3WcU4b7WevT33uuw0q6AkvNF17uMw7GriI8/HsIhmAVxW4N4umjWx93f3UgA4/sDhZMQPM01wQeM8Eh8BE4DT*FUp1LzObHxOb7eKK37qZJIr8e*0kNBg1/ENmFmQOielZDl0Cxbe*c*N36ZxLs5x*34YpKndHycG1mU9hOhzKj5xdL2VPWefI3lijDXp6RDyXL*1ro5nrbNU2PLjVF8QIYIVjhlK4K/aM24JqX0q0qSpGqEpIqupakzgW4VCk-34BI2yJQlf0MoUME1uoPSxiQUmg

O código executado no evento OnClick do botão “Cadastra Digital” é conforme segue.

//Cadastra a informação da digital no BDprocedure TForm1.Button1Click(Sender: TObject);var i, j : integer; nUserID : integer; szFir : wideString; str : widestring; temp : pchar; objResult: variant;begin nUserID := 0; nUserID := StrToInt(ibdataset1[‘CODIGO’]);

//Abre porta do dispositivo objDevice.Open(NBioAPI_DEVICE_ID_AUTO_DETECT);

if objDevice.ErrorCode <> 0 Then ShowMessage(‘Erro ao tentar acessar dispositivo’);

//Captura dados do dispositivo objExtraction.Enroll(nUserID, 0);

if objExtraction.ErrorCode <> NBioAPIERROR_NONE Then ShowMessage(‘Erro de captura’);

objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT);

szFir := objExtraction.TextEncodeFIR;

//Registra FIR no BD objIndexSearch.AddFIR(szFir, nUserID);

if (objIndexSearch.ErrorCode = NBioAPIERROR_NONE) Then begin for i := 1 to objIndexSearch.Count do begin objResult := objIndexSearch.Item[i];

ibdataset1.edit;

ibdataset1[‘UserID’] := objResult.UserID; ibdataset1[‘FingerID’] := objResult.FingerID; ibdataset1[‘SampleNumber’] := objResult.SampleNumber; ibdataset1[‘TextEncodeFIR’] := objExtraction.TextEncodeFIR;

ibdataset1.post; IBDataSet1.Transaction.CommitRetaining; end;

Figura04: Seleção do dedo cuja digital será registrada

Figura05: Primeira amostragem da digital a ser cadastrada.

Figura06: Segunda amostragem da digital a ser cadastrada.

Figura07: Erro na comparação das duas amostragens.

Figura08: Amostra-gens aceitas, codificação da impressão digital

Figura09: Fim do pro-cesso de registro.

Page 28: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 201228

end else ShowMessage(‘Erro’);end;

Depois de concluída a etapa de cadastro e registro das informações biométricas do funcionário, avançamos para a etapa de validação, mostrada na Figura10.

Figura10: Etapa de validação. Autenticação das impressões digitais.

Ao clicar no botão “Verifica Digital”, surge a tela apresentada na Figura11. Esta tela faz parte da API Nitgen e permite a leitura dos dados biométricos do funcionário.

Ao entrar nesta tela, o sistema passa a aguardar a leitura de uma impressão digital e os leds do dispositivo piscam até que o funcionário coloque o dedo sobre o leitor.

Ao colocar o dedo sobre o leitor, o sistema faz a leitura dos dados biomé-tricos do funcionário, codifica os dados lidos e compara com as informações cadastradas previamente no banco de dados.

Figura11: Leitura da impressão digital para autenticação.

Neste momento o sistema deve ser capaz de distinguir entre as impres-sões digitais de funcionários cadastrados e não cadastrados, [1] apresentando mensagem “funcionário não cadastrado”, caso a impressão digital lida não coincida com nenhuma das impressões digitais contidas no banco de dados ou [2] caso a impressão digital lida coincida com a impressão digital de algum funcionário, apresentar a foto do respectivo funcionário cuja impressão digital acaba de ser lida. Conforme mostrado na Figura12.

Figura12: Validação aceita, funcionário encontrado.

O código executado no evento OnClick do botão “Cadastra Digital” é conforme segue.

//Executa validação do usuárioprocedure TForm1.Button2Click(Sender: TObject);var szFir : wideString; str : wideString; ListItem : TListItem ; nFirst, nLast : Integer;begin //Abre porta de acesso ao dispositivo objDevice.Open(NBioAPI_DEVICE_ID_AUTO_DETECT);

if (objDevice.ErrorCode <> NBioAPIERROR_NONE) and (objDevice.ErrorCode <> 258) then //Erro se cancel na leitura anterior e executar novamente begin str := objDevice.ErrorDescription; ShowMessage(‘Erro ao abrir dispositivo biométrico’); Exit; end;

objExtraction.Capture(NBioAPI_FIR_PURPOSE_VERIFY);

if objExtraction.ErrorCode = NBioAPIERROR_NONE then begin objDevice.Close(NBioAPI_DEVICE_ID_AUTO_DETECT);

if objDevice.ErrorCode <> NBioAPIERROR_NONE then begin ShowMessage(‘Erro ao fechar dispositivo biométrico’); Exit; end;

szFir := objExtraction.TextEncodeFIR;

//Localiza informação do usuário no componente nFirst := GetTickCount; objIndexSearch.IdentifyUser(szFir, 5); nLast := GetTickCount;

label1.Caption := IntToStr(nLast - nFirst) + ‘ms’;

if objIndexSearch.ErrorCode <> NBioAPIERROR_NONE then begin ShowMessage(‘Erro ao identificar usuário’); Exit; end;

//Localiza usuário no BD if ibdataset1.Locate(‘userID’, objIndexSearch.UserID, []) then begin //showmessage(‘usuário localizado’); if fileexists(ExtractFileDir(Application.exename) + ‘\’ + ibdataset1[‘foto’]) then image1.Picture.LoadFromFile(i

Page 29: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012 29

bdataset1[‘foto’]); end; end else ShowMessage(‘Erro de execução’);end;

Além dos códigos apresentados, executados durante os processos de registro e validação, devemos também: [1] no evento OnCreate do Form, instanciar os objetos para acesso ao dispositivo e verificar a comunicação com o dispositivo, [2] no evento OnShow do Form, carregar o componente com as informações contidas no banco de dados e [3] no evento OnClose do Form, finalizar o uso dos componentes instanciados. O código fonte dos eventos citados é mostrado a seguir.

procedure TForm1.FormCreate(Sender: TObject);var str: string;begin //Cria objetos NBioBSP objNBioBSP := CreateOleObject(‘NBioBSPCOM.NBioBSP’);

objDevice := objNBioBSP.Device; objExtraction := objNBioBSP.Extraction; objIndexSearch := objNBioBSP.IndexSearch;

//Verifica inicializacao dos objetos criados if not objIndexSearch.ErrorCode = NBioAPIERROR_NONE then ShowMessage(‘Erro na inicialização’);

Caption := Caption + ‘ - BSP Version : v’ + objNBioBSP.MajorVersion + ‘.’ + objNBioBSP.MinorVersion;end;

procedure TForm1.FormShow(Sender: TObject);var nUserID : integer; szFir : wideString;begin ibdataset1.First;

while not ibdataset1.Eof do

begin nUserID := ibdataset1[‘userID’]; szFir := ibdataset1[‘TextEncodeFIR’];

//Registra FIR no componente objIndexSearch.AddFIR(szFir, nUserID);

if not ibdataset1.Eof then ibdataset1.next; end;end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin objDevice := 0; objExtraction := 0; objIndexSearch := 0; objNBioBSP := 0;end;

Conclusões

Com este artigo abordamos conceitos gerais de biometria bem como toda a teoria e prática necessária ao desenvolvimento de aplicações integradas a dispositivos de autenticação biométrica por impressões digitais da Nitgen. No entanto, apesar das informações apresentadas envolverem dados específicos do fabricante, os conceitos abordados são semelhantes no que diz respeito a comunicação com dispositivos de autenticação biométrica por impressões digitais, sendo assim o conhecimento adquirido pode ser de grande utilidade na implementação da comunicação com outras marcas e modelos.

O aplicativo de demonstração apresentado não cobre todos os comandos disponíveis na API do dispositivo, mas abrange todos os principais conceitos necessários para que você se familiarize com a tecnologia e inicie o seu trabalho a partir deste ponto. Afinal você nunca poderia imaginar que seria tão fácil agre-gar valor aos seus aplicativos através da integração de soluções de biometria.

Referências[Riha 2000] Riha, Zdenek; Matyas, Vaclav. Biometric authentication systems. FI

MU Report Series, RS-2000-08, November 2000. [Milton 2003] Milton Roberto Heinen, Fernando Santos Osório. Biometria Com-

portamental: Pesquisa e desenvolvimento de um sistema de autenticação de usuários utilizando assinaturas manuscritas. UNISINOS - Universidade do Vale do Rio dos Sinos.

[Seama 2005] Saiba mais sobre a Biometria e como ela será usada na instituição. Faculdade Seama, 2005.

[Adilson] Prof. Adilson Gonzaga. Biometria, a senha que não se esquece.

Linkswww.nitgen.com.brNitgen Soluções biométricas.

Professor do Departamento de Engenharia da UNIFACS, Engenheiro Mestrando em Redes de Computadores, e desenvolvedor sócio da TKS Soft-ware - Soluções de Automação e Softwares Dedicados. Pode ser contatado em [email protected], ou através dos sites www.igara.com.br – www.igara.com.br/victory

Sobre o autor

Victory Fernandes

[email protected]

estudante de Engenharia Mecatrônica, Técnico em Informática e desen-volvedor da TKS Software - Soluções de Automação e Softwares Dedicados. Pode ser contatado em [email protected]

Sobre o autor

Murilo Plínio

[email protected]

Page 30: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 201230

VerticalHorizontal

Page 31: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012

Page 32: The Club - megazine - The Club - O maior clube de ... · Banco de Dados Delphi C# Android Comunicado Seguindo nossa tradição, o The Club estará em recesso do dia 17 de dezembro

dezembro 2012