the club - megazine · ado.net entity framework ... framework” utilizando a linguagem c#, sendo...

32
março 2013

Upload: trantram

Post on 19-Nov-2018

277 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013

Page 2: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013

Page 3: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013 03

Autor: Thiago C. Montebugnol

17

24

Autor: Lucas de OliveiraÍndice

Dicas The Club

29

Desafio The Club

30

Editorial

04

13

Autor: Hamden Vogel

05

Autor: Luciano Pimenta

ADO.NETEntity Framework

TMaskeditHVUm TMaskedit em Potencial para Automação de Cadastros – Parte 2

HelpMakerCriando arquivos de ajuda

AndroidConhecendo a API do Google Maps

Page 4: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março201304

Delphi é marca registrada da Borland International, as demais marcas citadas são registradas

pelos seus respectivos proprietários.

Thiago Montebugnoli - Editor [email protected]

Editorial

Olá amigos do The Club!

É com muita satisfação e alegria que preparamos nossa revista em mais um mês deste ano. Procuramos cada vez mais tratar de assuntos diversos envolvendo todas as atuais tecnologias. Temos hoje, uma revista e um su-porte um tanto mesclado abrangendo tecnologias .Net, Delphi e Android. Conseguimos graças aos senhores diversificar e atingir vários tipos de mercado. Neste ano de 2013 também demos um grande passo na parte de diagramação e layout da revista disponibilizando uma agradável leitura aos nossos associados. Quanto aos artigos deste mês, nosso consultor técnico Lucas de Oliveira, sempre atento às solicitações dos usuários do suporte, criou um artigo diferente e sempre aplicado no desenvolvimento, o uso de uma ótima ferramenta gratuita para montagem de arquivos de ajuda, o “HelpMaker”. Neste artigo ele cria um exemplo prático descrevendo todas as suas principais funcionalidades. Hamden Vogel, nosso mais novo colunista, continua nos demonstrando as funções de seu componente “TMaskeditHV”, muito indicado para uso na automação de Cadastros. Luciano Pimenta, nos proporciona a partir deste mês artigos relacionados ao “ADO .Net Entity Framework” utilizando a linguagem C#, sendo que neste tem como intuito explicar assuntos relacionados ao tipo de mapeamento objeto relacional (O/R). Eu continuo escrevendo artigos referentes ao Sistema Android, des-crevendo todas as etapas para obter e usar a API do “Google Maps”, servindo de base para qualquer plataforma que desejar implementá-la.

Para finalizar a revista, contamos com uma série de Dicas e Macetes mais utilizados no suporte e no dia-a-dia, não se esquecendo do divertido Desafio The Club, que brincando conseguimos aprender e reforçar o estudo sobre diversos assuntos relacionados à programação.

Fico por aqui, um forte abraço e até o mês que vem!

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 2013

Diretor TécnicoMarcos César Silva

DiagramaçãoVitor M. Rodrigues

DesignVitor M. Rodrigues

RevisãoCintia Amaral

ColunistasHamden Vogel

Lucas de OliveiraLuciano Pimenta

Thiago Cavalheiro MontebugnoliMarcos César Silva

JuninhoJosé Antonio P. M. de Paula

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.

Editorial

Page 5: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013 05

O assunto mapeamento objeto relacional (O/R) sempre foi algo “nebuloso” para alguns desenvolvedores e um pouco de receio. Afinal, deixar que a ferramenta seja responsável por executar os comandos SQL para inserir, alterar, remover registros no banco é algo que muitos ficam com a pulga atrás

da orelha, pois querem ter o “controle” sobre essas ações.

As facilidades que temos nesse tipo de mapeamento é bastante interessan-te. Tiramos o conceito de banco de dados relacional e começamos a trabalhar com um modelo de dados. Com isso, podemos trabalhar com herança (sim, isso é possível), mapear relacionamentos entre as entidades etc.

Nosso exemplo será bem simples. Teremos um sistema de vendas. Com ca-dastros de vendedores, clientes e fornecedores (que no nosso modelo será uma PESSOA). Teremos assim, entrada de mercadorias para dar baixa no estoque (a funcionalidade de entrada de produtos pode ser implementada por você).

Acredito que com isso, podemos ter uma base importante para conhecer-mos o funcionamento do Entity Framework (EF).

Conhecendo o Entity Framework

A ferramenta EF esta a cada nova versão ganhando aprimoramentos. Usaremos neste artigo a versão 5.0 que é totalmente independente do Visual Studio. O que isso significa? Que você pode usar essa versão com versões diferentes do Visual Studio. Usaremos a versão 2012 (Express) e precisaremos apenas “instalar” a ferramenta no nosso projeto.

Assim, se tivermos projetos com versões diferentes, não seremos afetados com alterações da ferramenta. Crie um novo projeto Windows Forms (se quiser, pode ser ASP.NET). Vamos separar em camadas nosso projeto.

Teremos os formulários no projeto Windows Forms, o modelo em uma Class Library e também um Class Library para as classes que usaremos. Acesse o menu Tools>Library Package Manager>Package Manager Console. No console, digite: “Install-Package EntityFramework” (Figura 1).

ADO.NETEntity Framework

Figura 1. Instalando o EF pelo Visual Studio

Se nenhum erro ocorrer, você receberá a mensagem que o pacote do EF foi instalado com sucesso.

Nota: Caso a opção do menu anterior não esteja presente em seu ambiente, acesso o menu Tools>Extension Manager, procure por NuGet Package Manager e faça a instalação do mesmo.

Criando o modelo

Vamos fazer o passo contrário do que estamos acostumados. Sempre começamos a nossa aplicação criando o banco de dados relacional. Tabelas, campos, views, procedures etc. Agora, vamos começar pelo modelo, e após o Visual Studio gera os scripts para a criação do banco de dados.

Crie uma Class Library na Solution e adicione um ADO.NET Entity Model (Figura 2).

Veja a figura 2. Na próxima tela, podemos escolher se vamos criar um modelo vazio

(nossa opção nesse artigo) ou vamos criar um modelo baseado em um banco de dados já existente. Clique em Finish. Será mostrado o Entity Data Model

Page 6: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março201306

Designer, onde trabalharemos as entidades do modelo.

Clique com o botão direito e escolha a opção Add>Entity e preencha conforme a Figura 3.

Figura 3. Criando a entidade PESSOA

Criamos uma entidade chamada PESSOA, ela será responsável por definir as informações do vendedor, fornecedor e cliente. Mas você deve estar pen-sando, mas no banco eu crio uma tabela para cada entidade ou apenas uma tabela com um campo indicando o tipo de cada pessoa. Sim, mas teremos algo mais legal de utilizar: herança.

Continuando para que você possa entender melhor, a entidade PESSOA, terá atributos comuns para as outras entidades (código, nome, endereço etc). As entidades herdadas terão atributos específicos para a mesma, como: data de nascimento (cliente), valor de limite (fornecedor) e comissão (vendedor).

Clique em OK e será mostrada a entidade pessoa. Para criar outros atributos, clique na entidade e escolha Add>Scalar property. Dê o nome da propriedade de “sNmPessoa” e mude as características da mesma na janela de propriedades (mude Max Length para 50 e Nullable para True). Crie uma nova propriedade chamada “sDsEndereco” (configurando as mesmas propriedades da anterior).

Agora vamos criar outra entidade que herdará de PESSOA. Execute o mesmo passo anterior, mas no editor, em Base type, escolha PESSOA. Veja que ao fazer isso, as opções para configuração ficam desabilitadas. Clique em OK.

Note que temos a nova entidade com uma ligação com PESSOA. Crie uma propriedade chamada “tDtNascimento” (em Type escolha DateTime em Nulla-ble escolha True). Faça a mesma configuração para as entidades FORNECEDOR e VENDEDOR, adicionando os campos da Tabela 1 para as respectivas entidades.

Endidade Nome Propriedade ValorFORNECEDOR tDtCadastro Type DataTime

Nullable False

nVlLimite Type Decimal

Nullable False

Precision 18

Scale 2

VENDEDOR tDtAdmissao Type DateTime

Nullable False

nVlComissao Type Decimal

Nullable False

Precision 18

Scale 2Tabela 1. Atributos das entidades FORNECEDOR e VENDEDOR

Veja na Figura 4 o modelo até agora criado.

