32
setembro 2013

The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

Embed Size (px)

Citation preview

Page 1: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013

Page 2: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013

Page 3: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013 03

17

Autor: Thiago C. MontebugnoliÍndice

26

Editorial

04

10

Autor: João Marcos Sakalauska

05

Autor: Luciano Pimenta

Autor: Jeferson Silva de Lima

Manipular dados no Microsoft Word com Delphi

FastReport avançado

C#Desenvolva uma Aplicação Desktop em C# e MySQL – Parte 3

AndroidConsumindo Web Services

Page 4: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro201304

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

pelos seus respectivos proprietários.

Thiago Montebugnoli - Editor [email protected]

Olá amigos do The Club, aqui estamos com mais uma edição da The Club Magazine, feita especialmente para vocês. Começamos com o artigo de nosso colaborador Luciano Pimenta, trazendo a segunda parte do artigo relacionado ao gerador de relatórios FastReport. Nesta segunda parte ele abordará relatórios com dicas mais avançadas como: criação de gráficos, código de barras e o uso de templates. Já o colaborador João Marcos Saka-lausca, vem com a terceira parte do desenvolvimento de uma aplicação C# usando o Banco MySql, sendo que nesse artigo ele iniciará a codificação de uma tela de Login, muito útil para quem está se familiarizando com este tipo de aplicação. Nosso consultor Jeferson Silva de Lima nos ensina como Inserir Imagens no Word utilizando o Delphi, uma dúvida bastante abordada em nosso suporte técnico ultimamente. Eu continuo escrevendo artigos relacionados ao Android, sendo que neste mês dou algumas dicas para Consumir Web Services nesta plataforma utilizando um framework específico para esta tarefa.

Como eu sempre digo, ou melhor, escrevo, fiquem a vontade para dar sugestões de artigos ou dicas, que faremos o possível para atendê-los.

Um Forte abraço,

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ãoDrielly Cristini Patrinhani

ColunistasJoão Marcos Sakalauska

José Antonio P. M. de PaulaLucas de OliveiraLuciano Pimenta

Thiago Cavalheiro Montebugnoli

JuninhoJeferson Silva de Lima

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 - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013 05

Listagem 1. Consulta para o gráfico

Vimos no artigo anterior, os primeiros passos para usar o FastReport. Aprendemos a criar relatórios simples, listagens, agrupamentos e somatórios. Neste artigo, veremos relatórios com dicas mais avançadas, pois em aplicações reais, usamos todas essas possibilidades.

Com o FastReport podemos criar esses tipos de relatórios de maneira fácil.

Nota: os exemplos de gráficos e cross-tab precisam de componen-tes, que estão disponíveis apenas para a versão comercial (full).

Criando gráficos

Gráficos, mostram de forma mais amigável informações do que uma listagem, por exemplo. Como diz o ditado: uma imagem vale mais do que mil palavras, assim um gráfico (imagem), mostra informações de forma visual, muito mais rápido de serem avaliados.

Criar gráficos no FastReport é bastante fácil. Primeiro, vamos fazer a consulta que retorne os dados necessários para a criação do relatório. Posso dizer que a consulta, é 70% do gráfico, pois precisamos retornar dados que sejam interessantes de serem avaliados em um gráfico.

Uma consulta interessante seria a quantidade de produtos por setor, quantidade de funcionários por setor, etc. Aqui, no exemplo, vamos fazer um simples, apenas com a quantidade de funcionários por setor. O SQL usado esta na Listagem 1.

select D.dept_no, D.department, count(e.dept_no) as QtdeEmployeefrom department DINNER JOIN employee e on

e.dept_no = d.dept_nogroup by D.dept_no, D.department

No retorno da consulta teremos os campos departamento e a quantidade de funcionários do mesmo. Abra o design do FastReport e faça a ligação para a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1).

Figura 1. Editor do Chart object

No editor, vamos adicionar as séries (cada uma representa um gráfico), lembrando que podemos ter várias series que podem ser diferentes tipos de gráficos (em barra, pizza, linha etc). Clique no botão Add Series para criamos um gráfico.

Na janela que abre, temos várias opções de gráficos e suas derivações (Figura 2).

F a s t R e p o r t avançado

Page 6: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro201306

Figura 2. Galeria com os tipos de gráficos disponíveis

Escolha o item Pie e o tipo Normal. Na opção DataSource, escolha o frxDBDataSet configurado anteriormente. No Label, vamos indicar o campo Department da consulta, pois queremos saber quais os departamentos pos-suem q quantidade de registros (funcionários).

No item Pie (que muda de nome, de acordo com o tipo de gráfico escolhi-do), vamos configurar com o campo que retorna a quantidade de funcionários (QtdeEmployee). Caso sua necessidade seja de criar gráficos com valores fixos (sem a necessidade de uma consulta no banco), o que é bastante difícil, basta escolher Fixed data e digitar os valores nos campos Label e Pie.

Pronto, já temos um gráfico pronto para uso. Execute o relatório e veja o gráfico em execução (Figura 3).

Figura 3. Relatório em execução

Para adicionar um título, marque a opção Chart no editor. Acesse a pro-priedade Title>Text. Temos várias configurações para a propriedade Title. Vimos que o gráfico mostra uma quantidade grande de informações e que em alguns casos precisamos apenas das mais relevantes, como por exemplo, os cincos primeiros departamentos em quantidade de funcionário.

Para conseguir esse “agrupamento” de informações, é bem fácil. Na série que criamos, temos um GrupoBox chamado Other options. A opção TopN values indica a quantidade de informações que queremos agrupar, por exemplo, para saber os primeiros departamentos em número de funcionário, digite “5” no item.

Ao rodar o relatório, são mostrados no gráfico, os quatros primeiros de-

partamentos em quantidade de funcionário e um item a mais com a soma de todos os outros. Esse último item não retorna nenhum título, mas podemos colocar um texto indicativo no item TopN caption (Figura 4).

Figura 4. Agrupando informações com o TopN

Veja na Figura 5 outros tipos de gráficos criados.

Figura 5. Tipos de gráficos que podemos criar no FastReport

Cross-tab

Também conhecido como tabela de referência cruzada, serve para cruzar-mos dados de duas ou mais tabelas para que possamos encontrar uma relação que nos retorne informações para serem apresentadas. Um exemplo simples: montante de vendas do ano, mês ou período por cliente.

Nesse caso, nossas linhas da consulta são dinâmicas (cliente), como de costume, mas as colunas, também precisam ser dinâmicas (meses, período). Com o croos-tab, fica fácil de fazer esse tipo de relatório.

Nosso SQL precisar retornar o nome do cliente, o montante gasto e o período da venda (nesse caso, será mensal). Veja na Listagem 2 a consulta.

Page 7: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013 07

Listagem 2. Consulta para croos tab

select c.customer,extract(MONTH from s.ship_date) as Mes_digito,case extract(MONTH from s.ship_date) when 1 then ‘Jan’ when 2 then ‘Fev’ when 3 then ‘Mar’ when 4 then ‘Abr’ when 5 then ‘Mai’ when 6 then ‘Jun’ when 7 then ‘Jul’ when 8 then ‘Ago’ when 9 then ‘Set’ when 10 then ‘Out’ when 11 then ‘Nov’ when 12 then ‘Dez’ end as Mes, s.total_valuefrom customer cinner join sales s on s.cust_no = c.cust_nowhere s.ship_date is not nullgroup by Mes, Mes_digito, c.customer, s.total_valueorder by Mes_digito

