The Club - megazine · Curso Delphi Parte I No dia 14 de ... A versão 2 do Delphi coincidiu com o...

32
abril 2012

Transcript of The Club - megazine · Curso Delphi Parte I No dia 14 de ... A versão 2 do Delphi coincidiu com o...

abril 2012

abril 2012

abril 2012 03

Desafio The Club

- Dicas Delphi

Dicas

- Cruzada

30

Delphi Android

DelphiDelphi

Android - Trabalhando com Widgets

Android

Linguagem C# - Estruturas de Repetição

índiceLendo artigos RSS (Feed) no Delphi

Editorial

12Olá amigos do The Club, aqui estamos

com mais uma edição da The Club Magazine , feita especialmente para vocês . Primeiramente gostaria de... 04

Curso Delphi - Parte I

05Delphi XE2 - Data Explorer, uma ferramenta prática para nossos dias. 15

28

18

LegendaInicianteIntermediárioAvançado

Autor:Eduardo Massud

Autor: Vitor Scarso

Autor: Luciano Pimenta

Autor: Thiago C.Montebugnoli 22Autor: Marcos

César Silva

abril 201204

Bem-vindo

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. Primeiramente gostaria de agradecer aos associados quem vem utilizando nosso suporte relacionado ao C# e ao Android. Para mim, sinceramente, é um prazer poder auxiliá-los no aprendizado de uma nova linguagem de programação, possibilitando a abertura de novos caminhos em suas vidas. Quero agradecer também os programadores Delphi, que por sinal sua praticidade e compatibilidade se destacada a cada nova versão lançada.

Começamos com o artigo de nosso colaborador Luciano Pi-menta, trazendo a primeira parte do Curso em Delphi XE2. Neste primeiro artigo ele abordará assuntos essenciais para quem está começando a programar em Delphi e para aqueles mais experien-tes a possibilidade de se aprofundar um pouco mais no assunto. Já o colaborador Vitor Scarso, que já trabalhou e escreveu muitos artigos para o The Club, está de volta e vem com um artigo rela-cionado ao Delphi XE2 junto com sua ferramenta Data Explorer, dandos dicas e exemplos práticos de utilização. Nosso consultor Eduardo Massud nos ensina como ler artigos RSS no Delphi sendo que os mesmos têm como principal função uma constante atua-lização de dados para o usuário. Eu continuo escrevendo artigos relacionados ao Android, sendo que neste mês dou algumas dicas de manipulação dos principais Widgets desta plataforma. Marcos César Silva continua com a caminhada no aprendizado da Linguagem C#, aplicando em exemplos práticos as denominadas e conhecidas estruturas de repetição.

A seção de “Dicas Delphi” está como sempre recheada das melhores dicas que com certeza um dia serão de grande utilidade.

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 2012

Diretor TécnicoMarcos César Silva

DiagramaçãoEduardo Massud

Vitor M. Rodrigues

ArteVitor M. Rodrigues

RevisãoEliziane Valentim

ColunistasEduardo MassudLuciano Pimenta

Thiago Cavalheiro MontebugnoliMarcos César Silva

Vitor Scarso

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.

abril 2012 05

Delphi

Curso Delphi Parte I

No dia 14 de fevereiro de 2012, come-morou-se 17 anos de umas das melhores “linguagem” e ferramenta da história do de-senvolvimento de softwares. O nosso querido Delphi. Para celebrar a The Club começa neste artigo uma série sobre Delphi mostrando desde o iniciante, que quer aprender, assim como o desenvolvedor mais antigo.

Quero mostrar aqui dicas de desenvol-vimento, de IDE, características da produ-tividade do Delphi, ou seja, a série é válida para o desenvolvedor iniciante, assim como o que esteja a mais tempo trabalhando com o Delphi.

Um pouco de história...

Em 1993 a Borland, começa a desenvolver um projeto para a criação de um ambiente visual para criar aplicações Windows utilizando a linguagem Object Pascal. O mais interessante que o nome Delphi era o codinome do projeto, ou seja, versão beta e que por questões comerciais não deveria ter ligação com o nome final e comercial do produto.

Mas quando da definição do nome final, nenhuma sugestão agradou, pesquisas com usu-ários betas, assim como pessoal especializado em marketing não chegaram a um consenso e o nome Delphi ficou popular, passando para o nome oficial do produto, lançado em 1995.

Na Figura 1, temos a caixa do produto em sua versão 1.0.

Figura 1. Caixa do Delphi 1.0

O arquiteto do projeto e que ficou conhecido

abril 201206