Figura 4. Modelo com suas entidades

Agora vamos criar as entidades: PRODUTO, VENDA e VENDA_ITENS. Veja na Tabela 2 a configuração dessas entidades (elas não herdam de nenhuma outra entidade).

Figura 2. Criando o modelo de dados

Page 7: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013 07

Entidade Nome Propriedade ValorPRODUTO nCdProduto KeyProperty

sNmProduto Type String

Nullable False

MaxLentght 50

nVlProduto Type Decimal

Nullable False

Precision 18

Scale 2

nQtdeMin Type Decimal

Nullable False

Precision 18

Scale 2

nQtdeAtual Type Decimal

Nullable False

Precision 18

Scale 2

VENDA nCdVenda KeyProperty

tDtVenda Type DateTime

Nullable False

nVlTotal Type Decimal

Nullable False

Precision 18

Scale 12

VENDA_ITEM nCdItemVenda KeyProperty

nQtdeItem Type Decimal

Nullable False

Precision 18

Scale 12

nVlItem Type Decimal

Nullable False

Precision 18

Scale 12Tabela 2. Atributos das entidades do nosso exemplo

Como você pode ter notado, não criamos os campos na entidade VEN-DA_ITEM referente a venda e ao produto. Vamos fazer isso, usando a associação entre as entidades. Na ToolBox escolha o item Association. Clique sobre a entidade VENDA e arraste o mouse até a entidade VENDA_ITEM.

Veja que a associação foi criada e temos as propriedades de navegação nas respectivas entidades. Repita o mesmo processo para a associação do produto em VENDA_ITEM, relacionando com PRODUTO. Com isso, finalizamos nosso modelo.

Você pode ter ficado em dúvida, por que não existe um campo para o relacionamento entre as entidades. Estamos trabalhando com Objetos, no banco, teremos os respectivos campos. Veja o resultado final na Figura 5.

Figura 5. Modelo final e suas entidades

Se quisermos modificar a associação, basta clicar sobre a mesma e alterar suas propriedades.

Criando o banco de dados

Precisamos agora, baseado nesse modelo, criar o nosso banco de dados. O Visual Studio gera os scripts necessários para isso. Clique com o botão direito no editor e escolha a opção Generate Database from Model.

Será aberta uma janela para conexão com o banco de dados. O Visual Studio não cria o banco de dados, apenas o script dos objetos, portanto você deve criar o database antes. Após isso, voltando a opção anterior, escolha o banco no wizard de conexão.

Clique em Next e veja o script para execução no banco de dados (Figura 6).

Figura 6. Script para criar as entidades no banco de dados

Clique em Finish para criar o arquivo SQL. Execute o script na base de dados. Quando quisermos validar o mapeamento do banco com o modelo, basta clicar com o botão direito no editor e escolha Validate. Caso ocorra algum erro a janela Error List mostraria os problemas encontrados.

Caso alguma alteração precise ser feita, o mais interessante é criar o campo no banco de dados e usar a opção Update Model from Database no editor do

Page 8: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março201308

Listagem 01: Classe base para as classes de cadastro

Listagem 02: Classe CLIENTE

modelo. Caso criarmos apenas no modelo, será necessário refazer o script SQL para executarmos no banco.

Criando as classes

Agora precisamos criar as classes que vão auxiliar na manipulação dos dados. Essas classes são semelhantes as características de um controller do padrão MVC muito falado atualmente. Temos o modelo com as entidades, vamos criar o controller com as classes e as views serão nossos formulários.

Crie uma nova Class Library na Solution e adicione uma pasta chamada “DAL”. Para explicar o que faremos: teremos classes para manipular cada entidade. Essas classes terão acessado ao modelo para executar os métodos do EF para manipular suas entidades (métodos CRUD).

Teremos também classes que “conversam” com as classes de negócio, apenas chamando seus métodos no formulário. Assim, separamos nosso projeto em uma melhor organização. Agora vamos criar para cada entidade, a sua respectiva classe, responsável por manipular os dados da entidade.

Mas antes, vamos criar uma classe base que será herdada por cada classe da entidade. Crie uma classe chamada “BaseClass” e preencha com o código da Listagem 1.

public class BaseClass<T>{ public virtual bool Salvar(bool bInsert, T objeto) { return false; }

public virtual bool Excluir(T objeto) { return false; }

public virtual List<T> PesquisarTodos() { return null; }

public virtual List<T> PesquisarPorDescricao(string sDescricao) { return null; }

public virtual T PesquisarPorCodigo(int nCdObjeto)

{ return default(T); }}

Veja que a classe base espera um objeto (T), que será substituído pela entidade que vamos usar na classe herdada. Agora sim, vamos criar a classe que irá manipular a entidade CLIENTE. Na Listagem 2 temos a implementação dos métodos Salvar e Excluir.