Criamos o campo Mes_digito para que possamos ordenar corretamente os meses no período. Faça a ligação da consulta com o relatório, conforme exem-plos anteriores. No design do relatório, temos o Cross-tab object e DB Cross--tab object. O Cross-tab object, permite a inserção de dados manualmente.

Já o DB Croos-tab object, como o próprio nome sugere, permite a criação desse tipo de relatório, usando uma consulta do banco de dados. Adicione um ao relatório e será aberto o editor para configuração do croos-tab (Figura 6).

Figura 6. Editor de configuração do DB cross-tab object

Em Source data, escolhemos a fonte de dados. Agora no croos-tab struc-ture, vamos configurar as colunas e linhas do croos-tab. Arraste o campo Customer para a linha. O campo Mes será nossa coluna e Total_value será a parte centralizada.

As linhas e colunas possuem ordenação e agrupamento, já o campo cen-tralizado, possui configurações de cálculos, como somatório, contador, média, mínimo e máximo. Para o campo Mes não vamos usar nenhuma ordenação (opção None), pois já temos a consulta ordenada corretamente.

Na parte inferior do editor, temos um preeview de como ficará o relatório. Ao lado temos várias opções de configuração como: mostrar o título, cabeçalho de coluna e linha, totalizadores de colunas e linhas etc. Veja na Figura 7, como ficou o editor após as configurações.

Figura 7. Configuração do cross-tab

Basta rodar o relatório que teremos um croos-tab (Figura 8).

Figura 8. Croos-tab em execução

Código de barras

Atualmente, outro componente muito importante é o barcode. No Fas-tReport, podemos configurar o Barcode object facilmente. Se precisarmos gerar um código de barras padrão, com um único número, basta adicionar o controle no relatório e configurar o seu editor (Figura 9).

Page 8: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro201308

Figura 9. Editor de configuração do Barcode object

Indicamos o valor do código de barras no campo Code e configuramos o tipo do mesmo (temos muitas opções). Note ainda que podemos rotacionar o campo no relatório. Caso tenhamos uma listagem e seja necessário um código de barras para cada item, basta usar a mesma configuração, apenas no campo Source, vamos escolher o campo da consulta (Figura 10).

Figura 10. Configurando um campo para o Barcode object

Objetos OLE

O OLE object serve para “adicionarmos” no relatório arquivos de texto, imagens etc. OLE (Object Linking and Embedding) é uma tecnologia Microsoft que esta no mercado há bastante tempo e podemos conceitua-la como um sistema de objetos distribuídos.

OLE é uma arquitetura cliente pesada, ou seja, para termos a oportunidade de mostrar uma planilha do Excel, temos que ter um software instalado na máquina que abra esse tipo de arquivo.

Temos a facilidade de adicionar textos, planilhas no relatório e vincular as mesmas, ou seja, qualquer alteração no arquivo original vai refletir no relatório. Mas devemos ter cuidado, pois, caso o arquivo seja removido de seu diretório original da vinculação, os dados continuarão a ser apresentados, desde a última visualização atualizada.

Para trabalhar com OLE no FastReport, devemos adicionar um frxOLEObject no formulário e um OLE Object no relatório. Ao adicionar no relatório, será aberto um editor para escolher a inserção de um novo arquivo ou a edição de um já vinculado.

Clique em Insert. Caso você já tenha trabalhado com OLE, a próxima tela é padrão para criação de um novo arquivo ou vinculação com um já existente (Figura 11).

Figura 11. Adicionando um objeto OLE no relatório

Veja que temos várias possibilidade de arquivo e isso varia de acordo com os softwares instalados em sua máquina. Marque Criar do arquivo, escolha o mesmo e marque a opção Vincular. Pronto, basta redimensionar o controle no relatório que temos imagens, arquivos de texto, planilhas etc, vinculadas com o relatório.

Templates

O FastReport oferece uma funcionalidade bastante interessante, o uso de templates. Com o Quick Report, podíamos usar a herança visual de formulá-rios para facilitar a construção de relatórios com layout padronizado, sem a necessidade de criar o layout em todo relatório.

No Rave Reports temos Global Pages para “simular” isso (veja dica em www.lucianopimenta.com/post.aspx?id=34).

No FastReport temos os templates, onde podemos salvar um relatório (arquivo FR3) com o layout padrão e depois, usar esse template na criação dos novos relatórios. No design do FastReport, acesse o menu File>New. Será aberta uma janela com alguns templates pré-definidos (Figura 12).

Figura 12. Adicionando um novo item

Page 9: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013 09

Na aba Templates, temos os templates que podemos criar. Nesse caso, como não definimos nenhum, o mesmo esta vazio. Crie um novo relatório. Adicione bandas e controles de tela, como da Figura 13.

Nota: Não faça nenhuma vinculação de dados com o relatório template. Ele não pode ter vinculação a dados, pois é o “base”. Os que herdarem dele, sim, devem ser vinculados.

Esse é o layout que será usado por todos os relatórios. Salve o arquivo FR3 como “LayoutPadrao.fr3” em um diretório de sua escolha. Acesse o menu Report>Options. Na aba Inheritance podemos indicar em que local (diretório) temos os arquivos FR3 que serão usados como templates (Figura 14).

Figura 14. Indicando o diretório onde teremos os templates

Pronto, agora basta acessar novamente o menu File>New, que o template estará pronto para ser usado (Figura 15).

igura 13. Layout padrão para relatórios do sistema

Figura 15. Escolhendo o template criado para um novo relatório

Conclusões

Vimos nesse artigo dicas para gerar relatórios avançados no FastReport, onde vimos como criar gráficos, croos-tab e outras configurações avançadas. Como o FastReport é a ferramenta oficial para geração de relatórios no Delphi, aprendemos um pouco nesses dois artigos como trabalhar com a mesma.

Existem funcionalidades que devem ser exploradas e utilizadas de acor-do com a necessidade do desenvolvedor. 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 10: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro201310

Código 1:Nos artigos anteriores, preparamos todo o ambiente e seus respectivos recursos, seguindo posteriormente na preparação do protótipo da nossa aplicação. Nesse artigo, juntaremos tudo o que foi falado na preparação, aplicando o aprendizado no desenvolvimento da nossa mini aplicação.

Nota: É necessário que você tenha lido os artigos anteriores (Parte Um e Dois) para que não haja dificuldades na implementação que será apresentada nesse artigo, pois, a partir desse haverá partes práticas referente a conclusão do artigo e da aplicação.

Nesse artigo iniciaremos a codificação da nossa aplicação começando pela tela de Login do Sistema. Sendo assim, abra a solução “MiniAplicacao.sln” e em Solution Explorer, abra o arquivo “Login.cs” conforme imagem 01.

Imagem 01: Tela de Login do sistema MiniAplicacao.sln

Dê um duplo clique no botão Acesso e no método “btnAcesso_Click()” digite o código em negrito a seguir:

private void btnAcesso_Click(object sender, EventArgs e){bool flag = false;

if ((txtUsuario.Text != string.Empty) && (txtSenha.Text != string.Empty)) {string CONFIG = “server=localhost;database=ldc;uid=root;password=”;MySqlConnectionconexao = new MySqlConnection(CONFIG);MySqlCommand query = new MySqlCommand();query.Connection = conexao;conexao.Open();

query.CommandText = “SELECT * FROM usuario WHERE usuario = ‘” + txtUsuario.Text.Trim();query.CommandText += “’ AND senha = ‘” + txtSenha.Text.Trim() + “’”;boollinhas = query.ExecuteReader().HasRows;

if (linhas) {this.Hide();frmPrincipal f = new frmPrincipal();f.ShowDialog();this.Close();

Desenvolva uma Aplicação Desktop em C# e MySQL Parte 3

Page 11: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013 11

this.Dispose(); }else {MessageBox.Show(“Usuário ou senha inválida”);}

conexao.Close(); }else {if (txtUsuario.Text == string.Empty){MessageBox.Show(“Preencha o campo ‘Usuário’”);flag = true; }

if ((txtSenha.Text == string.Empty) && (flag == false)){MessageBox.Show(“Preencha o campo ‘Senha’”);} }}

Para resolver os problemas referente ànamespace das classes Mysql, utilize a namespace “MySql.Data.MySqlClient” na seção using como mostra a imagem 02.

Imagem 02: Namespace “MySql.Data.MySqlClient”

Antes de rodar a aplicação, verifique se o serviço do MySQL foi carregado pelo XAMPP ou caso você tenha o MySQL instalado, verifique se o serviço foi iniciado. Lembrando que também é necessário ter o MySQLConnector instalado (MySQL Connector foi abordado na parte dois desse artigo).

Notas:

1. No primeiro artigo, foi passada a instrução INSERT para que o Banco de Dados tivesse pelo menos um usuário para teste, porém, houve um erro de digitação que deixou a senha bastante estranha por sinal. Então, revisando a instrução, vamos continuar com a senha do primeiro artigo, mesmo estranha em termos de leitura. Senha do primeiro artigo ausuariodmin, instrução INSERT:

INSERTINTO`ldc`.`usuario`(`nome`,`usuario`,`senha`)VALUES(‘Administrador’,’admin’,’ausuariodmin’)

2. Como o artigo é didático alguns itens serão passados de forma resumida ou quase sem detalhes, porém, o artigo em si é um pontapé inicial para que você evolua o assunto abordado nas suas implementações diárias.

Caso seu ambiente esteja devidamente preparado, compile e rode a aplicação para testar seu funcionamento.

Se não houver nenhum problema e os dados de usuário e senha forem digitados corretamente a tela de Login será fechada e a tela principal será aberta conforme imagem 03.

Imagem 03: Tela Principal carregada após tela de Login.

Agora que concluímos a primeira etapa, vamos para a segunda, que é a programação dos eventos da tela “Principal”.

Para começar, interrompa a execução da aplicação e no Solution Explorer abra o arquivo “Principal.cs”.

Clique no controleMenuStrip “Menu” para expandir as opções criadas no artigo anterior como mostra a imagem 04.

Page 12: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro201312

Imagem 04: MenuStrip “Menu”.

Iniciando a programação dos eventos dos Menus

1. Sair – Dê um duplo clique na opção Sair e programe o evento com o código a seguir:

private void sairToolStripMenuItem_Click(object sender, EventArgs e){this.Close();}

2. Usuário – Dê um duplo clique na opção Usuárioe programe o evento com o código a seguir:

private void usuarioToolStripMenuItem_Click(object sender, EventArgs e){frmUsuarioFormUsuario = new frmUsuario();FormUsuario.MdiParent = this;FormUsuario.StartPosition = FormStartPosition.CenterScreen;FormUsuario.Show();}

3. Contato – Dê um duplo clique na opção Contato e programe o

evento com o código a seguir:

private void contatoToolStripMenuItem_Click(object sender, EventArgs e){frmContatoFormContato = new frmContato();FormContato.MdiParent = this;FormContato.StartPosition = FormStartPosition.CenterScreen;FormContato.Show();}

4. Tipo de Contato – Dê um duplo clique na opção Tipo de Contato e programe o evento com o código a seguir:

private void tipoDeContatoToolStripMenuItem_Click(object sender, EventArgs e) {frmTipoContatoFormTipoContato = new frmTipoContato();FormTipoContato.MdiParent = this;FormTipoContato.StartPosition = FormStartPosition.CenterScreen;FormTipoContato.Show();}

Com os eventos do StripMenu preparados, passaremos aos eventos de formulário.

Para que todos os formulários possam ter acesso aos mesmos eventos e executar os mesmos métodos trocando informações e mensagens, será neces-sário criarmos uma Classe que será usada como Classe Pai e assim fazer com que a Classe dos formulários criados realize a herança dessa nova classe Pai.

Em resumo, sua arquitetura atual pode ser resumida como mostra a imagem 05:

Imagem 05 – Arquitetura atual – Todas as classes herdam da classe Form.

Page 13: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013 13

Para que possamos deixar a aplicação mais dinâmica, teremos que alterar a estrutura da arquitetura que passará a trabalhar da forma apresentada na imagem 06:

Imagem 06 – Arquitetura que será implementada visando a facilidade na troca de mensagens entre objetos, principalmente com a classe consulta que pesquisará os dados e transmitirá a informação para as demais classes filhas através da classe MAAcoes.

Sendo assim, abra o Solution Explorer, clique com o botão direito na solução e vá até as opções Add -> New Item -> Visual C# Class e crie uma classe chamada “MAAcoes.cs” (significado “Mini Aplicação Ações”) conforme imagem 07.

Imagem 07: Classe MAAcoes.cs

Com a classe criada, implementaremos os métodos necessários para os nossos formulários.

As etapas a seguir mostram como implementar o código para a classe MAAcoes.

1. Nossa classe deverá ser do tipo Form já que obviamente estamos trabalhando com Windows Forms, então, devemos inserir asnamespacesSys-tem.Windows.Formse usingSystem.Drawingconforme o código em negrito a seguir:

using System;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Drawing;

2. Agora, nossa classe deverá herdar da classe Form para que tenha-mos acesso a todas as propriedades e métodos necessários. Para que nossa classe herde a classe “Form”, basta você colocar “: Form” na frente do nome da sua classe conforme código em negrito a seguir:

namespaceMiniAplicacao{classMAAcoes: Form {}}

3. Com a classe preparada, vamos implementar os métodos de contro-le de botões da nossa aplicação. O método AjustaBotoesFormulario recebe os controles do Formulárioe a sinalização de uma flag (true ou false) para habilitar ou desabilitar os botões conforme o código a seguir:

public void AjustaBotoesFormulario(Control.ControlCollectioncontroles, Boolean flag) {foreach (Control control in this.Controls) {if (control.GetType().ToString() == “System.Windows.Forms.Button”) {if (control.Name == “btnNovo” || control.Name == “btnAlterar” || control.Name == “btnSair” || control.Name == “btnExcluir”) {control.Enabled= !flag; }

if (control.Name == “btnSalvar” || control.Name == “btnCancelar”) {

Page 14: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro201314

control.Enabled = flag;}}}}