como “pai” do Delphi foi Anders Heilsberg (tam-bém criador da linguagem C#), mas podemos citar outros, como: Chuck Jazdzewski, Allen Bauer, Zack Urlocker, Richard Nelson e Danny Thorpe.

Desde o inicio, Delphi sempre foi pioneiro em tecnologias para o desenvolvimento de softwares, como conexão com banco de dados, programação Orientada a Objetos, ambiente de desenvolvimento rápido (RAD - Rapid Application Development).

A versão 2 do Delphi coincidiu com o Windows 95 e o desenvolvimento para 32 bits, mas como ficamos acostumados, Delphi era totalmente compatível com versão 16 bits. Na versão 3, Delphi inovou mais uma vez, pois foi a primeira ferramenta a ter suporte para criar aplicações multi-camadas em um ambiente RAD.

O Delphi 4 trouxe suporte aos mais recentes padrões de mercado naquele momento: CORBA, ORACLE 8, além de criação de controles ActiveX/Active Forms. O Delphi 5 inovou com o suporte a manipulação fácil de arquivos XML, além de supor-te a nova tecnologia de acesso a dados: ADO. Além disso, apareceram novas ferramentas, como para controle de versão: TeamSource.

A versão 6, trás suporte a Web Services, além de mostrar: BizSnap, DataSnap e WebSnap. Jun-tamente com a versão 6, nasce o Kylix, primeira ferramenta RAD para Linux, para criação de apli-cativos cross-plataform. No Delphi 7 aparecem os primeiros indícios de suporte a nova plataforma que estava nascendo, o .NET.

Nessa versão, temos um compilador para .NET, mas o ambiente do Delphi ainda não da suporte, teríamos que criar aplicações, totalmente manuais, sem as facilidades de componentes e modelagem rápida.

Ainda nessa versão, não temos mais o Object Pascal como linguagem, mas sim a Delphi Langua-ge, mudança de nome para fins comerciais.

O Delphi 8, na minha opinião, foi uma das piores versões já lançadas, suportava apenas apli-cações .NET, o que confundiu alguns desenvolve-dores e sua IDE mudou drasticamente, sendo mais pesada, consumindo muita memória.

Temos agora o Delphi 2005, que promete ser a primeira ferramenta a ter ambiente de desenvolvi-

mento para Win32 e .NET (Delphi e C#). Teve inicio a arquitetura ALM desenvolvida pela Borland, onde temos ferramentas para controlar todo o clico de vida do projeto, desde requisitos até a finalização do mesmo.

O Delphi 2006, foi a última versão da Borland, que juntamente com o Delphi 2007, trouxe algumas novidades no desenvolvimento para .NET e Win32, com a criação de novos componentes para suporte ao Windows Vista e suporte a novas versões do .NET Framework.

No Delphi 2009, já tivemos modificações signi-ficativas, onde não existe mais o mesmo ambiente para Win32 e .NET. A empresa, em uma solução radical (no olhar de alguns desenvolvedores), apro-veitou que o Visual Studio (principal concorrente), “libera” o seu ambiente de desenvolvimento (shell) para outras linguagens, utilizou o mesmo e come-çou a disponibilizar o Delphi Prism.

Imagine você desenvolver em Pascal (na ver-dade se chama Oxygene, da RemObjects, parceira da Embarcadero), usando o Visual Studio. Foi um verdadeiro choque na comunidade. Na defesa da Embarcadero, a vantagem de usar o ambiente do Visual Studio, seria que o desenvolvedor estaria sempre com a versão mais recente do .NET Fra-mework, além de tecnologias como LINQ, WPF, ASP.NET, Windows Forms etc.

Mesmo assim, a versão Win32 do Delphi 2009, trouxe novidades como suporte a Generics, méto-

dos anônimos e Ribbon. No Delphi 2010, tivemos o suporte a criação de aplicações touchpad, para criar interfaces onde o usuário interage com a mesma usando toque no monitor. Uma grande novidade.

Agora temos as versões XE e XE2. O XE trouxe suporte ao Windows Azure (desenvolvimento em nuvens) e novidades no DataSnap. O XE2 trouxe novidades significativas como suporte a desenvol-vimento de projetos em 64 bits, aplicações multi--plataformas para Windows e OS (Mac), criação de aplicações 3D e HD com um framework chamado FireMonkey entre outros.

Em 2010 foi lançado o Delphi for PHP, ambiente de desenvolvimento para aplicações Web usando PHP. Nesse artigo, vamos usar a versão atual, XE2 para mostrar as características dessa ferramenta.

Conhecendo o Delphi XE2

Caso você não tenha instalado o Delphi, acesse https://downloads.embarcadero.com/free/delphi para baixar uma versão trial de 30 dias. Sua instala-ção é simples. Ao abrir o Delphi, temos a imagem da tela de Splash (Figura 2).

Veja a figura 02.

Após essa tela, o ambiente é mostrado (Figura 3). Na imagem, já criei uma aplicação do tipo VCL Forms.

Figura 2. Tela de abertura do Delphi XE2

abril 2012 07

Veja a figura 3.

Para entender o ambiente, na parte superior temos os menus e botões na barra de ferramentas, onde podemos: criar projetos, criar novos itens de projeto, salvar, executar, depurar o projeto etc. no painel do lado esquerdo, temos o Object Inspector, que contém as propriedades e eventos dos controles selecionados na parte central da janela (Figura 4).

Veja a figura 04.

No painel esquerdo, temos várias ferramentas, distribuídas em abas. A primeira que aparece, é o Project Manager, onde temos os arquivos do nosso projeto, e onde podemos excluir, adicionar novos projetos ou arquivos. Temos também o Model View (Figura 5) onde podemos criar diagramas UML.

Figura 5. Criando diagramas no Model View

A outra aba é o Data Explorer para podermos criar conexões com banco de dados (os mais diver-sos) como podemos ver na Figura 6.

Veja a figura 6.

Ainda no lado direto, temos a Tool Palette (Fi-gura 7) que possui os componentes da VCL, umas das bibliotecas de componentes visuais mais ricas

Figura 4. Object Inspector para configurar propriedades e eventos

Figura 3. Ambiente de desenvolvimento do Delphi XE2

abril 201208

das ferramentas de desenvolvimento. Esta presente no Delphi desde a sua primeira versão e a cada nova versão ganha mais componentes, sem perder é claro, a compatibilidade com versões anteriores.

Veja a figura 7.

Essa configuração dos painéis é a padrão, mas isso não quer dizer que você não possa colocar o layout da ferramenta, com a sua configuração. Os painéis são dockáveis, ou seja, podem ser arras-tados e adaptados em qualquer dos dois lados (direita ou esquerda).

Para salvar sua configuração, basta digitar uma nova na caixa de seleção de layout na parte superior e clicar no botão ao lado para salvar (Figura 8).

Figura 8. Salvando a configuração do layout

Nessa caixa de seleção, temos algumas confi-gurações prontas, como a Classic Undocked, onde todas as janelas não ficam dockáveis, padrão das primeiras versões do Delphi (Figura 9), assim como a Tool Palette na parte superior.

Figura 9. Padrão clássico do ambiente do Delphi

Para configurar as opções temos um editor para deixar o Delphi como queremos. Acesse o menu Tools>Options e veja a quantidade de in-

Figura 6. Criando conexões com vários tipos de SGBD no Data Explorer

Figura 7. Algumas abas da Tool Palette do Delphi XE2

formações que podemos customizar como: cores do editor de código, componentes da Tool Palette entre outras (Figura 10).

Figura 10. Editor de opções do Delphi

abril 2012 09

Veremos algumas dessas opções com mais calma, no decorrer dos nossos artigos. Ainda no editor, podemos customizar em muitas caracterís-ticas a Tool Palette, seja em tamanho dos ícones, cores, modo de exibição, etc. Acesse o item Tool palette no editor e veja na Figura 11 as configura-ções que temos para a “paleta de componentes” do Delphi XE2.

Veja a figura 11

No item Colors, podemos formatar as opções de cores que queremos ou ainda, escolher os es-quemas de cores pré-definidos. Veja na Figura 12 um pouco de configuração da Tool Palette.

Figura 12. Tool Palette com Caption lateral, novas cores

Primeiros passos

Bom, agora que conhecemos o ambiente, pre-cisamos usar o mesmo. Vamos criar uma aplicação simples, um conhecido: Alô mundo. No Delphi, acesse o menu File>New>Other e na janela que se abre, escolha Console Application (Figura 13).

Veja a figura 13.

Nota: vou tomar por base que o leitor já possui algum conhecimento em lógica de programação. Assim, focarei na sintaxe do Delphi em si no desenvolver do curso.

Figura 11. Configurando a opções da Tool Palette

Figura 13. Criando uma aplicação console

Você deve estar se perguntando: “mas Luciano, você não falou que Delphi, desde a primeira versão, foi sucesso por que criava aplicações rápidas para Windows. E Você mostra uma aplicação console?”. Calma, uma coisa de cada vez, estamos iniciando no Delphi .

Após criada a aplicação, veja que no editor, aparece apenas algumas linhas de código. Digite

entre o bloco try e except, o seguinte código:

Writeln(‘Alô mundo’);Writeln(‘The Club’);Readln;

Nota: Note que para escrever um texto

abril 201210

usamos aspas simples (‘). Assim que o Delphi identifica que vamos referenciar um texto (string). Veremos mais detalhes sobre isso e outras características nas próximas edições da nossa série.

O código irá escrever duas linhas na janela do DOS. O comando Readln é usado para que sua tela fique parada após a execução dos dois primeiros códigos. Sem ela, a tela do DOS apenas piscará e você não conseguirá ver o texto apresentado.

Aperte F9 para executar a aplicação. Veja na Figura 14 a aplicação rodando.

Vejaa figura 14.

Para terminar a execução do programa, basta fechar a janela do DOS. Simples não. Mas agora, vamos melhorar isso.

Aplicações Windows

Acesse o menu File>New>VCL Forms Applica-tion. Um formulário padrão Windows será criado. Aperte a tecla F12 e veja que o editor de código, possui muito mais código, pois nosso formulário é uma classe. Ele tem várias características já implementadas, como por exemplo, os botões de fechar, minimizar e maximizar. Não precisamos nos preocupar com o fechar do formulário quando clicarmos no botão X.

Aperte F9 para visualizar o formulário em execução. Vamos fazer o mesmo exemplo anterior, escrever um texto. Mas agora, vamos usar controles de tela: botão, caixa de texto e rótulo. Assim, adi-cione no formulário (aperte F12 novamente, para voltar ao formulário e sair do editor) um Button, um Edit e um Label, que estão na aba Standard da Tool Palette.

Veja na Figura 15 como ficou os componentes distribuídos no formulário.

Se você quiser limpar o valor Edit1 da caixa de texto, selecione o componente e acesse a proprie-dade Text no Object Inspector. Para alterar entre as propriedades dos componentes, basta selecionar o mesmo que no Object Inspector trará apenas as propriedades do controle selecionado.

Figura 14. Aplicação console em execução

Qual o objetivo desse programa. O usuário digitará um texto na caixa de texto e ao clicar no botão, temos que mostrar no Label o valor digita-do. Bem simples né? Para pensar: onde devemos digitar o código? (barulho de relógio: tic tac tic tac).

Bom, se o usuário deve digitar um texto, clicar no botão para o mesmo aparecer no Label acredito eu que deva ser no botão. OK, é o botão, mas agora, o que fazer?

Os componentes possuem eventos, de acordo com suas características, por exemplo: o botão pos-sui o evento Click, por que o usuário vai clicar nele para executar alguma tarefa. No botão também temos um evento que ocorre quando o usuário coloca o mouse sobre o componente.

Nem todos os controles possuem o evento Cli-ck, pois não é de sua caraterística receber o clique do mouse. Já achamos o evento, agora precisamos saber como fazer o código. Dê um duplo clique no

Figura 15. Distribuição dos componentes no formulário

botão e veja que fomos direcionados para o editor de eventos em um código chamado Button1Click.

Esse evento é executado quando clicamos no botão, então nosso código de mostrar no Label o valor do Edit, deve ser aqui. Digite o seguinte código:

Label1.Caption := Edit1.Text;

Para você que não conhece muito de Delphi, a idéia é preencher a propriedade Caption do Label com o valor digitado no Edit, que esta armazenada na propriedade Text. Se você digitou o nome do objeto Label1 e Edit1 e digitou ponto (.), deve ter notado que uma caixa com código apareceu.

É o Code Insight do editor de códigos do Delphi (Figura 16).

Veja a figura 16.

abril 2012 11

Ele mostra as propriedades que o objeto que precede o ponto (.) possui. Assim, fica fácil de en-contrar uma propriedade, pois o Code Insight filtra os nomes, de acordo com o que for sendo digitado. Você também pode usar uma combinação de teclas para acessar o Code Insight.

Em qualquer parte do editor de código, basta apertar Ctrl + Space (barra de espaço) que o Code Insight será mostrado. Útil para quando não lem-brarmos o nome de algum controle em tela ou variável. Você também pode configurar para que o mesmo apareça sempre que utilizarmos o teclado (ao digitar qualquer tecla).

Acesse o editor de opções (Figura 10) e no item Editor Options>Code Insight, marque a opção Auto Invoke. Não esqueça de escolher em Source file type a opção Pascal (Figura 17).

Veja a figura 17.

Podemos configurar ainda o tempo de apare-cimento do Code Insight (Delay), hints etc. Agora, precisamos testar nossa primeira aplicação em Delphi. Aperte F9 para executar e mostrar o for-mulário. Digite algum texto e clique no botão. O valor digitado será mostrado no Label (Figura 18).

Figura 18. Aplicação em execução

Parabéns, você criou seu primeiro programa em Delphi .

Conclusões

Iniciamos nesse artigo, uma série para você aprender Delphi ou se já tem conhecimento, aprofundar um pouco mais sobre essa maravilhosa ferramenta de desenvolvimento. Nos próximos artigos vamos conhecer mais a fundo a linguagem Delphi com sua sintaxe e comandos mais comuns para o desenvolvimento de aplicações Windows.

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

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

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

Sobre o autor

Luciano Pimenta

www.lucianopimenta.net

Figura 16. Code Insight no Delphi

Figura 17. Configurando o Code Insight

abril 201212

Lendo artigos RSS (Feed) no Delphi

Os artigos RSS (Rich Site Summary) são uma forma simplificada de apresentar o conteúdo de um site, todo documento RSS é baseado na linguagem XML e geralmente exibe um grande volume de informações exis-tentes em uma página na internet, exibindo um conteúdo resumido ao leitor, e que por ter essa característica de alimentar notícias constantemente, esses artigos ganharam o nome de “Feeds”.

Para que possamos criar um leitor RSS preci-samos fazer com que ele leia esses arquivos XML, uma curiosidade é que todo arquivo XML dos Feeds tem a mesma estrutura, o que facilita a vida dos programadores ao precisar ler os nós (nodes) do arquivo XML, tornando assim um padrão para todos os arquivos.

O primeiro passo é baixar um arquivo tempo-rário, que é o arquivo XML que irá servir de base para receber todos os feeds dos sites.

function BaixarXML(const

link, Temporaria :

TFileName) : boolean;

begin

Result:= True;

with TDownLoadURL.

Create(nil) do

try

URL:= link;

Filename:= Temporaria;

try

ExecuteTarget(nil);

except

Result:= False;

end;

finally

Free;

end;

end;

Veja a figura 1

Após baixar o arquivo XML, iremos salvar o arquivo temporário (também padrão para leitura de arquivos RSS), o qual tem o nome de “temp.adpheadlines.xml”, esse arquivo armazena todos os dados de arquivos gerado temporariamente no computador, funcionando como um motor de leitura dos arquivos RSS, ele irá retornar toda a estrutura padrão de arquivos XML que possibilitará ler a estrutura de um arquivo RSS de qualquer site.

abril 2012 13

procedure TForm1.

btnAtualizarClick(Sender:

TObject);

var

link, STitle, sDesc,

sLink, Temporario: String;

StartItemNode, ANode:

IXMLNode;

begin

link:= edUrlXml.Text;

Temporario:= IncludeT

railingPathDelimiter(Ex

tractFilePath(Applicat

ion.ExeName)) + ‘temp.

adpheadlines.xml’;

Screen.Cursor:=

crHourglass;

Interessante é fazer uma verificação se o arqui-vo XML temporário e o Feed da página solicitada foi baixado, caso não tenha sido, verifique se há conexão com a internet.

try

if not BaixarXML(link,

Temporario) then

begin

Screen.Cursor:=

crDefault;

Raise

Exception.

CreateFmt(‘Impossível

conectar à Internet,

veja se você já está

conectado!’,[]);

Exit;

end;

E caso o arquivo do RSS contenha erro ou não esteja em seu destino será informado também um aviso de erro ao usuário.

if not

FileExists(Temporario)

then

begin

Screen.Cursor:=

crDefault;

raise

exception.

Create(‘Não foi possível

encontrar as Headlines’);

Exit;

end;

lvFeedList.Clear;

XMLDoc.FileName :=

Temporario;

XMLDoc.Active:=True;

Caso o arquivo esteja correto ele irá ler as tags XML correspondente a cada artigo, que estarão exi-bidos em um componente ListView, neste exemplo

StartItemNode:=XMLDoc.

DocumentElement.

ChildNodes.First.

ChildNodes.

FindNode(‘item’);

ANode :=

StartItemNode;

repeat

sTitle:= ANode.

ChildNodes[‘title’].Text;

sDesc:= ANode.

ChildNodes[‘description’].

Text;

sLink:= ANode.

ChildNodes[‘link’].Text;

with lvFeedList.

Items.Add do

begin

Caption:= STitle;

SubItems.

Add(sLink);

SubItems.

Add(sDesc)

end;

ANode:= ANode.

NextSibling;

until

ANode = nil;

finally

DeleteFile(Temporario);

Screen.Cursor:=

crDefault;

end;

end;

E por fim, para exibirmos o conteúdo de cada Feed, foi inserido um WebBrowser na aplicação que irá abrir a página correspondente ao artigo listado na RSS no momento que o usuário der um duplo clique no artigo.

Figura 1. Arquivo temporário gerado

abril 201214

procedure TForm1.

lvFeedListClick(Sender:

TObject);

var

i: integer;

url: String;

begin

url:= lvFeedList.

Items[lvFeedList.selected.

index].SubItems[i];

WebBrowser1.

Navigate(url);

end;

Veja a figura 2.

Obs: Os componentes utilizados neste exemplo foram 1Edit, que recebe a url (que é informada pelo site de notícias) do RSS,

Consultor Técnico The Club.

Sobre o autor

Eduardo Massud

[email protected]

1 ListView, que irá listar em grade todas as matérias em destaque da RSS, 1XMLDocu-ment, que será o responsável por gerenciar os arquivos XML temporário e do site, além de 1 WebBrowser que irá exibir a página do artigo selecionado.

Figura 2.

Conclusão

Todo RSS tem a função de informar o leitor com matérias atuais sem perder a agilidade, o que traz muita vantagem em aplicações que contém áreas de leituras especificas onde a informação é fundamental e constante, como no meio rural, onde clima e condições específicas influenciam o produtor rural, assim como em outras áreas.

abril 2012 15

Delphi XE2Data Explorer, uma ferramenta prática

para nossos dias.

Sem dúvida o Delphi é uma ferramenta prática e produtiva. Trabalhando com a versão Delphi XE2 vou destacar algumas ferramentas que tal versão oferece para tornar o desen-volvimento dos nossos projetos mais rápidos. A primeira “ferramenta” é o Data Explorer, é um painel que nos fornece uma conexão direta com o banco de dados, oferecendo as principais funções para manipular nosso BD (Banco de Dados), facilitando a consulta às informações do nosso BD eliminando o uso de aplicações de terceiros. Normalmente o Data Explorer está localizado do lado direito da interface do Delphi XE2 (Figura 01).

Podemos observar que o do DBEXPRESS pode acessar diversos tipos de bancos de dados como: MySQl, Firebird, Interbase e outros.

Nessa matéria vou trabalhar com um BD do Firebird, criei um banco com o nome LABDADOS.FDB, você poderá usar qualquer banco que tenha para acompanhar a matéria.

Criando Conexão

Agora criaremos um acesso ao banco de da-dos Firebird, clique com o botão direito no item Firebird e escolha a opção “Add New Connection”, depois digite o nome da conexão e clique em “OK”. Observe que na árvore do item Firebird já aparece o objeto da nova conexão que criamos. No projeto que estou trabalhando adicionei uma conexão cha-mada “Laboratorio”. Clique com o botão direito no item Laboratório e escolha “Modify Connection”. Adicione o caminho, usuário e senha de acesso ao Banco de dados nos campos Database, User e Password. (Figura 02)

Figura 01: Data Explorer.

abril 201216

Explorando o BD

Após concluir a conexão observe que na árvore do Data Explorer no item Laboratório já é possível ter o acesso as tabelas, procedures da base de dados. Um recurso interessante é o acesso as Procedures e Functions do banco de dados, isso é muito bom até porque um BD pode ter vários procedimento e funções e podemos acessar de maneira individual cada um deles. Claro que cada função do Data Explorer depende o objeto escolhi-do na árvore, para mostrar as opções disponíveis para cada objeto basta clicar com o botão direito do mouse sobre o objeto. Veja a Figura 03 selecionei o objeto procedure: SP_GEN_DESPESA e cliquei na opção “View parameters”. A IDE do Delphi vai mostrar todos os parâmetros desta procedure e também a opção de executá-la.

Veja a figura 3.

Opções de cada objeto do Data Ex-plorer

Providers - Provedores: Os seguintes coman-dos estão disponíveis quando selecionamos os objetos como Interbase, Firebird, MySQL, DB2:

Refresh - Atualiza todas as conexões defenidas do provedor.

Add New - Connection Adicionar uma nova conexão no Data Explorer.

Comandos de uma determinada conexão ao provedor: Os seguintes comandos estão disponíveis quando selecionamos um determinado acesso ao BD. Como no caso da matéria selecionamos o objeto “Laboratório” que pertence ao provedor FIREBIRD.

Refresh - Atualiza as informações da conexão.

Delete Connection - Apaga a conexão.

Modify Connection - Modifica as informações de acesso ao BD.

Close Connection - Encerra a conexão com o banco de dados.

Rename Connection - Renomeia a conexão.

Figura 02: Conexão.

Figura 03: Opções.

SQL Window - Abre o Query Builder, aonde você pode editar e escrever comandos SQL. Quando você utiliza essa ferramenta para digitar os comandos os resultados do SQL são exibidos na parte de baixo da tela. O uso dessa ferramenta pode facilitar muito o trabalho do programador. Mas isso é assunto para outra matéria.

Comandos do objeto TABLE : comandos quan-do selecionamos uma tabela:

Refresh - Atualiza as informações.

Retrieve Data From Table - Abre o Code Editor, mostrando todos os dados da tabela selecionada. Nessa tela pode organizar e modificar os dados,

abril 2012 17

mas as alterações não serão salvas no BD.

Drop Table - Excluir a tabela selecionada.

Alter Table - Abre o Code Editor. Podendo modificar a estrutura das tabelas, no final das alterações poderá confirmar as alterações na tabela no BD.

Copy Table - Copia a estrutura e os dados da tabela selecionada.

Paste Table - Com essa opção é possível migrar uma tabela para provedores diferentes, copia a estrutura e os dados, porem os dados não serão substituídos se já existirem.

Migrates the table structure and data copied from a given provider to the selected provider. Although you must select a table in the target provider, no data will be overwritten.

Comandos do objeto VIEW:

Refresh Atualizar as informações.

Retrieve Data From View Exibe os dados da VIEW (visão) selecionada. Poderá modificar os dados e organiza-los como desejar, porem as alterações não serão salvas.

Comandos do objeto Stored Procedure: Quando selecionamos uma procedure apresenta os seguintes comandos:

Refresh - Atualiza as informações.

View Parameters - Abre o CodeEditor e exibe todas as informações da procedure selecionada. Oferencendo a opção de executar a SP na própria IDE do Delphi. Como foi mostrado no exemplo da matéria.

Drag and Drop

Um recurso interessante do Data Explorer é a opção de arrastar-e-soltar (drag and drop). Se selecionarmos o objeto “Laboratorio”, que é a conexão com o BD podemos arrastar e soltar no nosso projeto Delphi, assim é criado um compo-

nente TSQLConection com todas as informações da conexão que criamos no DataExplorer. (Figura 04)

Veja a imagem 4.

Conclusão

Enfim a ferramenta DataExplorer nos oferece

Figura 04: Arrastar e Soltar.

Consultor Técnico do The Club, trabalha com programaçãohá 10 anos e é formado em Técnico de Informática.

Sobre o autor

Vitor Scarso

[email protected]

muitos recursos para a manipulação, edição de dados. Também oferece um acesso a ferramenta QueryBuilder para trabalhar com o BD que criamos. Cada vez mais vemos que o Delphi tem se tornado uma ferramenta prática e produtiva, logo publica-rei mais temas sobre o Delphi e suas versões. Se desejar saber sobre um assunto específico ficarei feliz em ajudar, entre em contato por email ou pelo The Club. Até mais!

abril 201218

Android Trabalhando com Widgets

Quando se fala em “Widgets” todo mundo pensa em mini aplicativos para personalizar seu celular ou tablet, aplicativos que oferecem diversas opções, por exemplo: relógios personalizados, indicadores de carga de bateria ou até mesmo botões e funções que facilitam o uso do aparelho. Na realidade eu gosto muito destas tecnologias, acho legal e interessante deixar meu Smartphone ou tablet um tanto diferente dos outros, mas para quem não sabe, os denominados “Componentes” em linguagem de programação Delphi ou C# são os conhecidos “Widgets” na progra-mação para Android. Montarei alguns exemplos básicos de utilizações destes componentes, como: o TextView, EditText, Button, RadioButton, CheckBox, entre outros.

Conceitos Básicos

A classe “View” é responsável pela criação de qualquer componente gráfico, sendo a base para os componentes visuais. Já a classe “Widget” é a classe filha de “View”, representando os componentes.

Exemplo: EditText – android.widget.EditText.

Algumas propriedades fundamentais quando se trata de componentes no Sistema Android seria o “layout_width”, o “layout_height” e o “id”. O primeiro corresponde à largura, o segundo a altura do componente podendo ser do tipo “fill_parent” ou “wrap_content”. A propriedade “id” identifica o campo na aplicação, a identificação do componente em si.

Exemplo:

layout_width = “fill_parent”: ocupa

o tamanho máximo disponível na

tela.

layout_height = “wrap_content”:

ocupa apenas o tamanho necessário

na tela.

id = “@+botão/btnSalvar”

Depois de aprendermos conceitos básicos e fundamentais a respeito dos “Widgets”, explorarei mais a fundo um a um para entendermos melhor.

abril 2012 19

TextView

Este é um dos mais simples, ele representa um texto, no Delphi se com-para a um Label.

Exemplo:

<TextView

android:id=”@+label/txtlabel”

android:layout_width=”fill_

parent”

android:layout_height=”wrap_

content”

android:text=”Exemplos de

Widgets”

/>

EditText

Este controle representa um campo editável, onde podemos inserir quais dados que desejarmos.

Exemplo:

<EditText

android:id=”@+Edit/Editar”

android:layout_width=”fill_

parent”

android:layout_height=”wrap_

content”

android:text=”Digite aqui”

/>

Button

Este controle nos possibilita a utilização de um botão para realizar tudo o que desejar, como por exemplo: executar uma rotina ao clicar no mesmo, o

código XML fica da seguinte maneira.

Exemplo:

<Button

android:id=”@+botão/btSalvar”

android:layout_width=”fill_

parent”

android:layout_height=”wrap_

content”

android:text=”Salvar Dados”

/>

A Figura 01 nos proporciona todos os controles utilizados até o momento.

Figura 01: Controles utilizados.

CheckBox

Permite criar um controle para checar uma ou várias opções, este controle é muito utilizado. No exemplo abaixo criei uma possibilidade para o usuário checar se é Estudante e Trabalhador. Veja a Figura 02 para maiores detalhes.

Exemplo:

<CheckBox android:id=”@+checkbox/

abril 201220

ckEstudante”

android:layout_width=”fill_parent”

android:layout_height=”wrap_

content”

android:text=”Estudante”

/>

<CheckBox

android:id=”@+checkbox/

ckTrabalhador”

android:layout_width=”fill_parent”

android:layout_height=”wrap_

content”

android:text=”Trabalhador”

/>

Figura 02: Utilização do CheckBox.

RadioGroup e RadioButton

Estes controles trabalham juntos. O RadioGroup permite agrupar contro-les RadioButton, utilizável em tipos de campos booleanos por exemplo, no nosso caso utilizamos estes componentes para indicar se o usuário é do sexo masculino ou feminino. Ver Figura 03.

Exemplo:

<RadioGroup xmlns:android=”http://

schemas.android.com/apk/res/

android”

android:orientation=”vertical”

android:layout_width=”fill_

parent”

android:layout_height=”fill_

parent”>

<RadioButton

android:id=”@+radio/

rbMasculino”

android:layout_width=”fill_

parent”

android:layout_height=”wrap_

content”

android:text=”Masculino”/>

<RadioButton

android:id=”@+radio/rbFeminino”

android:layout_width=”fill_

parent”

android:layout_height=”wrap_

content”

android:text=”Feminino”/>

</RadioGroup>

Figura 03: Uso do RadioButton.

abril 2012 21

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

Sobre o autor

Thiago Cavalheiro Montebugnoli

[email protected]

Conclusão

Este artigo abordou alguns “Widgets” básicos para se trabalhar com o Sistema Android. É importante ressaltar que o uso é bem fácil e intuitivo, os senhores podem perceber que o código muda muito pouco de componente para componente.

O XML é praticamente o mesmo para todos, basta aprenderem um pouco de suas funcionalidades que fica fácil a implementação no que desejar no projeto.

Fica a dica para testar outros ”Widgets”, tais como: o “ImageView” que permite a inserção de imagem, o “AnalogClock” ou “DigitalClock” ambos possibilitam colocar um relógio tanto analógico como digital, o “DatePicker” a manipulação de Data (dia, mês e ano) ou até trabalhar com Cronômetro utilizando o “Chronometer”.

Um forte abraço e até o mês que vem!

abril 201222

Linguagem C# Estruturas de Repetição

Neste segundo artigo veremos as estru-turas de repetição, os denominados laços ou loop. As estruturas de repetição são usadas para controlar a execução de códigos repeti-damente até que uma condição seja verdadei-ra. Falarei também um pouco dos controles de fluxos como o: Break e o Continue.

Inicie um novo projeto do Visual Studio 2010 e crie uma aplicação “Windows Forms”. Trabalha-remos também neste artigo com o controle ListBox para armazenar os dados obtidos das rotinas de repetições, para isto coloque 6 botões e um Lis-tBox em nosso formulário encontrado na palheta “Common Controls”. Este componente é o mesmo utilizado no Delphi, tendo suas propriedades e métodos bem parecidos. A Imagem 01 ilustra a estrutura do formulário.

Sendo que cada botão é responsável por uma rotina, neste caso iremos mostrar o resultado no ListBox ao Lado.

Utilizando o #Region

Antes de iniciarmos nossa codificação darei uma dica interessante, o uso de um recurso cha-

Figura 01: Estrutura Inicial do Formulário.

mado “Region”. Para quem não sabe, o Microsoft Visual Studio implementa este recurso para facilitar a vida de nós programadores. O mesmo visa dimi-nuir visualmente o código e deixá-lo agrupado por tipos de utilização.

abril 2012 23

Exemplo: Códigos para Inserção, Exclu-são, Alteração, etc...

No caso específico deste artigo agruparemos por tipos de Estrutura de Repetição.

Sintaxe:

#region “Comando While” <Bloco de Comandos> <Bloco de Comandos> #endregion

#region “Comando Do/While” <Bloco de Comandos> <Bloco de Comandos> #endregion

Após a implementação acima o Visual Studio insere um sinal de menos “-” ou um de mais “+” para poder minimizar ou maximizar esta região do código.

Os blocos ficariam da seguinte maneira:

Comando While

O comando While é geralmente utilizado quan-do não sabemos quantas vezes é necessário repetir um bloco de comandos para que obtenhamos uma condição verdadeira. Esta condição de retorno deve ser booleana.

Sintaxe:

while (teste condicional){ //Comandos}

Exemplo:

#region While

private void button1_Click(object sender, EventArgs e) { int numero = 1; listBox1.Items.Clear(); listBox1.Items.Add(“Comando While”);

while (numero <= 20) { listBox1.Items.Add(numero.ToString()); numero += 1; }

}

#endregion

Veja a figura 2.

Comando Do/While

O Do/While tem quase a mesma funcionali-dade do While, a única diferença é que com o uso dele teremos os comandos executados ao menos uma única vez.

Sintaxe:

Do{ //Comandos

} While(condição)

Exemplo:

#region Do/While

private void button2_Click(object sender, EventArgs e) { int numero = 20;

Figura 02: Resultado do Comando While.

abril 201224

listBox1.Items.Clear(); listBox1.Items.Add(“Comando Do/While”);

do { listBox1.Items.Add(numero.ToString()); numero -= 1; } while (numero >= 1);

}

#endregion

Veja a figura 3.

A diferença do Resultado dos comandos cita-dos acima é que no segundo estamos decremen-tando o valor. Notem que no C# temos a facilidade para fazer esta tarefa, sendo que:

“+=“ Incrementa um valor“-=” Decrementa um valor

Comando For

O famoso comando “For” possui exatamente a mesma funcionalidade do comando While. Ele trabalha checando uma condição para executar um bloco de comandos até que esta condição seja verdadeira.

Sintaxe:

for (int i =0; i <= 20; i++){ //Comandos}

A primeira parte (int i= 0) temos uma variável inteira inicializada com o valor 0, na segunda (i <= 20) uma condição para executar o bloco de coman-

Figura 03: Resultado do Comando Do/While.

dos, neste caso específico executaremos 20 vezes. O terceiro argumento (i++) indica o incremento automático desta variável. Poderíamos também decrementar um valor (i--)

Exemplo:

#region For

private void button3_Click(object

sender, EventArgs e) { listBox1.Items.Clear(); listBox1.Items.Add(“Comando For”);

for (int i = 1 ; i <=20; i++) { listBox1.

Figura 04: Resultado do Comando For.

abril 2012 25

Items.Add(i.ToString()); } }

#endregion

Veja a figura 4.

Comando Foreach

Quando descobri este comando fiquei surpre-so com sua utilidade. O laço “Foreach” é utilizado quando desejamos percorrer todos os elementos de um array ou de coleções de dados, como por exemplo, um ArrayList. Podemos também usar um “For” rodando enquanto uma determinada variável for menor que a largura de um array (geralmente é usado a propriedade Length).

O Laço Foreach é uma boa ideia quando se trata na leitura e apresentação dos dados, sendo de uma implementação muito rápida.

Sintaxe:

foreach (var item in collection){ //Comandos }

O var pode ser do tipo int, float, string, etc... seria o tipo da variável. O item será o nome do elemento atual do array e collection o array a ser manipulado. Veja exemplo a seguir:

#region Foreach

private void button4_Click(object sender, EventArgs e) { ArrayList lista = new ArrayList();

for (int i = 1; i <= 20; i++)

{ lista.Add(“Número_”+i.ToString()); }

foreach (var item in lista) { listBox1.Items.Add(item); } }

#endregion

Neste exemplo, no primeiro momento uti-lizamos um tipo de variável “ArrayList” , sendo necessário importar o seguinte namespace:

using System.Collections;

Foi criado um “For” para alimentar nosso Array e logo em seguida um “Foreach” para percorrê-lo e mostrar o resultado no Listbox.

Veja a figura 5.

Controles de fluxo

Utilizamos dois controles de fluxo em estrutu-ras de repetição: o Break e o Continue. O primeiro é utilizado para saída de laços e o segundo quando deverá mover a execução para a próxima iteração no laço.

Comando Break

Sintaxe:

for (int i = 1 ; i <=20; i++){ //Comandos If (condição1 == condição2) Break; }

Ressalto que neste exemplo utilizei o Operador “For”, O Break pode ser usado tanto em While, Foreach, Do/While, vejamos o código a seguir.

Figura 05: Resultado do Comando Foreach.

abril 201226

#region Break

private void button5_Click(object sender, EventArgs e) { listBox1.Items.Clear(); listBox1.Items.Add(“Comando Break”);

for (int i = 1; i <= 20; i++) { listBox1.Items.Add(i.ToString());

if (i == 15) { break; MessageBox.Show(“Comando Break, nº” + i.ToString()); }

}

}

#endregion

No código criado anteriormente usei um “If” para verificar se o número de repetição é igual a 15 e logo em seguida interrompi o laço mostrando ao usuário uma mensagem, ou seja, interrompemos nosso laço e tudo o que vier após o comando Break. Ver Imagem 06.

Veja a figura 6.

Comando Continue

Sintaxe:

Figura 06: Comando Break.

for (int i = 1 ; i <=20; i++){ //Comandos

If (condição1 == condição2) Continue; //Comandos}

Veja o exemplo a seguir:

#region Continue private void button6_Click(object sender, EventArgs e) { listBox1.Items.Clear();

Figura 07: Comando Continue.

abril 2012 27

Consultor de Sistemas na consultoria de sistemas DataSmart e Consultor Técnico do The Club, Bacharel em Ciência da Computação, MBA em Gestão Empresarial, Certificações MCAD (Microsoft Certified Application Developer) e MCSD.NET (Microsoft Certified Solution Developer .NET)

Sobre o autor

Marcos César Silva

[email protected]

listBox1.Items.Add(“Comando Continue”); for (int i = 1; i <= 20; i++) { if ((i == 10) || (i == 11) || (i == 12)) continue; listBox1.Items.Add(i.ToString());

} }#endregion

No código utilizei um “If” para verificar se o número de repetição é igual a 10,11 ou 12, caso a condição seja verdadeira utilizei o continue. Notem que estes números não foram adicionados no List-box pelo fato de pularmos e irmos para a próxima iteração do laço. Ver Imagem 07.

Veja a figura 7.

Conclusão

Pudemos aprender neste artigo as deno-minadas estruturas de repetição com exemplos práticos e fáceis. Continuaremos nossa caminhada no aprendizado desta linguagem de programação. Abraço e até o mês que vem!

abril 201228

Dicas DELPHI

Validadndo código ISBN (International Standard Book Numbers)

Os códigos ISBN são números de código que servem para identificação de livros, que são compostos por treze caracteres, sendo eles númericos “0” a “9”, o hífen, e a letra “X”, que estão divididos em quatro partes, estando se-paradas por hífens, sendo que a primeira parte identifica os a região e idiomas de onde origina o livro, a segunda parte identifica o editora do livro, a terceira parte identifica um determinado livro na coleção de um editor, e a quarta e última parte é o digito verificado, assim como funciona com a numeração de documentos e cartões.

Para verificarmos a validade de um código ISBN precisamos primeiro ve-rificar os nove primeiros dígitos três primeiras partes se o ISBN, multiplicando cada dígito por um número inferior a 11 contando as posições de esquerda cada dígito e acrescentando o resultado da multiplicação ao dígito verificador, e em seguida divide-se esse número por 11, formando assim um código ISBN válido.

function ISBNValido(ISBN: string): Boolean;var Numero, DigitoVerificador: string; NConsulta, SomaValores, Erroo: Integer; i, Contador: Word;

begin DigitoVerificador := Copy(ISBN, Length(ISBN), 1); Numero := Copy(ISBN, 1, Length(ISBN) - 2); if (Length(Numero) = 11) and (Pos(DigitoVerificador, ‘0123456789X’) > 0) then begin if (DigitoVerificador = ‘X’) then SomaValores := 10 else Val(DigitoVerificador, SomaValores, Erro); Contador := 1; for i := 1 to 12 do

begin if (Pos(Numero[i], ‘0123456789’) > 0) then begin Val(Numero[i], NConsulta, Erro); SomaValores := SomaValores + NConsulta * (11 - Contador); Inc(Contador); end; end; if (SomaValores mod 11 = 0) then IsISBN := True else IsISBN := False; end else IsISBN := False;end;

Conclusão

Esta função do exemplo não exige a necessidade de se informar os hífens, que podem ser posteriormente adicionados para padronizar o layout da dos códigos ISBNs exibidos. Outra característica que pode ser incluida é a verifi-cação dos três hifens do código, se eles são ou não adequadamente incluídos.

Verificar a Taxa de utilização do CPU

A taxa de utilização ou processamento do CPU é o indicado de quanto de memória e execuções de processos são gerados naquele momento, essa dica serve para monitorarmos constantemente essa taxa e identificar possíveis falhas de processos ou o alto consumo da execução de uma aplicação pela memória.

Para que possamos ler está taxa precisamos pegar todos os dados que ficam disponíveis la nos registros da aplicação (Windows Registry), e serão necessários também os componentes, 2 Buttons, 1 Label e 1 Timer.

Primeiro iremos declarar duas variáveis globais, sendo elas como do mé-todo private neste exemplo, elas servirão para ler os dados dos registros do Windows e outra do tipo boolean para saber se a aplicação ainda está fazendo a verificação da taxa de bytes sendo utilizados ou não.

abril 2012 29

private { Private declarations } iniciado: boolean; reg: TRegistry;

O primeiro botão terá a função de ler os dados dos bytes que estão sendo utilizados e retornar o valor.

procedure TForm1.Button1Click(Sender: TObject);var bytes: array[0..1024] of byte;begin Reg := TRegistry.Create; Reg.RootKey := HKEY_DYN_DATA; Reg.OpenKey(‘PerfStats\StartStat’, false); Reg.ReadBinaryData(‘KERNEL\CPUUsage’, bytes, Sizeof(bytes)); Reg.CloseKey; iniciado := true;end;

O Componente Timer, junto com o componente Label fica a função de ler e exibir constantemente ao usuário os valores que estão armazenados nos registros

procedure TForm1.Timer1Timer(Sender: TObject);var TaxaUtilCPU: integer;begin if iniciado then begin

Reg.OpenKey(‘PerfStats\StatData’, false); Reg.ReadBinaryData(‘KERNEL\CPUUsage’, TaxaUtilCPU, SizeOf(Integer)); Reg.CloseKey; Label1.Caption := IntToStr(TaxaUtilCPU) + ‘%’; end;end;

E por ultimo encerramos a consulta e finalizamos a consulta aos dados da taxa de utilização do CPU.

procedure TForm1.Button2Click(Sender: TObject);var bytes: array[0..1024] of byte;begin Reg.OpenKey(‘PerfStats\StopStat’, false); Reg.ReadBinaryData(‘KERNEL\CPUUsage’, bytes, SizeOf(bytes)); Reg.Free; iniciado := false;end;

Conclusão

O controle da taxa de utilização dos dados do CPU é útil para a verifica-ção constante da taxa de utilização da aplicação, se há sobrecarga em algum momento, se o banco de dados está trabalhando acima da taxa ideal, o que são as principais causas de um “Crash” na aplicação.

abril 201230

VerticalHorizontal

abril 2012

abril 2012