public class Cliente: BaseClass<CLIENTE>{ public override bool Salvar(bool bInsert, CLIENTE objeto) { using (ModeloDB db = new ModeloDB()) { if (bInsert) db.AddToPESSOA(objeto); else { db.PESSOA.Attach(objeto); db.ObjectStateManager.ChangeObjectState( objeto, EntityState.Modified); } return (db.SaveChanges() > 0); } }

public override bool Excluir(CLIENTE objeto) { using (ModeloDB db = new ModeloDB()) { PESSOA pessoa = (from p in db.PESSOA.OfType<CLIENTE>() where p.nCdPessoa == objeto.nCdPessoa select p).FirstOrDefault(); db.DeleteObject(pessoa);

Page 9: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013 09

Listagem 03: Métodos de pesquisa

return (db.SaveChanges() > 0); } }

Note que a classe herda da classe base que fizemos e ao digitar o método Salvar, basta digitar “public override”, dar um espaço e o Visual Studio mostra os métodos que podem ser implementados, já preenchendo o parâmetro (T) com a classe indicada no BaseClass.

Na implementação do Salvar, verificamos o valor do parâmetro bInsert para chamar o método que inclui um novo objeto ou atualiza o objeto passa-do por parâmetro. Para o Excluir, fizemos uma consulta LINQ para retornar o objeto que passamos por parâmetro para em seguida chamar o método que exclui a entidade.

Vale uma dica aqui, como CLIENTE, VENDEDOR e FORNECEDOR herdam de PESSOA, sempre vamos pesquisar a entidade PESSOA, mas precisamos indicar ao EF que estamos pesquisando o tipo que queremos, usando o código:

db.PESSOASet.OfType<CLIENTE>()

Veja que os dois métodos retornam um bool, assim, verificamos o retorno do SavChanges (inteiro) que indica a quantidade de registros afetados pela inserção ou atualização. Agora, na Listagem 3 temos a implementação dos métodos de pesquisa.

public override List<CLIENTE> PesquisarTodos(){ using (ModeloDB db = new ModeloDB()) { return (from p in db.PESSOA.OfType<CLIENTE>() select p).ToList(); }}

public override List<CLIENTE> PesquisarPorDescricao(string sDescricao){ using (ModeloDB db = new ModeloDB()) { return (from p in

db.PESSOA.OfType<CLIENTE>() where p.sNmPessoa.ToUpper().Contains(sDescricao.ToUpper()) select p).ToList(); }}

public override CLIENTE PesquisarPorCodigo(int nCdObjeto){ using (ModeloDB db = new ModeloDB()) { CLIENTE cliente = (from p in db.PESSOA.OfType<CLIENTE>() where p.nCdPessoa == nCdObjeto select p).FirstOrDefault();

if (cliente != null) return cliente; else throw new Exception(“Registro não encontrado.”); }}

O método PesquisarTodos, simplesmente retorna todos os registros da entidade (CLIENTE). No PesquisarPorDescricao usamos o Contains (método de tipo String) onde comparamos o valor de sNmPessoa com o parâmetro do método, com os dois valores em maiúsculo, para que a comparação seja a mais precisa possível.

Para o método que retorna o tipo da entidade, filtramos a mesma pelo código, onde verificamos se o registro foi encontrado e em caso negativo, emitimos uma mensagem de erro. Com a classe Cliente criada, você pode adaptar as classes Fornecedor, Vendedor e Produto.

Classes com relacionamento

Como podemos ver no modelo, a classe VENDA tem relacionamento com VENDA_ITENS, mas sabemos que para incluir um item na tabela filha, precisamos ter um registro na tabela pai. Então, como podemos fazer isso? Não precisamos fazer nada, o EF faz isso pra gente.

Como temos relacionamento basta preencher, por exemplo, a entidade VENDA e simultaneamente os itens, usando a propriedade VENDA_ITEM pre-sente na entidade VENDA. Após, basta adicionar a entidade (igual ao código do Salvar) e os filhos e pai serão inseridos. Para a classe Venda não teremos o método para pesquisar por descrição. A principio, não precisamos imple-mentar as classes dos itens, já que preencheremos os mesmos pela entidade

Page 10: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março201310

Listagem 04: Classe de exemplo para a classe de negócio do cliente

relacionada (VENDA).

As classes que criamos, são nossas classes de dados (poderíamos dizer que essas classes seriam as entidades do EF), agora vamos criar as classes de negócios, que nada mais são do que classes que vão chamar os métodos das classes de dados e quando necessário realizar validações e regras de negócios.

Na Listagem 4 temos um exemplo da classe Cliente.

...using EntityController.Dados;using EntityModel;

namespace EntityController.Negocio{ public class Cliente { private Dados.Cliente objCliente = new Dados.Cliente();

public bool Salvar(bool bInsert, CLIENTE objeto) { return objCliente.Salvar(bInsert, objeto); }

public bool Excluir(CLIENTE objeto) { return objCliente.Excluir(objeto); }

public List<CLIENTE> PesquisarTodos() { return objCliente.PesquisarTodos(); }

public CLIENTE PesquisarPorCodigo(int nCdObjeto) { return objCliente.PesquisarPorCodigo(nCdObjeto); }

public List<CLIENTE> PesquisarPorDescricao(string sDescricao)

{ return objCliente.PesquisarPorDescricao(sDescricao); } }}

Vale lembrar que essas classes de negócio, servem para fazermos as regras de negócio da aplicação, como por exemplo: validação, campos com valores default, baixa de quantidade em estoque, adição de quantidade quando de compras etc.

Note que temos classes com mesmo nome, mas com namespace diferen-tes, isso é importante para não ocorrer erro. Poderíamos usar nomes diferentes, fica à seu critério de padronização. Veja na Figura 7 temos a estrutura do nosso projeto com todas as classes criadas.

Figura 7. Estrutura de arquivos do nosso projeto

Criando os formulários

Para os cadastros, vamos usar a técnica de herança visual, onde já fiz um artigo sobre o mesmo na The Club. Caso você não possa ver o artigo, indico o mesmo que esta publicado no meu site: http://www.lucianopimenta.com/post.aspx?id=193. Não iremos nos ater nessa funcionalidade do sistema, indico a leitura do referido artigo para tirar as dúvidas necessárias.

Page 11: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013 11

Listagem 05: Métodos do formulário base, implementado no formulário de cadastro

Veja na Figura 8 temos formulário base do nosso cadastro.

Figura 8. Formulário base de cadastro

Vamos implementar o cadastro de cliente e os outros são muito seme-lhantes (produto, vendedor e comprador), portanto podem ser facilmente adaptados. Veja na Listagem 5 os métodos virtuais implementados.

private CLIENTE entidade = new CLIENTE();private EntityController.Negocio.Cliente ngCliente = new EntityController.Negocio.Cliente();...public override void PreencheEntidade(){ entidade.nCdPessoa = (lblCodigo.Text == “” ? 0 : int.Parse(lblCodigo.Text)); entidade.sNmPessoa = txtNomeCliente.Text; entidade.sDsEndereco = txtEndereco.Text; entidade.tDtNascimento = tDtNascimento.Value;}

public override void PreencheCadastro(){ EntityController.Negocio.Cliente cliente = new EntityController.Negocio.Cliente(); entidade = cliente.PesquisarPorCodigo(_nCdGenerico);

lblCodigo.Text = entidade.nCdPessoa.ToString(); txtNomeCliente.Text = entidade.sNmPessoa; txtEndereco.Text = entidade.sDsEndereco; tDtNascimento.Value = entidade.tDtNascimento.Value;}

public override void Pesquisa(){ List<CLIENTE> lista = ngCliente.PesquisarPorDescricao(txtPesquisa.Text);

lvPesquisa.Items.Clear();

foreach (CLIENTE cliente in lista) { ListViewItem item = new ListViewItem(cliente.nCdPessoa.ToString()); item.SubItems.Add(cliente.sNmPessoa);

lvPesquisa.Items.Add(item); }}

public override bool Salvar(){ return ngCliente.Salvar(sStatus == StateCadastro.scInserindo, entidade);}

public override bool Excluir(){ return ngCliente.Excluir(entidade);}

Veja que temos os métodos virtuais implementados chamando os respec-tivos métodos das classes criadas anteriormente (Pesquisa, Salvar etc). Atente para a variável privada entidade, que será preenchida quando da pesquisa e ela será a responsável por informar para a classe os dados alterados, inseridos etc.

Veja na Figura 9 o cadastro de cliente em execução.

Como já comentado, os cadastros de fornecedor, vendedor e produto, são praticamente iguais ao do cliente (claro, com exceção de campos diferentes). Então, deixo como algo para você praticar.

Page 12: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março201312

Conclusões

Vimos nesse artigo uma ideia inicial de como funciona a ferramenta de mapeamento objeto relacional Entity Framework. A ferramenta esta em constante atualização e foi divulgado que a ferramenta se tornará open source, mas sem descontinuar suas atualizações.

Figura 9. Cadastro de cliente funcionando

Existem outras técnicas, como usarmos somente classes das entidades, sem o modelo. Veremos exemplos disso em próximos artigos. No próximo artigo, vamos continuar alguns exemplos e vamos ver como usar relatórios no nosso exemplo.

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

www.lucianopimenta.net

Luciano PimentaLuciano Pimenta (NOVO DOMINIO: www.lucianopimenta.com) é desenvolvedor Delphi/C#

para aplicações Web com ASP.NET, Windows com Win32 e Windows Forms com .NET. Palestrante da 4ª edição da Borland Conference (BorCon) e da 1ª Delphi Conference.

É MVP Embarcadero, grupo de profissionais que ajudam a divulgar o Delphi no mundo. Atualmente é desenvolvedor da SoftDesign fábrica de softwares em Porto Alegre-RS.

Autor de mais de 90 artigos e de mais de 600 vídeos aulas publicadas em revistas e sites especializados, além de treinamentos presenciais e multimídias. É consultor da FP2 Tecnologia (www.fp2.com.br) onde ministra cursos de programação e banco de dados.

Sobre o autor

Page 13: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013 13

Código-fonte da verificação das seleções (itens selecionados/checkados)

Estamos de volta nesta edição para continuar o assunto que inicializamos na edição anterior que é o TMaskeditHV.

Se você perdeu a primeira parte deste artigo confira a edição de fevereiro e dique a par.

Bem, vamos dar continuidade ao assunto.

Demo 05: Exibindo Dois Formatos de Combobox no TMaske-ditHV

Agora o próximo demo mostrará o quão fácil é a exibição dos dois forma-tos de Combobox no componente; os formatos cbftDefault e cbftCheckList da propriedade ComboboxFormate. Definitivamente, não há dificuldades; o componente sempre esperará o evento OnkeyPress da tecla Enter para obter o(s) dado(s) selecionado(s) e então exibi-lo(s). Se está configurado para cbftDe-fault, então é mais fácil ainda; por exemplo, para obter o índice basta utilizar o método (função que retorna um integer) getIndex; segue um resumo abaixo:

Formato ComboboxFormate Como obter o índice sele-cionado (no caso de seleção múltipla, checkado)

cbftDefault GetIndex

cbftCheckList GetTextAtCheckListPosition(i)

Figura 05: Ilustração do Demo 05, exibindo a seleção formato cbftDefault

TMaskeditHVUm TMaskedit em Potencial para Automação de Cadastros

Parte 2

Figura 05: Ilustração do Demo 05, exibindo a seleção formato cbftCheckList

Figura 05: Ilustração do Demo 05, exibindo a seleção formato cbftCheckList (continuação)

procedure TForm1.Button1Click(Sender: TObject);begin //==> combobox default => ShowMessage(MaskEditHV1.Text + ‘ GetIndex ‘ + IntToStr(MaskEditHV1.GetIndex));end;

procedure TForm1.

Page 14: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março201314

Button2Click(Sender: TObject);var i: integer;begin//==> combobox tipo checkList => (abaixo) => if not Assigned(MaskEditHV2.customComboCheckList) then Exit;

for i := 0 to MaskEditHV2.customComboCheckList.Items.Count - 1 do if MaskEditHV2.customComboCheckList.IsChecked(i) then ShowMessage(‘Get Text at Index ‘ + MaskEditHV2.GetTextAtCheckListPosition(i) + ‘ GetValue at Index ‘ + IntToStr(MaskEditHV2.GetIndexAtCheckListPosition(i)));

end;

Com isso as opções de seleção podem ser utilizadas de maneira em que o desenvolvedor julgar mais apropriada, aplicando o método que mais lhe convier na maior facilidade e produtividade, ocultando implementações mais compli-cadas abstraindo, e disponibilizando um nível mais alto para utilização em uma aplicação real – utilize e observe sua produtividade. E fácil de ser estendido aperfeiçoando o código-fonte. Quem nunca pensou em algo útil, sutil e fácil de ser exibido em um form, obtendo-se os itens checkados e validando-os?

Pequenas e importantes validações: 100% TMaskeditHV

Esta parte do artigo tem a finalidade de demonstrar as facilidades para validações do componente. Vamos aplicar na prática, em um exemplo descrito abaixo passo a passo:

1 – Coloque um componente MaskeditHV no form;2 – Altere a propriedade “formate” para “mskftDate”. O componente

deverá se “autoformatar” para o tipo data (ver figura logo abaixo);3 – Altere a propriedade “CheckEmptyDate” para “True”. Fazendo isto, o

componente não vai deixar que uma data fique em branco;4 – Adicione um TMemo para o form. É apenas para simular a passagem

de campos, poderia ser qualquer outro componente que recebesse foco (TEdit, TCombobox, etc).

5 – Rode a aplicação, clique no TMaskeditHV para receber o foco, e com ele vazio, tente clicar no TMemo: o componente emitirá a mensagem de “Data Inválida” (porque ela está vazia) e prenderá o foco nele (ver figura abaixo). Essa mensagem também é customizada.

Segue abaixo as principais mensagens de validação:

Figura 06 – ff Mensagem de “Data Inválida” – texto padrão

Figura 07 – Mensagem de Data Inválida – texto personalizado

Figura 08 – Mensagem de Texto não preenchido completamente (personalizado)

Figura 09 – Mensagem de Seleção de Datas utilizando o componente do Windows TMonthCalendar

Page 15: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013 15

Código-fonte.

Código-fonte.

O componente já faz validação de campo obrigatório a ser preenchido quando está em branco. Isso é definido principalmente no método DoExit (sobrecarregado) que gera o evento OnExit, ativado quando o foco for deixado. Além disso, também temos a opção de se exibir um calendário automático quando for pressionada a tecla F1, desde que a propriedade ShowF1Date estiver ativa. O usuário pode selecionar a data e teclar Enter ou dar um duplo-clique no calendário para fechá-lo e retornar a data selecionada no componente. Tudo isso sem nenhuma linha de código.

Formato Monetário

O campo formato monetário também é suportado pelo MaskeditHV, formatando itens com ponto flutuante, opcionalmente recebendo o nome da moeda padrão como entrada. Este formato já está validado, não recebendo dados diferentes do tipo float. Segue o fonte abaixo desta validação:

if fCheckMoney then begin if (Key in [‘0’..’9’,Chr(VK_BACK)]) then begin // limita-se a 23 caracteres senão haverá um erro na função StrToInt64() if (key in [‘0’..’9’]) and (Length(Trim(TMaskEditHV(Self).Text))>23) then key := #0;

Texto2 := ‘0’; Texto := Trim(TMaskEditHV(Self).Text)+Key; for i := 1 to Length(Texto) do if Texto[i] in [‘0’..’9’] then Texto2 := Texto2 + Texto[i];

if key = chr(vk_back) then Delete(Texto2,Length(Texto2),1);

// formato o texto que depois será colocado no MaskEditHV if fShowCurrencyString then Texto2 := FormatFloat(‘R$ #,0.00’,StrToInt64(Texto2)/100) else

Texto2 := FormatFloat(‘#,0.00’,StrToInt64(Texto2)/100);

TMaskEditHV(Self).Text := Texto2; TMaskEditHV(Self).SelStart := Length(Texto2); end;

Figura 10 – Exemplo de formatação de tipo monetário

Validando formatos integer e float

Finalmente, são duas propriedades do componente (MaskInteger e Mask-Float) que realizam estas funcionalidades; validando respectivamente estas duas críticas. Importante pois evita o tempo dispendioso do programador de validar em todos os KeyPress as críticas para estes dados. Segue o fonte das declarações destas duas propriedades abaixo:

property MaskInteger: Boolean read fMaskInteger write SetMaskInteger default false;property MaskFloat: Boolean read fMaskFloat write SetMaskFloat default false;

Tabela de Validações do TMaskeditHV

Segue abaixo um “resumo” de todos os critérios de validações de formatos do componente:

Tipo de Dado Fomato Validação Dampo Vazio

Validação Campo Inválido

Data 99/99/9999 Faz Faz

Data/Hora 99/99/9999 99:99 Faz Faz

Hora 99:99 Faz Faz

CPF 999.999.999-99 Faz Faz

CNPJ 99\.999\.999\/999-99 Faz Faz

CEP 99.999-999 Faz Faz

Email Tem que ter o “@” e o “.” Faz Faz

Profissão Alfanumérico Faz Não Faz

Escolaridade Alfanumérico Faz Não Faz

Page 16: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março201316

Moeda (R$)0,00 Faz Faz

Telefone (99)9999-9999 ou (999)9999-9999

Faz Não Faz

Customizável Alfanumérico Faz Não Faz

Cidade Alfanumérico Faz Não Faz

Estado Alfanumérico Faz Não Faz

Conclusão

A minha intenção foi mostrar algo comum mas de uma forma melhor e mais eficiente, para ser mais produtivo para o programador. Economizando código e gerando mais qualidade traduz em mais comodidade, menos tempo de manutenção e mais performance para os sistemas. Tudo pode ser reapro-veitado, expandindo o componente em novos formatos ou gerando novos meios de carregamento de seus xml’s internos, por exemplo, dentre outras coisas também.

[email protected]

Hamden VogelAnalista de Sistemas pós-graduado em Engenharia de Software pela

UPIS e Programador Delphi com larga experiência desde 2000, tem de-senvolvido e vendido softwares em Delphi para a África e Estados Unidos, além do mercado nacional. Colaborou com dicas e componentes para sites especializados em Delphi. Também desenvolve em outras linguagens como C/C++, ASP, PHP e .NET.

Sobre o autor

Page 17: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013 17

Em se tratando do Google, uma empresa que dispensa comen-tários e vem se tornando uma das maiores do mundo no seu ramo de negócio, sempre nos disponibilizou inovações tecno-lógicas e de ponta. Um dos recursos que podemos englobar no desenvolvimento para Android seria o uso das denominadas

“APIs” (Application Programming Interface ou Interface de Programação de Aplicativos), em poucas palavras, uma “API” seria a forma que temos de nos comunicar com as funções pré-programadas pelo fabricante, no nosso caso o Google. Neste artigo abordarei a “API” do “Google Maps”, sendo que a mesma nos permite a criação de mapas com locais definidos, diversos tipos de con-trole como o de Zoom, tipos de mapas, geração de rotas, implementação de pesquisas, entre outras coisas.

Trabalharemos com a versão 1.0, mas é importante salientar que o próprio Google já disponibilizou outras versões com algumas funcionalida-des a mais que discutiremos em artigos futuros. Reforçando, este artigo irá abranger todas as etapas desde a obtenção, cadastro e acesso da versão 1.0 (que por sinal está muito estável) , ou seja, este artigo não servirá de base para versões superiores desta API.

Antes de começarmos a programar, teremos que passar por um processo um tanto burocrático e chato. Todo acesso ao servidor do Google exige uma Identificação (uma chave única de acesso) para evitar múltiplos acessos desne-cessários. Para obtermos esta chave devemos informar outra chave presente em nossa aplicação Android, denominada chave de Debug. Em seguida des-creverei detalhadamente estas duas etapas.

1-) Obtendo o certificado digital MD5

Ao executar algum projeto desenvolvido no emulador do Eclipse a chave de debug deverá ser encontrada por padrão no diretório:

- Windows Seven: C:\Users\<user>\.android\debug.keystore- Windows XP: C:\Documents and Settings\<user>\.android\debug.

keystore

<user> deverá ser entendido como a pasta do usuário. Caso não encon-

AndroidConhecendo a API do Google Maps

tre neste diretório recomendo conferir no Eclipse clicando no item de Menu “Window/Preferences/Android/Build” e na opção “Default Debug Keystore” poderá conferir o diretório em questão. Ver Imagem 01 para maiores detalhes.

Figura 01: Diretório Padrão “debug.keystore”.

A próxima etapa executaremos o comando “KeyTool” no ”prompt” do DOS para descobrir o que desejamos, o certificado MD5. É neste exato momento que usaremos o diretório padrão descoberto anteriormente. O comando “KeyTool” é um programa instalado junto ao JDK. Para isto execute a linha de código no diretório Bin do Java, Veja a seguir:

C:\Arquivos de Programas\java\jdk1.7.0_01\bin>keytool –list -v -keys-tore C:\Users\Thiago\.android\debug.keystore

Caso necessite informar alguma senha de armazenamento de chaves deixe em branco pressionando “Enter”. Aparecerá uma mensagem informativa e logo em seguida diversos tipos de certificados. Localize a linha “(MD5 do certifica-do)” e anote esta seqüência alfanumérica de 47 caracteres. Ver Imagem 02.

Page 18: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março201318

Figura 02: Obtendo o certificado MD5.

Trecho da listagem mais importante:

***************** Advertência **********************

Fingerprints do certificado:

MD5: 11:04:EC:BE:C9:72:DC:B2:3D:B3:25:AA:BB:CC:DD:EE

****************************************************

Este certificado digital é único, ressaltando que cada desenvolvedor deverá possuir o seu.

2-) Obtendo a chave de registro da API “Google Maps”