Observação:Repare que em determinado momento do método fazemos a verificação específica por nome (control.Name = “btnExcluir”), sendo assim, se os botões do seu formulário não estiverem devidamente nomeados, os mesmos não funcionarão conforme esperado. Lembrando que como os botões se repetem nos formulários o nome dos botões co-muns deve ser igual para todos (nome do botão “btnNovo” do formulário Usuario deve ser igual ao nome do botão do formulário TipoContato e assim por diante).

4. Os demais métodos serão para os controles de Texto e Listagem, conforme código a seguir:

public void AjustaCamposFormulario(Control.ControlCollectioncontroles, Boolean flag){

stringstrColor = string.Empty;

if (!flag) {strColor = Color.FromKnownColor(KnownColor.Menu).ToString(); }else {strColor = Color.White.ToString(); }

foreach (Control control in this.Controls) {switch (control.GetType().ToString()) {case “System.Windows.Forms.TextBox”: ((TextBox)control).Enabled = flag;

break;

case “System.Windows.Forms.ComboBox”: ((ComboBox)control).Enabled = flag;break;

} }}

public void AjustaValorCamposFormulario(Control.ControlCollectioncontroles){

foreach (Control control in this.Controls) {switch (control.GetType().ToString()) {

case “System.Windows.Forms.TextBox”: ((TextBox)control).Text = string.Empty;break;

case “System.Windows.Forms.ComboBox”:((ComboBox)control).SelectedIndex = -1;break;

}}}

Com os métodos criados, devemos chamá-los na classe dos nossos formulários.

Então, abra o código do formulário de Usuários, classe Usuario.cs e vamos programá-lo nas seguintes etapas:

1. Em primeiro lugar, substitua a classe Form pela classe MAAcoes para que seu formulário passe a herdar da classe que criamos, conforme código a seguir:

publicpartialclassfrmUsuario : MAAcoes

Page 15: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013 15

Observação: Nesse ponto, sua aplicação poderá não reconhecer a classe herdada MAAcoes e consequentemente não mostrará seu for-mulário no modo Designer. Mas isso só ocorre por conta de que itens como DLL e possíveis referências não estão atualizados. Para resolver isso, em Solution Explorer as opções “Clean Solution” e “Rebuild Solution” devem ser utilizadas e para garantir que estará funcionando, compile e rode sua aplicação. Após isso você poderá retornar ao desenvolvimento normalmente, pois, seu Form já estará aparecendo.

2. Feito isso, vamos programar mais um evento com os métodos cria-dos em MAAcoes, observe que o que está sendo adicionado está em negrito:

publicfrmUsuario(){InitializeComponent();this.AjustaCamposFormulario(this.Controls, false);this.AjustaBotoesFormulario(this.Controls, false);}

Isso é suficiente para testarmos nossa classe pai MAAcoes concluindo a parte inicial do nosso sistema antes de falar sobre Entity Framework. Compile e rode a sua aplicação, se estiver tudo em ordem, seu formulário de Usuários deverá estar com os campos desabilitados juntamente com os botões Salvar e cancelar conforme imagem 08.

Imagem 08 – Formulário inicializado com os campos desabilitados.

Entity Framework

O Entity Framework é um conjunto de tecnologias da ADO.NET que pos-sibilitao desenvolvimento de aplicações orientadas a dados.

Com Entity Framework, é possível modelar entidades, armazenar e consul-tar informações, trabalhando com dados na forma de propriedades e objetos específicos das entidades do seu Banco de Dados, no nosso caso, Usuario,

TipoContato, Contato, sem ter que relacioná-los com as tabelas do banco de dados e as colunas onde os dados estão armazenados.

Na imagem 09 você poderá conferir o esquema de funcionamento do Entity Framework e de com o que foi descrito anteriormente é possível.

Imagem 09 – Esquema de funcionamento do EF.

Para maiores detalhes sobre Entity Framework, vale a pena acessar o endereço da MSDN: http://msdn.microsoft.com/pt-br/data/aa937709

LINQ (LanguageIntegrated Query)

Permite a simplificação de consulta entre dados e objetos, dispensando a forma que era utilizada para escrita de queries (String) permitindo a consulta por meio dos objetos que passam a ser visíveis graças as suporte do IntelliSense.

Na imagem 10 você poderá conferir o exemplo de consulta utilizando LINQ:

Imagem 10 – Consulta de números (consulta + incremento de valor) posteriormente exibidos no laço de repetição.

As consultas por meio do LINQ podem ser estendidas também aos ob-jetos do seu banco de dados não estando limitado a um único tipo de dados (inteiro, string, etc.).

Para maiores detalhes a respeito do LINQ, acesse o endereço da MSDN:http://msdn.microsoft.com/pt-br/library/vstudio/bb397897.aspx

Page 16: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro201316

Para conferir exemplos sobre LINQ, acesse o endereço da MSDN:http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

Tipos genéricos

Os Tipos genéricos, utilizados principalmente com Listas, permitem a criação de classes e/ou métodos onde o tipo de dados pode ser especifica-do, exemplo List<string>, ou declarado como List<T>, onde <T> deverá ser substituído pelo objeto que será trabalhado na sua rotina. Mesmo com essa facilidade, não é permitido que objetos de outros tipos sejam tratados numa mesma lista devido sua tipagem forte. Para que se possa trabalhar com lista de tipo genérico é necessário o uso da interface IEnumerable<T> ou a interface de tipo derivado IQueryable<T>.

Lembrando que os tipos genéricos e listas estão ligados diretamente ao LINQ e suas consultas.

Para mais detalhes sobre o assunto, acesse o endereço da MSDN: http://msdn.microsoft.com/pt-br/library/vstudio/bb546142.aspx

LAMBDA EXPRESSION

Trata-se de uma função anônima que pode ser utilizada com DELEGATES para passagem de expressões como se fossem parâmetros de uma função (principalmente se utilizado com LINQ). Composto principalmente de valor de entrada (se houver) seguido de => mais expressão a ser atribuída, exemplo x => x * x.

Para mais detalhes, consulte o endereço da MSDN: http://msdn.microsoft.com/pt-br/library/vstudio/bb397687.aspx

Conclusão

Mesmo sendo um artigo extenso, não consegui abordar tudo o que real-mente precisaríamos para uma aplicação impecável. Mas levando em consi-deração que se trata de um artigo didático, creio que este é um caminho que abrirá muitos horizontes principalmente para programadores que tem vontade de se aventurar nos benefícios que o .NET vem trazendo ao desenvolvimento por meio de LINQ, Entity Framework e outras opções.

No próximo artigo continuaremos o desenvolvimento da aplicação para conclusão desse assunto.

[email protected]

João Marcos SakalauskaColunista The Club.

Sobre o autor

Page 17: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013 17

Neste artigo continuarei a falar sobre o assunto Web Servi-ces. Para quem leu o artigo do mês passado com o título “Criando um Web Service utilizando o Eclipse Juno” vere-mos que neste mês daremos uma continuação no que foi visto, utilizando como ferramenta o Android com o auxílio

de uma biblioteca de terceiros chamada “KSOAP2”. Este artigo será bem prá-tico, não envolvendo conceitos já citados em outros artigos. Para ficar mais interessante iremos consumir um Web Service gratuito para consulta de CEPS e Logradouros do Brasil. Então chega de papo e vamos por a mão na massa.