Primeiramente é necessário ter um usuário e senha no Google para ob-termos a chave de registro. Segue o link para acesso

https://developers.google.com/maps/documentation/android/v1/maps-api-signup?hl=pt-BR

O próprio site nos informa a existência de outras versões da API, mas neste caso estaremos utilizando a versão 1.0 sendo necessário seguir os passos adiante. Leia atentamente os termos e condições de uso marcando a opção “I have read and agree with the terms and conditions” para aceitar os termos determinados. Na opção “My certificate’s MD5 fingerprint” insira o certificado MD5 obtido anteriormente e para finalizar esta etapa clique no botão “Generate API Key”. Ver Imagem 03.

Figura 03: Gerando a Chave de registro da API “Google Maps”.

Na próxima tela teremos uma mensagem informativa indicando a chave válida para todos os aplicativos assinados com o certificado digital MD5 e um exemplo de uso no em um layout XML. Esta chave deverá possuir 40 caracteres alfanuméricos, Ver Imagem 04 para maiores detalhes.

Figura 04: Obtendo a Chave de registro.

Conhecendo as Classes

1-) com.google.android.maps.MapActivity

MapActivity é a classe base da API Google, possui o código para gerenciar as necessidades de qualquer atividade que apresenta um “MapView” incluin-do o gerenciamento do ciclo de atividades do aplicativo como: OnCreate(), OnResume(), OnPause() e OnDestroy().

2-) com.google.android.maps.GeoPoint

Uma classe imutável representando um par de latitude e longitude, arma-zenados como números inteiros. Os principais métodos são: getLatitudeE6() e o getLongitudeE6() que retornam a latitude e Longitude deste “GeoPoint” em “microdegrees” (graus * 1E6).

A notação “microdegrees” se refere a um grau multiplicado por 1E6 e apenas numérico, sem decimais. O número 1E6 é a mesma coisa que 1.000.000, onde o 6 significa que existem 6 zeros à esquerda.

Exemplo de conversão: int latitude = (int) (latitude*1E6);

3-) com.google.android.maps.MapController

Esta classe disponibiliza recursos para controlar a navegação pelo mapa, além do controle de detalhamento. Os principais métodos são: ZoomIn() e ZomOut() Servindo para aumentar e diminuir a visualização da área centralizada no mapa, setZoom(int level) para indicar o nível de detalhe de visualização do mapa e o setCenter(Geopoint point) centraliza a visualização do mapa na coordenada informada.

4-) com.google.android.maps.MapView

Page 19: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013 19

Código-fonte.

Código-fonte.

A Classe MapView encapsula todo o código necessário para realizar a comunicação com o GoogleMaps, por este motivo que esta classe recebe como parâmetro no seu construtor a chave de licença para utilização do ser-viço, sendo seus principais métodos o getController() que retorna um objeto MapController permitindo executar controle de zoom e navegação pelo mapa e setBuiltInZoomControls() recebe um valor booleano para habillitar/desabilitar controles de zoom clicando no mapa.

Criando um exemplo Prático

Depois de entendermos algumas das principais classes, iremos por a mão na massa criando um exemplo para carregar o Mapa do Google e alterar suas coordenadas pela latitude e longitude nos mostrando o lugar de destino. Antes de tudo, para trabalhar com a API do Google Maps é necessário possuir instalado o pacote “Google Play Services” localizado na aba “Extras” e “Google Api” na aba da versão do Android em questão (Para este exemplo foi usado a versão 2.2). Para executar esta tarefa abra o “Android SDK Manager” fazendo a instalação destes pacotes. Ver Imagem 05.

Figura 05: Instalação dos Pacotes.

Faremos um pouco diferente dos outros artigos, usaremos a biblioteca “Google Api”, instalado anteriormente, os passos são os mesmos, alterando apenas este detalhe. Clique em “File/New/Android Project” preenchendo com as seguintes configurações:

Em “Project name” defina como: “Google_api_v1”, logo em seguida em “Contents” marque o item “Create new Project in workspace”. Utilizamos a plataforma 2.2 deixando como padrão o Build Target como “Google APIs”. Nas propriedades defina um nome para aplicação em “Application Name” como “Google_api_v1” e para o pacote como “pct.Google_api_v1”. Marque o item “Create Activity” e em “Min SDK Version” use a versão 8. Clique em “Finish” para encerrar esta etapa, Ver Imagem 06.

Veja a figura 6.

Alterando o arquivo “AndroidManifest”

No caso do “Google Maps”, deveremos dar permissão ao aplicativo para acesso a internet usando a tag “uses-permission” e acesso a biblioteca com a “uses library”. Estas configurações serão realizadas dentro do arquivo de configuração “AndroidManifest.xml”.

Para Permissão de acesso a internet:

<uses-permission android:name=”android.permission.INTERNET” />

Para permitir acesso a biblioteca do Google Maps:

<uses-library android:name=”com.google.android.maps” />

Segue em seguida a listagem completa:

<?xml version=”1.0” encoding=”utf-8”?><manifest xmlns:android=”http://schemas.android.com/apk/res/android” package=”pct.Google_maps” android:versionCode=”1” android:versionName=”1.0”> <uses-permission android:name=”android.permission.INTERNET” /> <uses-sdk android:minSdkVersion=”8” /> <application android:icon=”@

Figura 06: Configurações Iniciais.

Page 20: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março201320

Código-fonte.drawable/icon” android:label=”@string/app_name”> <uses-library android:name=”com.google.android.maps” /> <activity android:name=”.Google_mapsActivity” 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>

Criando o lay-Out

A tela deverá possuir 2 TextViews, 2 EditTexts, 1 Button e 1 MapView dispostos na tela. Ver Imagem 07.

Figura 07: Lay-Out de exemplo.

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” > <LinearLayout android:id=”@+id/linearLayout4” android:layout_width=”match_parent” android:layout_height=”wrap_content” android:weightSum=”1”> <LinearLayout android:id=”@+id/linearLayout3” android:orientation=”vertical” android:layout_height=”wrap_content” android:layout_width=”168dp”> <TextView android:layout_width=”wrap_content” android:text=”Latitude:” android:layout_height=”wrap_content” android:id=”@+id/txtLatitude”> </TextView> <EditText android:layout_width=”150dp” android:id=”@+id/edtLatitude” android:layout_height=”wrap_content”> </EditText> </LinearLayout> <LinearLayout android:id=”@+id/linearLayout1” android:orientation=”vertical” android:layout_width=”match_parent” android:layout_height=”match_parent”> <TextView