Cadastrando no site

Iremos usar como base para conhecimento o seguinte site:http://www.byjg.com.br/site/

O Serviço de consulta a CEP é de uso livre. Sendo que atualmente traba-lha com a base de CEP dos Correios e contém mais de 811.000 logradouros cadastrados. A única tarefa que devemos realizar seria um pequeno cadastro. Para isto, clique na região superior direita “Área Usuário” e localize a opção “Criar Novo Usuário”. Ver Imagem 01.

Figura 01: Criando o usuário e senha.

Android – Consumindo Web Services

Depois de efetivar o cadastro, em alguns minutos receberá um e-mail para ativação de sua conta. No primeiro contato ao entrar em sua área específica, receberá um aviso idêntico aos dizeres a seguir:

“Para Utilizar os serviços ByJG, você precisa ativar um serviço, selecione no menu acima o serviço que deseja ativar”.

Localize no menu acima a região chamada “Serviços CEP – CEP” e clique sobre a mesma. Deveremos informar mais alguns dados adicionais para concluir e ativar o serviço de Web Service. Ver Imagem 02

Figura 02: Ativar Web Service de consulta de CEP.

Possuímos diversos recursos como: Pesquisas (CEP e Logradouro), gráfico de utilização entre outros.

Importante: O usuário e senha serão utilizados ao decorrer do artigo.

Dados do Serviço

O endereço do serviço é

Page 18: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro201318

http://www.byjg.com.br/site/webservice.php/ws/cep

Possuímos os seguintes métodos ativos:

• string obterVersao( ) - Retorna a versão do WebService.• string obterLogradouroAuth( string , string , string ) - Retorna o nome

do logradouro à partir do CEP fornecido. Esse método requer autenticação do usuário.

• string[] obterCEPAuth( string , string , string , string , string ) - Re-torna o CEP à partir do nome do logradouro, localidade e unidade federativa. Esse método requer autenticação de usuário. Se autenticado, retorna as 20 primeiras linhas encontradas.

O endereço do descritor do serviço WSDL é:http://www.byjg.com.br/site/webservice.php/ws/cep?WSDL

Adquirindo o framework “Ksoap2”

O framework “Ksoap2” seria a ferramenta necessária para processar as mensagens SOAP. Ela pode ser baixada diretamente pelo site:

http://www.java2s.com/Code/Jar/k/Downloadksoap2androidassem-bly258jarwithdependenciesjar.htm

Neste artigo recomendo utilizar a versão “2.5.8”.

Principais Classes

O framework “Ksoap2” nos fornece todos os recursos necessários para consumir um Web Service. Abaixo irei dar uma breve descrição das caracte-rísticas destas classes.

1) org.ksoap2.serialization.SoapObject

Se caracteriza por ser um objeto dinâmico simples que pode ser usado para construir as chamadas do Ksoap2. Essencialmente, esta classe utiliza dois parâmetros, sendo: o “namespace” (geralmente o endereço do WebService) e o “name” (o nome do método a ser utilizado).

Exemplo de utilização:

SoapObject soap = new SoapObject (namespace, name);

Os métodos:

- (SoapObject) envelope.bodyIn: Obter a resposta do serviço Web.- getPropertyAsString(): Transformar o resultado em variáveis do tipo Texto.

2) org.ksoap2.serialization.PropertyInfo

Essa classe é usada para armazenar informações sobre cada propriedade do método a ser consumido do webservice. Os métodos são:

- setName(): Nome da variável que irá ser passada como parâmetro.- setValue(): Valor que deverá ser passado para a variável declarada

anteriormente.- setType(): Tipo de dados utilizado na variável.

Para adicionar estas propriedades em nossa classe “SoapObject” criada anteriormente deveremos implementar o método “addProperty()”.

Exemplo de utilização:

PropertyInfo cepProp =new PropertyInfo();cepProp.setName(“cep”);cepProp.setValue(“18999999”);cepProp.setType(String.class);soap.addProperty(cepProp);

3) org.ksoap2.serialization.SoapSerializationEnvelope

É uma classe que estende a classe ”SoapEnvelop” , com suporte para o for-mato “SOAP Serialization”, que representa a estrutura de uma mensagem SOAP serializado. A principal vantagem de serialização do SOAP é a portabilidade.

Exemplo de utilização:

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

A constante “SoapEnvelope.VER11” indica o SOAP versão 1.1. Faremos o uso de alguns métodos e propriedades, sendo:

- setOutputSoapObject (soap): Método responsável por designar o objeto

de solicitação “SoapObject” para o envelope como a mensagem de saída referente à chamada de método de SOAP.

- dotNet: propriedade booleana para definir a compatibilidade com o padrão de codificação .Net.

Exemplo de utilização:

Page 19: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013 19

envelope.dotNet = true;envelope.setOutputSoapObject(soap);

4) org.ksoap2.transport.HttpTransportSE

A classe “HttpTransportSE” representa uma camada “HttpTransport” ba-seada em “J2SE. HttpTransportSE”,ela estende a classe “org.ksoap2.transport.Transport” , que resume a serialização e desserialização das mensagens SOAP. Ao criar o objeto passamos como parâmetro a URL, que seria o endereço para consumir o Web Service.

Exemplo de utilização:

HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

Os métodos são:

- Call(SOAP_ACTION, envelope): responsável pela chamada usando como parâmetro o endereço do WebService + Método e o envelope SOAP.

Exemplo de utilização:

androidHttpTransport.call(SOAP_ACTION, envelope);

Criando o exemplo

No exemplo deste artigo iremos envolver todos os conceitos aprendidos anteriormente. O funcionamento deste exemplo será bem simples. Informa-remos o CEP para nos retornar o Endereço, Bairro, Cidade, Estado e Código IBGE. Para isto descreverei todos os passos daqui pra frente.

Inicie uma aplicação do Zero clicando em “File/New/Android Project...” criando uma classe chamada “ConsumindoWSActivity” para estender (extends) para a interface “Activity” (Nesta classe é onde chamaremos a classe principal mais adiante). Clique sobre o pacote e com o botão direito escolha “New/Class” escolhendo o nome como CEP. (nesta classe onde criaremos todos os métodos responsáveis pela consulta do CEP).

De imediato teremos duas classes. Ver Figura 03 para maiores detalhes.

Figura 03: Classes do Projeto.

Importando a Biblioteca “Ksoap2”

Depois de ter conhecido um pouco sobre este framework e de ter realiza-do o download, recomendo criar uma pasta chamada “Libs” no projeto para melhor organização. É ali onde armazenaremos nossas bibliotecas, que no caso seria apenas uma, a “ksoap2-android-assembly-2.5.8-jar-with-dependencies.jar”. Para importá-la clique com o botão direito escolhendo a opção “Proper-ties”. Em “Java Build Path” localize a aba “Libraries”. Clique em “Add JARs...” para adicioná-la ao projeto em questão. Ver Imagem 04.

Figura 04: Adicionado a Biblioteca Ksoap2.

Teremos todas as classes necessárias adicionadas ao projeto.

Classe “Cep.java”

O primeiro passo é importar as classes utilizadas ao decorrer do desen-volvimento, veja abaixo:

Page 20: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro201320

package pct.ConsumindoWS;import org.ksoap2.SoapEnvelope;import org.ksoap2.serialization.PropertyInfo;import org.ksoap2.serialization.SoapObject;import org.ksoap2.serialization.SoapSerializationEnvelope;import org.ksoap2.transport.HttpTransportSE;public class Cep {private static final String NAMESPACE = “http://www.byjg.com.br/”;private static String URL = “http://www.byjg.com.br/site/webservice.php/ws/cep”;private static final String SOAP_ACTION = “http://www.byjg.com.br/obterLogradouroAuth”;

Teremos três constantes, sendo:

NAMESPACE: O endereço do site que contém o Web Service.URL: O endereço do serviço Web Service.SOAP_ACTION: O endereço do site + método utilizado.

public String[] ObterLogradouro(String Cep) {SoapObject soap = new SoapObject(NAMESPACE, “obterLogradouroAuth”); String usuario = “usuario”; String senha = “senha”; PropertyInfo cepProp =new PropertyInfo(); cepProp.setName(“cep”); cepProp.setValue(Cep); cepProp.setType(String.class); soap.addProperty(cepProp); PropertyInfo usuarioProp =new PropertyInfo(); usuarioProp.setName(“usuario”);

usuarioProp.setValue(usuario); usuarioProp.setType(String.class); soap.addProperty(usuarioProp); PropertyInfo senhaProp =new PropertyInfo(); senhaProp.setName(“senha”); senhaProp.setValue(senha); senhaProp.setType(String.class); soap.addProperty(senhaProp);SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);envelope.dotNet = true; envelope.setOutputSoapObject(soap); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); try { androidHttpTransport.call(SOAP_ACTION, envelope); SoapObject result = (SoapObject) envelope.bodyIn; return result.getPropertyAsString(0).split(“,”); } catch (Exception e) { return null; } }}

O método ObterLogradouro() tem como parâmetro de entrada o Cep, uma variável do tipo String, e de saída uma variável do tipo “Array of strings”, pois a mesma nos retorna os dados de Endereço, Bairro, Cidade, Estado e Código IBGE. Instancie a classe “SoapObject” passando como parâmetros as constantes (NAMESPACE e ObterLogradouroAuth). Deixaremos como estático também as variáveis de autenticação Usuário e Senha (Lembrando que estas informações foram adquiridas no início do artigo). Criaremos três objetos

Page 21: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013 21

do tipo “PropertyInfo” , sendo o CEP, Usuário e Senha. Estas variáveis estão presentes no método “ObterLogradouroAuth()” . O método “soap.AddPro-perty” está incluindo todos estes dados na classe “SoapObject”. O Objeto “SoapSerializationEnvelope” representa a estrutura do SOAP, utilizaremos ele para serializar os dados. Ao criar o objeto “HttpTransportSE” passamos como parâmetro a URL, que seria o endereço para consumir o WebService comentado anteriormente. Dentro do bloco “Try...Catch” obtemos o resultado transformado em um Vetor de String.

Configurações no “AndroidManifest.xml”

A única alteração que não podemos esquecer-nos de programar neste arquivo seria a permissão para acesso a internet. Veremos a seguir o código necessário.

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

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

<application android:icon=”@drawable/icon” android:label=”@string/app_name”> <activity android:name=”.ConsumindoWSActivity” 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”

Usaremos 6 EditTexts, 6 TextViews e 1 Button para esta tela. Ver Imagem 05 uma sugestão para nossa interface gráfica.

Figura 05: Lay-Out Proposto.

O XML correspondente:

<?xml version=”1.0” encoding=”utf-8”?><LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:orientation=”vertical” android:layout_width=”fill_parent” android:layout_height=”fill_parent” > <LinearLayout android:layout_width=”match_parent” android:layout_height=”wrap_

Page 22: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro201322

content” android:id=”@+id/LinearLayout01”> <LinearLayout android:layout_width=”185dp” android:orientation=”vertical” android:layout_height=”wrap_content” android:id=”@+id/LinearLayout02”> <TextView android:layout_width=”wrap_content” android:text=”CEP” android:textAppearance=”?android:attr/textAppearanceMedium” android:layout_height=”wrap_content” android:id=”@+id/txtCep”> </TextView> <EditText android:id=”@+id/edtCep” android:layout_width=”168dp” android:layout_height=”wrap_content” android:inputType=”number” android:maxLength=”8”> </EditText> </LinearLayout> <LinearLayout android:layout_width=”match_parent” android:orientation=”vertical” android:layout_height=”wrap_content” android:id=”@+id/LinearLayout03”> <TextView android:layout_width=”wrap_content” android:text=” “ android:textAppearance=”?android:attr/textAppearanceMedium” android:layout_

height=”wrap_content” android:id=”@+id/TextView02”> </TextView> <Button android:id=”@+id/btnBuscar” android:layout_width=”90dp” android:text=”Buscar” android:layout_height=”wrap_content” android:onClick=”Buscar”> </Button> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width=”match_parent” android:orientation=”vertical” android:layout_height=”wrap_content” android:id=”@+id/LinearLayout04”> <TextView android:layout_width=”wrap_content” android:text=”Endereço:” android:textAppearance=”?android:attr/textAppearanceMedium” android:layout_height=”wrap_content” android:id=”@+id/TextView04”> </TextView> <EditText android:id=”@+id/edtEndereco” android:layout_width=”match_parent” android:layout_height=”wrap_content” android:editable=”false” android:enabled=”false”> </EditText> </LinearLayout> <LinearLayout android:layout_width=”match_parent”

Page 23: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013 23

android:orientation=”vertical” android:layout_height=”wrap_content” android:id=”@+id/linearLayout05”> <TextView android:layout_width=”wrap_content” android:text=”Bairro:” android:textAppearance=”?android:attr/textAppearanceMedium” android:layout_height=”wrap_content” android:id=”@+id/txtBairro”> </TextView> <EditText android:id=”@+id/edtBairro” android:layout_width=”match_parent” android:layout_height=”wrap_content” android:enabled=”false”> </EditText> </LinearLayout> <LinearLayout android:orientation=”vertical” android:layout_height=”wrap_content” android:id=”@+id/LinearLayout06” android:layout_width=”248dp”> <TextView android:layout_width=”wrap_content” android:text=”Cidade” android:textAppearance=”?android:attr/textAppearanceMedium” android:layout_height=”wrap_content” android:id=”@+id/txtCidade”> </TextView> <EditText android:id=”@+id/edtCidade” android:layout_height=”wrap_content” android:layout_width=”236dp”

android:enabled=”false”> </EditText> </LinearLayout> <LinearLayout android:layout_width=”match_parent” android:layout_height=”wrap_content” android:id=”@+id/LinearLayout07”> <LinearLayout android:orientation=”vertical” android:layout_height=”wrap_content” android:id=”@+id/LinearLayout08” android:layout_width=”154dp”> <TextView android:layout_width=”wrap_content” android:text=”Estado” android:textAppearance=”?android:attr/textAppearanceMedium” android:layout_height=”wrap_content” android:id=”@+id/txtEstado”> </TextView> <EditText android:id=”@+id/edtEstado” android:layout_height=”wrap_content” android:layout_width=”110dp” android:enabled=”false”> </EditText> </LinearLayout> <LinearLayout android:layout_width=”match_parent” android:orientation=”vertical” android:layout_height=”wrap_content” android:id=”@+id/LinearLayout09”> <TextView android:layout_width=”wrap_content” android:text=”Cód.