Page 21: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013 21

Código-fonte.

Código-fonte.

Código-fonte.

android:layout_width=”wrap_content” android:text=”Longitude:” android:layout_height=”wrap_content” android:id=”@+id/txtLongitude”> </TextView> <EditText android:layout_width=”150dp” android:id=”@+id/edtLongitude” android:layout_height=”wrap_content”> </EditText> </LinearLayout> </LinearLayout> <Button android:text=”Localizar” android:id=”@+id/btnLocalizar” android:layout_width=”116dp” android:gravity=”center” android:layout_gravity=”center” android:layout_height=”35dp” android:onClick=”Localizar”> </Button> <com.google.android.maps.MapView xmlns:android=”http://schemas.android.com/apk/res/android” android:id=”@+id/mapview” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:clickable=”true” android:apiKey=”0AOvUFOH7B4e1mBLmq1cEkgCMwk_AABBC_CDDEE”/> </LinearLayout>

A parte que devemos dar uma ênfase maior seria o local onde inserimos a chave da Api obtida anteriormente passando o valor através da tag “apiKey”, confira abaixo:

android:apiKey=”0AOvUFOH7B4e1mBLmq1cEkgCMwk_AABBC_CDDEE”

Codificando o exemplo

Explicarei detalhadamente todas as etapas efetuadas, sendo que o pri-meiro passo seria importar as bibliotecas necessárias.

import android.os.Bundle;import android.view.View;import android.widget.EditText;import com.google.android.maps.GeoPoint;import com.google.android.maps.MapActivity;import com.google.android.maps.MapController;import com.google.android.maps.MapView; public class Google_mapsActivity extends MapActivity { private GeoPoint ponto; private MapView mapView; private EditText edtLatitude, edtLongitude;

A classe principal herdará da MapActivity utilizando a cláusula “extends”. A variável “ponto” controlará as coordenadas do mapa, a “mapView” encapsula todo o código necessário para realizar a comunicação com o GoogleMaps usando o método GetController(). Já o “edtLatitude” e “edtLongitude” para trabalharmos com os valores de latitude e longitude.

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); InicializaListeners(); mapView.setBuiltInZoomControls(true); }

No evento OnCreate() executaremos o método “InicializaListeners” para atribuir as variáveis utilizadas ao decorrer do aplicativo e passamos um valor “true” no método “setBuildZoomControls()”. Este responsável por habilitar o controle de Zoom ao clicar em qualquer lugar do mapa.

public void InicializaListeners() { mapView = (MapView)

Page 22: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março201322

Código-fonte.

Código-fonte.

findViewById(R.id.mapview); edtLatitude = (EditText) findViewById(R.id.edtLatitude); edtLongitude = (EditText) findViewById(R.id.edtLongitude); }

Inicialização das variáveis atribuídas pelo “id” dos componentes.

public void Localizar(View v) { double latitude = Double.parseDouble(edtLatitude.getText().toString());double longitude = Double.parseDouble(edtLongitude.getText().toString()); ponto = new GeoPoint((int)(latitude * 1e6), (int)(longitude * 1e6)); MapController mControler = mapView.getController(); mControler.animateTo(ponto); }

O método Localizar() está fazendo referência ao botão criado anteriormen-te, sendo que o mesmo irá obter os valores da latitude e longitude, usando uma variável do tipo “GeoPoint()” realizando as transformações necessárias. Para aplicar as localizações usaremos um objeto do tipo “MapController”.

@Override protected boolean isRouteDisplayed() { return false; }

Finalmente temos o método sobrescrito “isRouteDisplayed()” que retorna um booleano para informar se algum tipo de rota está sendo visualizada. Este método é obrigatório em se tratando da classe “MapActivity”.

}

Podemos conferir o exemplo em “Run-Time” na Imagem 08.

Figura 08: Exemplo Localizando pela Latitude e Longitude.

Ao clicar sobre o mapa temos o controle de Zoom para (+) ou para (-). Ver Imagem 09.

Figura 09: Controle de Zoom.

Page 23: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013 23

Conclusões

No desenvolvimento para o Sistema Android podemos integrar muitas funcionalidades interessantes, como por exemplo o uso desta API do Google Maps. Procurei neste artigo explorar todas as etapas para implementar os recursos desta poderosa API criada pelo Google. Estes mecanismos estão cada vez mais presentes nos softwares atuais de dispositivos móveis, abrindo um leque de possibilidades ao desenvolvedor Móbile e também Web. Fica aí a dica meus amigos, um abraço e até o mês que vem!

Referênciashttp://developer.android.com/reference/

[email protected]

Thiago Cavalheiro Montebugnoliadora aprender novas tecnologias. Formado pela Faculdade de Tecnologia de Botucatu

– SP (FATEC), já desenvolveu softwares utilizando a plataforma .NET, Delphi junto com Banco de Dados SQL Server e Firebird. Atualmente trabalha no Centro de Processamento de Dados da Prefeitura Municipal de Itaí-SP é colunista mensal da Revista The Club Megazine e é consultor Técnico do The Club. Possui as seguintes certificações: MCP - Microsoft Certified Professional, MCTS - Microsoft Certified Technology Specialist, MCAD - Microsoft Certified Application Developer e MCSD - Microsoft Certified Solution Developer.

Sobre o autor

Page 24: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março201324

Olá pessoal, este mês vamos apresentar uma ótima ferra-menta para criar arquivos de ajuda, o HelpMaker. Sabemos que quanto mais recursos nosso software tiver, mas atrativo será aos olhos de nossos clientes. O arquivo de ajuda é um recurso essencial para um sistema e pode evitar que o

usuário tome atitudes erradas com relação às informações do sistema.

Conhecendo o HelpMaker

O HelpMaker é um software Freeware, ou seja, um software gratuito (livre de licença). É um programa utilizado para criar arquivos de ajuda (WinHelp ou HTMLHelp) para aplicações. Centraliza todas as informações num projeto e após compilá-lo gera os arquivos a serem acoplados junto a alguma aplicação, ou mesmo podem ser utilizados de forma separada.

O seu instalador pode ser encontrado em sites populares de downloads. A versão do HelpMaker que iremos utilizar para este exemplo é a 7.4.4 Beta Release. Pode ser instalado em computadores com Windows desde o Windows 98 até o atual Windows 8.

Para instalar o HelpMaker basta seguir o padrão americano (Next, Next, Next, Install).

Criando a aplicação de exemplo

Antes de partimos para o HelpMaker vamos criar uma aplicação irá fazer a conversão de quilômetros em milhas.

Abra o Delphi XE2, ou outra versão,e crie um novo projeto através do menu (File / New / VCL Forms Application - Delphi). Salve o projeto em um diretório do computador e nomeie a primeira unit como unPrincipal. Altere a propriedade Name do formulário para frmPrincipal (Importante: guarde bem as propriedades Name dos objetos do formulário, pois serão utilizadas no projeto do HelpMaker).

Adicione ao frmPrincipal os componentes dispostos na tabela 1 e os dis-

HelpMaker Criando arquivos de ajuda

ponibilize no frmPrincipal como mostra o exemplo na figura 1. Configure as propriedades Name dos componentes como dispostos na tabela 1.

Objeto Name FunçãoTedit edtKM Receber o valor em quilômetros

Tedit edtMilhas Exibir o resultado da conversão

TListView listConversoes Exibir uma lista com as últimas conversões

Tbutton btnConverter Realizar o cálculo da conversão (1 milha= 1.609 KM)

Tbutton btnNovo Preparar a tela para uma nova conversão

Tbutton btnSair Sair do sistemaTabela 1 – Lista de componentes do frmPrincipal

Figura 1 – Exemplo do layout do frmPrincipal

Não será necessário fazer nenhuma programação, pois o foco deste artigo é a utilização do software HelpMaker para a criação de arquivos de ajuda, esta aplicação será apenas para exemplificar de forma mais clara a criação do arquivo de ajuda.

Criando o projeto Ajuda no HelpMaker

Ao abrir o HelpMaker, logo de cara, no centro da tela estão dispostos 3 botões (Open, New e How do I Use This?).