Page 24: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro201324

IBGE” android:textAppearance=”?android:attr/textAppearanceMedium” android:layout_height=”wrap_content” android:id=”@+id/txtCodIBGE”> </TextView> <EditText android:id=”@+id/edtCodIBGE” android:layout_height=”wrap_content” android:layout_width=”110dp” android:enabled=”false”> </EditText> </LinearLayout> </LinearLayout> </LinearLayout>

Codificando o exemplo (“ConsumindoWSActivity.java”)

Este é o momento onde usaremos a classe CEP criada anteriormente. Importaremos algumas bibliotecas básicas.

package pct.ConsumindoWS;

import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.EditText;

public class ConsumindoWSActivity extends Activity{ public EditText edtCep, edtEndereco, edtBairro, edtCidade, edtEstado, edtCodIBGE;

Armazenaremos o resultado nestas variáveis do tipo públicas.

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); InicializaListeners(); } public void InicializaListeners() { edtCep = (EditText) findViewById(R.id.edtCep);edtEndereco = (EditText) findViewById(R.id.edtEndereco);edtBairro = (EditText) findViewById(R.id.edtBairro);edtCidade = (EditText) findViewById(R.id.edtCidade);edtEstado = (EditText) findViewById(R.id.edtEstado);edtCodIBGE = (EditText) findViewById(R.id.edtCodIBGE); }

No método “OnCreate()” Inicializaremos os “listeners“ atribuindo corre-tamente para as variáveis. Recomendo sempre criar uma função para realizar este procedimento.

public void Buscar(View v) { if (edtCep.getText().toString().length() == 8) { Cep cep = new Cep();String[] resultado = cep.ObterLogradouro(edtCep.getText().toString()); try { edtEndereco.setText(resultado[0]); edtBairro.

Page 25: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013 25

[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

setText(resultado[1]); edtCidade.setText(resultado[2]); edtEstado.setText(resultado[3]); edtCodIBGE.setText(resultado[4]); } catch (Exception e) { edtBairro.setText(“”); edtCidade.setText(“”); edtEstado.setText(“”); edtCodIBGE.setText(“”); } } } }

No método Buscar, chamaremos o evento “Click” do Botão. Instancie a classe CEP e logo em seguida invoque o método “ObterLogradouro()”. Passa-remos como parâmetro o CEP informado. Trataremos também o resultado dentro de um bloco Try..Catch. Teremos um resultado idêntico ao da Figura 06.

Exemplo em “Run-Time”

Figura 06: Consulta de CEPs.

Referênciashttp://ksoap2.sourceforge.net/doc/

Conclusão

Aprendemos neste artigo quais são as etapas para consumir um Web Service utilizando a plataforma Android utilizando o Framework “Ksoap2”. Este WebService é totalmente gratuito e possui outros métodos que podem ser consumidos, como por exemplo: o ObterCepAuth(), que retorna o Cep a partir do logradouro, localidade ou unidade federativa. Fiquem a vontade para usá-lo caso ache necessário.

Espero que tenham gostado um forte abraço e até o mês que vem!

Page 26: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro201326

Listagem 1 – Uses e Variáveis.

Listagem 2 – Criar Documento com Texto e Imagens.

Em algumas aplicações necessitamos adicionar imagens dentro de documentos como, contratos, recibos, certificados entre outros. Para este tipo de necessidade utilizamos algumas ferramentas nativas do Windows, neste caso o Microsoft Word, porém para os desenvolvedores o mais funcional é tornar esta manipulação

automatizada, ou seja, nossa aplicação fica responsável por realizar as devidas mudanças em nossos documentos.

Nesta dica vamos mostrar como criar arquivos do Word pelo Delphi além de inserir e substituir imagens e textos.

Inicialmente nossa tela principal ficará parecida com a imagem abaixo:

Imagem 1 – Tela Principal.

Dentro deste exemplo teremos 4 dicas básicas ,como podemos observar na imagem.

Manipular dados no Microsoft Word com Delphi

Os exemplos são:

Exemplo 1: Criar o arquivo do Word com textos e Imagens.Exemplo 2: Buscar a palavra e substituir por outra.Exemplo 3: Inserir uma imagem no parágrafo indicado.Exemplo 4: Buscar a palavra e substitui pela imagem.

Dito isto vamos iniciar com a criação do arquivo Word, mas antes declare as variáveis e as Uses que vamos utilizar no decorrer do exemplo, conforme listagem abaixo:

UsesComObj, ClipBRD;

VarPath: string;Word, Arquivo, Doc: OleVariant;Clip: Integer;

Com as variáveis e “Uses” indicadas vamos para o código de criação do arquivo conforme listagem abaixo:

Procedure TForm1.btnCriarClick(Sender: TObject);var Word: Olevariant;begin Path := ExtractFilePath(Application.

Page 27: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013 27

Listagem 3 – Substituir Palavra.

ExeName); Word := CreateOleObject(‘Word.Basic’); Word.Filenew; Word.AppShow; Word.Appmaximize; Word.CenterPara; Word.FontSize(36); Word.Bold; Word.Underline; Word.Insert(‘Documento’); Word.FontSize(16); Word.Insert(#13 + ‘The - Club’); Word.FontSize(12); Word.Underline(false); Word.Bold(false); Word.Insert(#13 + ‘Exemplo para Anexar Imagem’); Word.Insert(#13’Imagem 1’#13); Word.Insertpicture(Path + ‘\Imagem1.jpg’); Word.Insert(#13’Imagem 2’#13); Word.Insertpicture(Path + ‘\Imagem2.jpg’);end;

Como podemos observar realizamos a criação da variável OleVariant (Word) que será nosso documento propriamente dito, portanto, passamos todos as configurações como, fonte, tamanho e também nossas imagens para que tudo seja inserido no arquivo. Se tudo correr bem o arquivo deve ficar conforme imagem 2.

Imagem 2 – Documento Criado.

Após a criação do arquivo podemos realizar algumas manipulações, como, substituir uma determinada palavra ou imagem.

Na listagem abaixo vamos demonstrar como realizar a substituição de uma palavra.

Procedure TForm1.btnSubstituirClick(Sender: TObject);var Ponteiro: integer;begin try Cursor := crHourGlass; Word := CreateOleObject(‘Word.Application’); Word.Visible := True; Arquivo := Word.Documents; Doc := Arquivo.Open(extractfilepath(application.exename) + ‘\Word.doc’); Ponteiro := -1; while Ponteiro <> 0 do begin Ponteiro := doc.Content.Find.Execute(edtLocalizar.Text, ReplaceWith := edtSubstituir.Text); end; finally Cursor := crDefault; end;end;

Imagem 3 – Exemplo 2

Veja que ao clicar no botão “Substituir Palavra” o documento é exibido, e após isso o comando “Find.Execute” faz a busca pelo trecho indicado em nosso campo Localizar. Quando encontramos o valor, ele fica indicado pelo nosso cursor, com isso utilizamos o comando “ReplaceWith” que irá receber o valor

Page 28: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro201328

Listagem 4 – Incluir Imagem no Parágrafo

Listagem 5 – Adicionar Imagem no TImage

passado em nosso campo Substituir e inserir no lugar do trecho encontrado.

Em nosso terceiro exemplo podemos incluir imagens seguindo o parágrafo do arquivo, abaixo segue a listagem do botão “Incluir Imagem”:

procedure TForm1.btnIncluirClick(Sender: TObject);var Paragrafo: OleVariant; Linha: Integer;begin Try Linha := StrToInt(edtLinha.Text); Cursor := crHourGlass; Word := CreateOleObject(‘Word.Application’); Word.Visible := True; Arquivo := Word.Documents; Doc := Arquivo.Open(extractfilepath(application.exename) + ‘\Word.doc’); // Passo o Paragrafo Paragrafo Paragrafo := Doc.Paragraphs.Item(Linha).Range; Try // Mude o endereço da Imagem para TestarDoc.Content.InlineShapes.AddPicture(‘C:\Users\Imagem1.jpg’, LinkToFile := False, SaveWithDocument := True, Range := Paragrafo); Except on E: Exception do begin ShowMessage(‘Falha ao localizar Imagem’); end; end; Finally Cursor := crDefault; end;end;

Imagem 4 – Exemplo 3

O foco do exemplo está no parâmetro “Range” que irá indicar a posição dentro do nosso documento. Para este caso criamos a variável “Paragrafo” que irá receber a posição da linha que passamos em nosso campo “Linha” e inserir a imagem no parágrafo indicado.

Para finalizar vamos criar uma rotina para inserir a imagem seguindo o texto digitado.

No desenvolvimento deste exemplo vamos utilizar a área de transfe-rência do Windows, ou seja, o objeto TClipBoard. Incialmente vamos utilizar um ‘SpeedButton’ para selecionarmos a imagem. Listagem abaixo mostra a codificação do botão “Add...”.

Procedure TForm1.sbtnAddClick(Sender: TObject);begin if OpenDialog1.Execute then begin Image1.Picture.LoadFromFile(OpenDialog1.FileName); Panel1.Caption := ‘ ‘; end;end;

Imagem 5 – Exemplo 4.

Page 29: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013 29

Listagem 6 – Adicionar Imagem no ClipBoard.

Listagem 7 – Substituir palavra por Imagem

Listagem 8 – Botão Outro

A imagem selecionada é inserida em nosso componente TImage, assim fica mais fácil para o usuário visualizar o que estamos manipulando, com isso já podemos carrega-la em nossa área de transferência. Abaixo listagem para adicionar a imagem em nosso ClipBoard.

procedure TForm1.btnClipClick(Sender: TObject);var Bitmap: TBitMap;begin try Bitmap := Image1.Picture.Bitmap; Clipboard.Assign(Bitmap); Image1.Picture.Assign(Clipboard); Clip:= 1; finally end;end;

Veja que já adicionamos a imagem ao nosso ClipBoard e já podemos utiliza-la. Outro ponto importante está na variável “Clip” que recebe o valor ‘1’, ela será utilizada para criação de uma rotina de ativação dos botões, mas isso será tratado mais a frente.

Na listagem abaixo utilizamos o comando “Word.Selection.Find.Execute(edtPalavra.Text)” para atribuir o cursor na palavra que indicamos, assim o comando “Word.Selection.Paste” irá colar nossa imagem no local da palavra, abaixo listagem de exemplo:

Procedure TForm1.btnSubstituirimagemClick(Sender: TObject);begin try Cursor := crHourGlass; Word := CreateOleObject(‘Word.Application’); Word.Visible := True; Arquivo := Word.Documents; Doc := Arquivo.Open(extractfilepath(application.exename) + ‘\Word.doc’); Word.Selection.Find.Execute(edtPalavra.Text); Word.Selection.Paste; ShowMessage(‘Alteração Concluída’); Except on E: Exception do begin ShowMessage(‘Falha ao colar Imagem’);

end; end;end;

Imagem 6 – Imagem Confirmar.

Veja que quando é feita a inserção o documento do Word é exibido com a Imagem já adicionada, neste caso se houver a necessidade de adicionarmos uma nova imagem nesse arquivo vamos utilizar o botão “Outro” que realiza apenas a busca pela palavra indicada. Abaixo listagem do botão.

procedure TForm1.btnOutroClick(Sender: TObject);begin Try Word.Selection.Find.Execute(edtPalavra.Text); Word.Selection.Paste; ShowMessage(‘Alteração Concluída’); Except on E: Exception do begin ShowMessage(‘Arquivo Word não encontrado’); end; end;end;

Neste caso o arquivo deve estar sendo exibido para que a inclusão ocorra com sucesso. Na imagem 7 podemos visualizar como a ação é executada. Adicionamos um novo arquivo (.bmp) ao nosso TImage e indicamos a nova palavra a ser substituída no “edtPalavra”.

Page 30: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro201330

Listagem 9 - OnClose

Listagem 10 – Botão “Del...”

Listagem 11 - Timer

[email protected]

Jeferson Silva de LimaConsultor The Club.

Sobre o autor

Imagem 7 – Adicionando outra Imagem.

Imagem 8 – Imagem Cancelar.

Como havia comentado anteriormente a variável “Clip” será utilizada para a criação de uma rotina de ativação dos botões, no qual tem a finalidade de evitar erros no decorrer da aplicação.

Quando nossa aplicação é finalizada passamos o valor zero para a variável “Clip” e limpamos a área de transferência, assim nosso controle de botões poderá identificar quando temos algum dado em nosso “ClipBoard”. Abaixo listagem do evento “Onclose” e botão “Del...”.

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begin Clipboard.Clear; Clip:= 0;end;

procedure TForm1.sbtnDelClick(Sender: TObject);begin Clipboard.Clear; Clip:= 0;end;

Para a criação da rotina dos botões utilizamos um Timer que irá verificar

determinadas ações que vamos definir para poder ativar ou não nossos botões.

Procedure TForm1.Timer1Timer(Sender: TObject);begin btnSubstituirimagem.Enabled:= (edtPalavra.Text <> ‘’) and (Clip = 1); btnOutro.Enabled:= (btnSubstituirimagem.Enabled) and (Clip = 1); btnClip.Enabled:= Image1.Picture.Bitmap.Empty = False; sbtnDel.Enabled:= Clip = 1; btnSubstituir.Enabled:= (edtSubstituir.Text <> ‘’) and (edtLocalizar.Text <> ‘’); btnIncluir.Enabled:= edtLinha.Text <> ‘’;end;

Conclusão Neste artigo vimos algumas das muitas formas de integrar o Delphi com

componentes externos. O uso da classe Variant auxilia na manipulação de objetos de automação que em nosso caso se tratam de arquivos do Word. Portanto, podemos utilizar este e outros exemplos como base para imple-mentar nossos projetos.

Bom é isso pessoal, espero que tenham gostado e até a próxima!

Page 31: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013 05

Page 32: The Club - megazine - The Club - O maior clube de ... · a fonte de dados (consulta no Delphi). Adicione um Chart object e será aberto seu editor de configuração (Figura 1)

setembro2013