Clique em New para criar um novo projeto. Irá abrir uma nova janela

Page 25: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013 25

Listagem 1 -Estrutura de tópicos da ajuda

chamada New no centro da tela, em “Click below to select a new procject type:” mantenha a opção “Create a new HelpMaker Procject” selecionado e clique em “Next”.

Na tela seguinte o mais importante é informar o local onde será salvo o projeto e o nome do arquivo do projeto. É aconselhado criar uma pasta nomeada Help, dentro do diretório onde foi salvo o projeto do sistema de exemplo, e o nome do projeto do HelpMaker nomeá-lo como Ajuda. Antes de seguir em frente, verifique que os campos “Project name” e “FileName (without extension)” foram preenchidos com o nome do projeto, clique em Next para continuar.

Na última tela pede para informar a estrutura dos tópicos que terá o projeto. Uma estrutura de exemplo é sugerida, mas para este exemplo utilize a estrutura de tópicos da listagem 1, lembre-se de considerar as tabulações (ver figura 2).

Programa: Converte KM em Milhas Formulário Principal Campos Campo KM Campo Milhas Lista Lista de Conversões Botões Botão Converter Botão Novo Botão Sair

Figura 2 – Estrutura de tópicos da ajuda

Para concluir a criação do novo projeto clique em Finish. Feito isso a janela New se fechará e a estrutura do projeto será apresentada na tela principal do HelpMaker, com o foco no primeiro tópico de ajuda, já com o processador

de textos focado para que seja digitado o texto de ajuda referente ao tópico “Formulário Principal”. Note que ao lado esquerdo da interface do programa, temos um painel chamado Document Map, é o mapa do documento, por onde se localizaremos no documento, sempre que precisarmos acessar algum tópico ou qualquer outro recurso do projeto “Ajuda”. Veja na figura 3 a estrutura gerada automaticamente no painel Map Document para o projeto Ajuda.

Podemos ver que tudo que consta no nó Ajuda se refere ao projeto recém-criado. No nó Help Components é exibido toda a estrutura de tópicos digitada na última tela de criação. No nó Window List podemos configurar as propriedades da janela de ajuda que será exibida ao usuário.

Figura 3 – Painel Map Document

Configurando os tópicos de ajuda

Para configurarmos o tópico Formulário Principal selecionamos o mesmo no painel Map Document. Será exibido o processador de textos para escrever-mos o texto referente ao tópico. Vale lembrar que é possível adicionar imagens, tabelas, formatação em textos, hiperlinks e outros recursos no processador de textos. Adicione um texto simples e objetivo para definir a função do for-mulário no sistema, exemplo, “Este formulário possibilita realizar a conversão de KM em milhas, informe o valor em KM e clique em calcular para obter o resultado”. Adicione também uma imagem ilustrativa do formulário através do menu (Insert / Picture), localize a imagem do formulário e adicione um Hint (texto informativo), por exemplo, “Formulário para converter KM em Milhas”.

Page 26: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março201326

Para configurarmos este tópico acesse a aba “HelpTopic” (ver figura 4). Os valores estarão previamente preenchidos, porém, iremos alterá-los para facilitar o acesso pelo formulário do sistema. No campo TopicID iremos informar o nome no objeto definido no Delphi XE2, neste caso frmPrincipal, isso não é uma regra a seguir, porém auxilia bastante em um projeto muito grande porque faz a associação direta de um tópico de ajuda com o componente que se refere. O campo Help Context Number é o campo pelo qual será feita a associação do objeto no Delphi para o tópico da ajuda, é um campo incremental e já vem com um valor predefinido, podemos alterar este valor, porém, não podemos informar um valor que já tenha sido definido para outro tópico do mesmo projeto, informe o número 1 para o frmPrincipal, nos demais campos iremos incrementar de um em um. O campo KeyWords se refere às palavras-chave que serão indexadas na busca do sistema de ajuda, para este campo informe: “Formulário, Principal, Conversão, Quilômetros, Milhas”. As palavras devem ser separadas por uma quebra de linha (tecla Enter). O frmPrincipal deverá ficar como na figura 4.

Figura 4 – HelpTopic: configurar tópico

O tópico frmPrincipal já está devidamente configurado, siga as instru-ções da tabela 2 para realizar as configurações dos demais tópicos da ajuda e siga como exemplo os textos de ajuda dos demais componentes descritos na tabela3.

Tropicld Help Context Number Key WordsfrmPrincipal 1 Formulário, Principal, Conversão,

Quilômetros, Milhas

edtKM 2 Campo, KM, Quilômetros

edtMilhas 3 Campo, Milhas

listConversoes 4 Lista, Conversões

btnConverter 5 Botão, Converter

btnNovo 6 Botão, Novo

btnSair 7 Botão, SairTabela 2 – Configurações dos demais tópicos de ajuda - aba Help Topic

Tópico Texto de ajudaedtKm Informe o valor em KM. Este é um campo numérico.

edtMilhas Este campo exibe o resultado da conversão dos KM informado anteriormente.

listConversoes Esta lista armazena os resultados das conversões realizadas pelo usuário.

btnConverter Este botão deve ser acionado após informar o valor de KM. Para realizar o cálculo da conversão é considerado que 1 milha é igual a 1.609 KM.

btnNovo Este botão deve ser acionado toda vez que o usuário realizar uma nova conversão. Ele limpará os campos para efetuar a nova conversão.

btnSair Este botão encerra a execução do sistema.Tabela 3 – Exemplos de textos de ajuda dos demais tópicos do projeto – aba Help

Control

Depois de terminar estas configurações iremos agora definir as configu-rações do projeto. No painel Map Document selecione o nó com o nome do nosso projeto, “Ajuda”, na tela central serão exibidas as configurações que podemos realizar em nosso projeto. Na primeira aba podemos definir se o nosso projeto de ajuda será compilado em formato WinHelp, HTMLHelp ou em ambos os formatos.

O formatoHTMLHelp de ajuda é compatível com qualquer versão do Win-dows, já o formato WinHelp é compatível com Windows da versão Windows 98 até a versão Windows XP, porém, para as versões superiores ao Windows XP é possível baixar um pluggin da própria Microsoft para que o sistema de ajuda funcione corretamente. Este pluggin pode ser baixado através do endereço (http://support.microsoft.com/kb/917607), basta escolher entre as versões do Windows e executar para habilitar o formato de ajuda WinHelp.

Neste exemplo iremos utilizar ambos os formatos de ajuda. Desmarque a opção “65536 colors for WinHelp” para que não haja problemas com a exibição das imagens quando o projeto for compilado (ver figura 5).

Figura 5 – Configuração do projeto – aba Project

Na aba General adicione um título para a janela principal do projeto no campo Help Title, exemplo, “Ajuda do sistema Converter KM em Milhas”. No campo Default Topic selecione o tópico frmPrincipal.

Na aba Help Context temos o controle de auto incremento, em Increment By iremos marcar 1 para que o incremento a cada novo tópico seja realizado

Page 27: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013 27

de um em um, por padrão vem definido o valor 10. O campo Current Number representa o número corrente do auto incremento. Como geramos até agora 7 tópicos, deveremos definir o valor 8 neste campo (ver figura 6), para que num próximo tópico já seja atribuído o auto incremento.

Figura 6 – Configuração do projeto – aba Context Help

A partir deste ponto o projeto de ajuda já poderá ser compilado. Porém, se quiser redimensionar a janela do sistema de ajuda, acesse o nó Main dentro do nó Window no painel Map Document, serão listadas no centro da tela as possíveis configurações referentes à janela de ajuda, tanto do formato WinHelp quanto do formato HTMLHelp.

Bom, como iremos utilizar ambos os formatos de ajuda para incluir ao nosso software de exemplo, vamos criar mais um campo no formulário que possibilite o usuário a escolher qual o formato de ajuda que irá utilizar. Ou seja, também iremos criar mais um tópico de ajuda neste projeto de ajuda. Para isso clique no nó Campos (em Map Document), e depois clique no único botão que aparece no centro da tela, Create a New Topic. Abrirá uma janela chama-da Insert, informe o nome do campo em Treeview Text, em Topic ID informe “rgFormato” que será o nome do objeto no formulário da aplicação criada no Delphi, o prefixo “rg” se refere a um componente TRadioGroup. Adicione as Key Words, palavras-chave para as busca referentes a este tópico no sistema de ajuda. Por fim visualize que o campo Help Context ID já vem com o valor 8, que fora definido anteriormente, agora a cada novo campo será incrementado automaticamente. Veja na figura 7 a tela de Insert.

Figura 7 – Inserindo um novo tópico ao projeto de Ajuda

Pronto, terminamos o nosso projeto de ajuda, o que temos a fazer agora é compilar o projeto teclando o botão F9 ou através do menu (Tools / Compile). Ambos os formatos de ajuda serão exibidos na tela para mostrar como ficou. Se notar que alguma coisa ficou errada, basta corrigir no projeto HelpMaker e compilá-lo novamente.

Vinculando a Ajuda ao software

Acesse a pasta do projeto Ajuda criado no HelpMaker, e verá que foram criadas duas novas pastas, “ajuda_tmphhp” e “ajuda_tmphpj”, que são res-pectivamente a compilação HTMLHelp e WinHelp. Da primeira pasta iremos utilizar apenas o arquivo “ajuda.chm” (para a ajuda HTMLHelp) e da segunda pasta iremos utilizar os arquivos “ajuda.cnt” e “AJUDA.HLP” (para a ajuda WinHelp). Estes arquivos citados devem estar no mesmo diretório do software.

Por padrão o Delphi XE2 cria o executável em um diretório separado dos fontes do projeto, tomando como base o diretório dos fontes, acesse a pasta Win32, em seguida, abra a pasta Debug, esta é a pasta na qual devemos adi-cionar os arquivos compilados pelo HelpMaker (ver figura 7).

Figura 7 – Arquivos de ajuda adicionados ao diretório do executável do software

Abra o projeto do software pelo Delphi Xe2. Acesse o menu (Project / Op-tions), selecione o nó Aparence no painel esquerdo da janela Project Options. No campo Help File, preencha o nome do arquivo de help que será definido como padrão para o aplicativo. Manteremos neste exemplo o formato WinHelp como padrão de ajuda, portanto preencheremos “AJUDA.HLP” neste campo. Não preencheremos o caminho exato de onde está localizado a ajuda porque a estrutura de pastas pode variar entre cada computador, e isso poderia dar erro durante a execução da aplicação, pois poderia não localizar o arquivo de ajuda caso a estrutura de pastas seja diferente. Escrevendo apenas o nome do arquivo, indicamos que o arquivo estará armazenado na mesma pasta do executável do software (ver figura 8).

Figura 8 – Definindo o formato de ajuda padrão para o software

Vamos adicionar então o novo campo, que servirá para que o usuário alterne entre cada formato de ajuda. Adicione ao frmPrincipal um compo-nente TRadioGroup, altere a propriedade Name do mesmo para rgFormato, na propriedade Caption preencha “Formato da Ajuda”, em Columns defina o valor 2, adicione dois valores na propriedade Items, “WinHelp” e “HTMLHelp”, por fim defina o valor 0 (zero) para a propriedade ItemIndex, isso fará que o componente mantenha a opção WinHelp marcada (que é o padrão de ajuda definido ao projeto).

Page 28: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março201328

Listagem 2 -Codificação do evento OnClick do componente rgFormato

No evento OnClick deste mesmo componente rgFormato adicione o código da listagem 2, isso fará que a aplicação alterne entre os formatos de ajuda.

procedure TForm2.rgFormatoClick(Sender: TObject);begin case rgFormato.ItemIndex of 0: Application.HelpFile := ‘AJUDA.HLP’; 1: Application.HelpFile := ‘ajuda.chm’; end;end;

Para vincularmos cada tópico de ajuda ao seu referente componente no software devemos apenas preencher as propriedades HelpContext de cada componente, inclusive o formulário frmPrincipal. Siga as instruções da tabela 4 para realizar estas alterações.

Componente Propriedade HelpContextfrmPrincipal 1

edtKM 2

edtMilhas 3

listConversoes 4

btnConverter 5

btnNovo 6

btnSair 7

rgFormato 8Tabela 4 – Configurando os componentes do frmPrincipal no Delphi XE2

Após realizar estas configurações nos componentes através do painel Object Inspector, acesse a linha de códigos da unPrincipal (tecle F12), vá ao início do documento e adicione ao final da cláusula Uses a unit HtmlHelpViewer, separando por uma vírgula e encerrando com um ponto-e-vírgula. Caso opte por adicionar apenas o formato WinHelp, adicione a unit WinHelpViewer, porém para este projeto que tem ambos os formatos, apenas a primeira unit referenciada será suficiente para o projeto.

Neste ponto nosso projeto está pronto para ser executado, lembrando que para Windows com versão superior ao Windows XP, deve acessar o endereço (http://support.microsoft.com/kb/917607) e baixar o instalador referente à versão do Windows. Veja na figura 9 o software sendo executado e fazendo a chamada da ajuda no formato HTMLHelp.

Figura 9 – Projeto Conversor de KM em Milhas em execução

Conclusão

Vimos neste artigo um exemplo básico de como criar arquivos de ajuda para softwares desenvolvidos em Delphi com o programa HelpMaker. Este que é uma ferramenta intuitiva e simples de ser manipulada, agiliza e muito no processo da criação do Help de sistemas, gera arquivos de ajuda em formato HTML e formato próprio para Windows além é claro de ter a vantagem de ser uma ferramenta Freeware (gratuita).

Espero que tenham gostado deste tema, um abraço a todos e até a próxima.

[email protected]

Lucas Vieira de OliveiraConsultor Técnico The Club.

Sobre o autor

Page 29: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013 29

dicas the club

Dicas na Instalação do Delphi 7

Neste mês nosso associado Shakespeare Mateus Oliveira, da cidade de Goiania compartilhou uma dica importante na transição do “Windows 7 32 bits” para o “Windows 7 64 bits” utilizando como ferramenta de desenvolvimento o “Delphi 7” . Estas dicas evitam problemas na instalação de componentes de terceiros.

Vejamos os detalhes abaixo:

Na instalação do Delphi 7, altere os seguintes diretórios:

Padrão: “C:\Program Files (x86)\Borland\Delphi7\”

Para: “C:\Borland\Delphi7\”

Padrão: “C:\Program Files (x86)\Common Files\Borland Shared\”

Para: “C:\Borland\Common Files\Borland Shared\”

Padrão: “C:\Program Files (x86)\Common Files\Borland Shared\BDE\”

Para: “C:\Borland\Common Files\Borland Shared\BDE\”

Padrão: “C:\Program Files (x86)\Common Files\Borland Shared\Database Desktop\”

Para: “C:\Borland\Common Files\Borland Shared\Database Desktop\”

Estas configurações resolvem problemas relacionados aos componentes instalados no Delphi tanto no Diretório “Program Files (x86)” quanto em “Program Files”.

Page 30: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março201330

VerticalHorizontal

desafio the club

3. É uma ferramenta que facilita a verificação e a correção dos erros em seus programas, executa programas passo-a-passo e verifica o valor de variáveis e expressões durante a execução.

4. Serve para impor uma regra que devera ser seguida pelas subclasses de determinada classe.

7. É um mecanismo interno do objeto que fica “escondido” do usuário.

9. São instâncias das classes.

10. Arquiteto por trás do Delphi que permaneceu na Borland até 1996, quando foi contratado pela Microsoft, onde se tornou o arquiteto responsável pelo projeto c# e foi peça chave na criação do ambiente Microsoft.NET.

1. É um tipo especial de estrutura de uma classe, que define um padrão ou contrato a ser seguido em todas as subclasses decorrentes .

2. Atributos, ações, métodos e propriedades de outros já existentes.

5. Operador de conversão com checagem.

6. São protótipos utilizados para construir objetos.

8. É a janela principal do sistema, a qual armazenará dentro de si as outras janelas ( janelas filhas).

1-INTERFACE 2-HERANÇA 3-DEPURADOR 4-ABSTRAÇÃO 5-AS 6-CLASSES 7-ENCAPSULAMENTO 8-MDI 9-OBJETOS 10-ANDERSHEJLSBERGRespostas:

Page 31: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013 05

Page 32: The Club - megazine · ADO.NET Entity Framework ... Framework” utilizando a linguagem C#, sendo que neste tem como intuito ... de dados já existente

março2013