Você está na página 1de 32

fevereiro

2014
fevereiro
2014
04 05
ASP.NET
Aplicações .NET em camadas, teoria e prática - Parte 1

Editorial Autor: João Marcos Sakalauska

11
Delphi XE5 – Banco de
dados com Android
Autor: Jeferson Silva de Lima

16
Projeto Pegaso:
Projeto Pegaso Aprendendo a utilizar Orientação a
Objetos com Recursos Multi-Plataforma – Novas Técnicas
de Programação - Parte 2

Índice Autor: Hamden Vogel

24 30
Android - Personalizando
o “Spinner”
Autor: Thiago C. Montebugnoli Desafio The Club

03
fevereiro
2014
Editorial
Olá amigos do The Club!
Av. Profº Celso Ferreira da Silva, 190
Jd. Europa - Avaré - SP - CEP 18.707-150
Informações e Suporte: (14) 3732-1529

Internet
http://www.theclub.com.br
Cadastro: cadastro@theclub.com.br
Suporte: suporte@theclub.com.br
Estamos aqui mais um mês deste ano de 2014, sempre com o intuito de Informações: info@theclub.com.br
Skype Cadastro: theclub_cadastro
agradá-los com o conteúdo de nossos artigos. A todo o momento estamos Skype Suporte: theclub_linha1
theclub_linha2
nos deparando com o desenvolvimento de novas tecnologias no ramo da theclub_linha3

programação. A nossa revista irá sempre procurar abranger um pouco


destas inovações. Para começar, nosso consultor técnico Jeferson Silva
de Lima, aborda mais um assunto englobando o Delphi XE 5 utilizando a www.twitter.com/theclubbr
plataforma Android, nos ensinando como conectar com Banco de Dados.
Através de um exemplo prático nos auxiliará com as configurações iniciais.
Já nosso colaborador João Marcos Sakalauska redigiu um artigo seguido
de um exemplo prático de como devemos desenvolver Aplicações .NET em
camadas. Nesta primeira parte ele nos ensina um pouco da teoria seguido
de um exemplo. Hamden Vogel finaliza o artigo “Projeto Pegaso Aprendendo Copyright The Club 2013

a utilizar Orientação a Objetos com Recursos Multi-Plataforma” com novas Diretor Técnico
Técnicas de Programação. Nesta segunda e última parte podemos aliar o Marcos César Silva

conhecimento de Programação Orientada a Objetos juntando com o desen- Diagramação


Vitor M. Rodrigues
volvimento de um pequeno projeto para aprendizado. Para finalizar nossa
Design
série de artigos, eu escrevi um pouco sobre o componente “Spinner”, um Vitor M. Rodrigues
dos mais utilizados na plataforma “Android”. Utilizei a linguagem Java + XML
Revisão
para obter recursos diferentes e amigáveis para o usuário final. Procurei Drielly Cristini Patrinhani

também ajudar o programador demonstrando algumas técnicas de criações Colunistas


de estilos no formato “.xml”. Hamden Vogel
Jeferson Silva de Lima
Luciano Pimenta
Thiago Cavalheiro Montebugnoli
Para Finalizar a revista, não podemos esquecer nossa série de Dicas e
Truques. Juninho
Jeferson Silva de Lima

Impressão e acabamento:
Um grande abraço e até o mês que vem! GRIL - Gráfica e Editora
Taquarituba-SP - Tel. (14) 3762-1345

Reprodução
A 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.

Thiago Montebugnoli - Editor Chefe


thiago@theclub.com.br Delphi é marca registrada da Borland International,
as demais marcas citadas são registradas
pelos seus respectivos proprietários.

04
fevereiro
2014
Aplicações .NET em camadas,
teoria e prática - Parte 1

A
tualmente é muito comum ouvir a famosa expressão “apli- único lugar.
cações em camadas” ou “desenvolvimento em camadas” ou
apenas “camadas”. Essa estrutura pode parecer estranha, mas ainda existe, está em pleno
funcionamento e mais próximo do que você pensa, por exemplo: Sistema de
Essa expressão não é modismo, logo o conceito e o tipo Estacionamento.
de projeto em camadas (MVC) assumirá de vez o lugar do WEBForms, então, é
muito comum o assunto e você pode facilmente vê-lo aparecer numa entrevista Aplicações em duas camadas – Com a estrutura da organização com-
de emprego, conversa com amigos de trabalho, faculdade, etc. partilhando recursos por meio de rede e servidores, as aplicações ganharam
características de duas camadas conhecida como cliente/servidor. Nesse
Ou seja, é algo comum, muito comum mesmo, todo mundo fala.Mas modelo, os dados ficam armazenados em segurança no servidor a disposição
aí começa o problema, todo mundo fala, mas quem realmente conhece o da aplicação conectada a rede como mostra a imagem 02.
suficiente para falar e fazer?

Por conta disso, resolvi apresentar esse assunto de duas formas, teoria
e prática. Então, vamos começar pela parte teórica conhecendoo conceito
(resumido) do desenvolvimento de aplicações em camadas.

Aplicações em camadas (contexto histórico e teórico)

Aplicações monolíticas – São aplicações antigas, escritas para rodar em


uma única máquina, que não contavam com recursos de rede como mostra a
imagem 01. Essas aplicações continham tudo em um único lugar:

1. A camada de apresentação e entrada de informações.


2. Verificação e validação de regras de negócios.
3. Banco de Dados.

Imagem 02 – Estrutura Cliente/Servidor

Aplicação em três camadas – Com o crescimento da Internet houve a


necessidade de estruturar melhor as aplicações. Sendo assim, o MVC (Model,
View, Controller) tem a proposta de separar camada de interface com usuário
através da View, Camada de requisições através do Controller e a camada de
Imagem 01 – Banco de Dados, Regra de Negócios e apresentação contida num Dados por meio do Model como mostra a imagem 03.

05
fevereiro
2014
Aplicações em camadas (contexto prático)

A partir de agora, vamos focar no desenvolvimento para que ao final,


possamos enxergar e entender tudo o que foi mostrado na parte teórica.

Nossa aplicação será um simples cadastro de usuários em MVC, então,


fique atento aos requisitos do sistema para que você possa aplicar o estudo
da mesma forma como está sendo passado nesse artigo.

Requisitos:

Visual Studio 2010


SQL Sever 2008 (como teremos apenas uma tabela, não creio que haverá
problemas caso você use o 2005 ou 2012)
Entity Framework
.NET Framework 4.0
Imagem 03 – MVC – Model, View, Controller.
ASP.NET MVC 2 Web Application (a versão em não influenciará no aprendi-
zado do contexto desse artigo, pois, o foco é o conceito e não a apresentação
Aplicações em camadas – Visão Geral do MVC no .NET)

Agora que você já tem uma ideia a respeito de camadas, vamos fixar Sendo assim, vamos iniciar o desenvolvimento do banco de dados na
alguns conceitos. nossa aplicação.

Tanto Layer com Tier, significam “camadas” em inglês. Só que Tier refere- Abra o Sql Server Management Studio e crie o banco de dados para nossa
-se à estrutura física (hardwares, servidores, etc.) e Layer refere-se à estrutura aplicação como mostra a imagem04.
lógica. Daqui em diante o foco será na camada Layer já que vamos tratar da
organização da estrutura do código da aplicação.

Nota: Lembrando que ao falar de camadas, no caso desse artigo


Layer, não necessariamente estou falando só sobre MVC ou algo extre-
mamente específico. A ideia aqui é a apresentação de conceito para que
você tenha a base necessária a ponto de evoluir a sua aplicação seguindo
uma base de informação existente.

O interessante no conceito de desenvolvimento em camadas é que você Imagem 04 – Criando o Banco de Dados da aplicação.
não está restrito a apenas três camadas, você pode dividir em mais camadas
se seu projeto exigir. Na verdade, quanto mais você dividir visando organizar, Em “New Database” o nome dadoa nossa base será MVC, após digitar o
mais trabalho terá no começo, porém, mais produtividade e organização você nome, clique em OK como mostra a imagem 05.
terá ao final do projeto e no período de evolução e sustentação.
Veja a imagem 05.
Na divisão em camadas lógicas, destacamos os principais itens:
Com o Banco de Dados criado, abra uma nova janela clicando em “New
• User Interface/Presentation – Trata-se da camada de apresentação Query” e utilize o script CREATE TABLE a seguir:
para coleta e exibição de dados.
• Business LogicLayer – Trata-se da camada de lógica e regras de
negócio intermediando requisições do usuário. Listagem 1
• Data Access Layer – Camada de dados responsável pela execução
de transações de envio e retorno de dados. Não confundir com DAO (Data CREATETABLE [Usuario](
Access Objetct) com DAL (Data Access Layer). [IdUsuario] [bigint]
IDENTITY(1,1)NOTNULL,
DAO é um padrão de projeto,Implementa especificamente um objeto [NomeUsuario] [varchar](50)
contido no contexto de DAL.

06
fevereiro
2014
Imagem 05 – Banco de dados nomeado como MVC.

NOTNULL,
[EmailUsuario] [varchar](50)
NOTNULL,
[Login] [nchar](15)NOTNULL,
[Senha] [nchar](15)NOTNULL


CONSTRAINT [PK_Usuario]
PRIMARYKEYCLUSTERED
(
[IdUsuario] ASC
)WITH (
PAD_INDEX=OFF,
STATISTICS_NORECOMPUTE=OFF,
IGNORE_DUP_KEY=OFF,
ALLOW_ROW_LOCKS=ON,
ALLOW_PAGE_LOCKS=ON)ON
[PRIMARY]
)ON [PRIMARY]

Antes de rodar o comando, certifique-se de que o banco selecionado é o


MVC, como mostra a imagem 06. Imagem 06 – Script executado no Banco de dados MVC.

07
fevereiro
2014
Com o Banco de Dados e a Tabela criada, precisamos de pelo menos dois
registros na tabela, conforme script a seguir:

Listagem 2

INSERTINTO [Usuario]
([NomeUsuario]
,[EmailUsuario]
,[Login]
,[Senha])
VALUES
(‘João Marcos’
,’contato@tilosofia.com.br’
,’jmsaka’
,’12345’)

INSERTINTO [Usuario]
([NomeUsuario]
,[EmailUsuario]
,[Login]
,[Senha])
VALUES
(‘Aderbal Lacerda’
,’aderbal@gmail.com’
,’aderb’
,’ABC’)

Com os dados inseridos, podemos continuar a preparação da nossa


aplicação.

No visual studio 2010, selecione o projeto ASP.NET MVC 2 Web Application


e nomeie para MVCApp e clique em “OK” como mostra a imagem 07.
Imagem 08 – Model, View, Controller na composição do projeto MVCApp.

Com a estrutura padrão esta-


belecida, vamos utilizar o Entity
Framework para mapear nossa tabela
de usuários e prover o objeto e seus
recursos que facilitarão nossa imple-
mentação.

Para isso, realize as seguintes


etapas:

Vá até a janela Solution Explorer,


clique com o botão direito no projeto
MVCApp e escolha Add -> New Item.

Na janela que se abrirá “Add New


Item – MVCApp” selecione a opção
“Data” em “InstalledTemplates” e
Imagem 07 - Projeto ASP.NET MVC 2 Web Application.
a primeira opção “ADO.NET Entity Data Model” e coloque o nome de MVC.
edmx conforme imagem 08.

Repare como ficou a estrutura de pastas na Solution Explorer com as Veja a imagem 08.
camadas Model, View, Controller como mostra a imagem 08.
Na janela que se abrirá você estará na etapa “ChooseModelContents”,

08
fevereiro
2014
Imagem 08 – inclusão do Entity Data Model

clique em “GeneratefromDatabase” (pois, nesse caso, já temos a tabela e a


entidade do banco que será reconhecida automaticamente) e em seguida
clique em Next conforme imagem 09.
Imagem 09 – opção “GeneratefromDatabase” selecionada.

Imagem 11 – Seleção do nosso DataSource Microsoft SQL Server

Em “Connection Properties” informe os dados(Server Name, Authentica-


tionMode, Selectorenter a databasename) para acesso conforme imagem 12.

Na etapa “Chooseyour data Connection” clique em “New Connection”


e selecione “Microsoft SQL Server” e depois clique em “Continue” conforme
imagens 10 e 11:

Imagem 12 – Connection Properties


Imagem 10 – Seleção de nova conexão clicando em “New Connection”

09
fevereiro
2014
Após preencher os dados, testar a conexão e clicar em “OK”, a tela “Entity
Data Model” deverá estar preenchida conforme imagem 13.

Imagem 15 – Arquivo MVC.edmx gerado.

Conclusão
Imagem 13 - Entity Data Model após estabelecer conexão.
O tema desenvolvimento em camadas é muito interessante, porém deve
Na tela seguinte será necessário escolher os objetos que serão mapeados, ser tratado com cautela e deve ser muito praticado além de estudado.
no caso desse artigo somente a tabela Usuários como mostra a imagem 14.
Tome muito cuidado com fóruns de discussão, pois, tem muita gente
falando besteira que pode atrasar seu aprendizado, pesquise o assuntoem
fontes confiáveis como MSDN e Macoratti, por exemplo.

Não tenha pressa em aprender só pra dizer que conhece, pois, experiência
vale mais que conhecimento.

Fontes:
http://pt.wikipedia.org/wiki/Modelo_em_tr%C3%AAs_camadas
Microsoft Visual C# 2008 - John Sharp

Imagem 14 – Seleção do objeto que será mapeado.


Sobre o autor
Finalizando essa etapa e clicando em “Finish”, o arquivo MVC.edmx será João Marcos Sakalauska
exibido como mostra a imagem 15.
31 anos, é Analista de Sistemas e atua a mais de 10 anos na área de
TI. Atualmente é Líder Técnico e Analista de Sistemas na IN3 Software
Veja a imagem 15 atuando em projetos que utilizam as tecnologias .NET e Sql Server.

Com o banco de dados definido e mapeado encerramos a primeira parte,


onde o foco foi direcionado principalmente para questões teóricas e preparação
inicial da nossa aplicação. marcos@theclub.com.br

A partir do próximo artigo, trataremos questões práticas do MVC através


da aplicação de cadastro de usuários.

10
fevereiro
2014
Delphi XE5
Banco de dados com Android

Q
uando desenvolvemos uma aplicação na plataforma ‘An-
droid’ temos em mente que nossa base de dados conven-
cional não pode ser acessada diretamente pelo dispositivo
móvel, ou seja, deve haver uma ponte entre o dispositivo
e a base de dados.

No artigo anterior vimos como acessar a base de dados ‘Firebird’ através


do dispositivo ‘Android’ utilizando o ‘DataSnap’ em uma aplicação VCL, ou seja,
nossa aplicação VCL foi a ponte entre os dados e o Android.

No entanto, caso o usuário necessite utilizar o dispositivo em locais exter-


nos sem depender de outra aplicação temos que utilizar um banco compatível
com a plataforma, sem depender de DLL ou arquivos de configuração, veremos
neste artigo como realizar a configuração para conectarmos diretamente na
base de dados.
Imagem 1 – Configurações da Conexão.

Conectando ao Banco A extensão do arquivo será (.db). Com o local indicado clique no botão
‘Advanced’ e vá até a propriedade ‘FailifMissing’ marcando como ‘False’, assim
Neste exemplo utilizaremos o banco de dados ‘SQLite’ que é compatível ao tentar conectar ao banco se não existir ele será criado, caso deixe ‘True’ o
com a plataforma Android, além do Interbase. Delphi apenas irá se conectar a base de dados.

Para manipulação e gerenciamento dos dados podemos utilizar a ferra-


menta ‘SQLiteExpress’ que possui uma versão gratuito para testes.

No artigo publicado em Janeiro de 2012, podemos acompanhar a utilização


da ferramenta.

• Android- Carregando um Database do SQLite:


http://theclub.com.br/Restrito/Revistas/PDFS/2012/1201.pdf

Caso a utilização da ferramenta não seja viável o desenvolvedor


pode criar sua base de dados através do Delphi, para isto vá em ‘DataExplorer/
SQLite’ e adicione uma nova conexão. Nas configurações indique o local que
deseja criar o arquivo, exemplo:

C:\Users\Suporte4\Documents\meubanco.db
Imagem 2 – Propriedades avançadas.

11
fevereiro
2014
Após configurarmos a conexão devemos criar as tabelas, para isso clique Nomeie os componentes conforme listagem abaixo:
com o botão direito em ‘Table’ em sua conexão e terá a opção ‘New Table’.
Componentes

SQLConnection1: Conexao;
SQLQuery1: SQLInsert;
SQLQuery2: SQLDelete;
SQLDataSet1: sdsClientes;

No ‘sdsClientes’ vamos trazer o campo ‘CLI_NOME’ criado em nossa


tabela e para exibi-lo em nosso ‘ListView’ clique com o botão direito sobre o
formulário ou qualquer componente e vá na opção ‘ Bind Visually’, uma janela
será exibida conforme imagem abaixo:

Imagem 6 – Bind Visually.


Imagem 3 – Adicionando Tabela.
Ligue o campo ‘CLI_NOME’ ao ‘Item.Text’ do ‘ListView’ para exibir os
dados na lista. Para finalizarmos o ‘Layout’ do formulário adicione 2 ‘Buttons’
e coloque a propriedade ‘Text’ do primeiro botão como ‘Novo’ e do segundo
como ‘Delete’. Seu formulário irá ficar parecido com a seguinte Imagem:

Imagem 4 – Criação da Tabela.

Com a base de dados criada podemos prosseguir com as configurações


no Delphi.

Criando a aplicação

Adicione um ‘SQLConnection’ ao formulário e conecte a sua base de


dados, coloque também um ‘SQLDataSet’, um ‘ListView’ e 2 ‘SQLQuery’ para
tratarmos as inserções e deleções do banco de dados.

Imagem 7 – Formulário Principal.

Agora para adicionar a base de dados criada ao compilador de nosso


Imagem 5 – SQLConnection. Android vá em:

12 fevereiro
2014
Project/Deployment, conforme imagem abaixo: ‘Plataforms’ para Android e em ‘Remote Path’ coloque: ‘ .\assets\internal ‘ (sem
as aspas) , esse será o local onde ficará nossa base de dados no dispositivo.

Imagem 10 – Arquivo db.

Por fim vá em seu ‘SQLConnection’ e no evento ‘BeforeConnect’ coloque


o seguinte comando:

Listagem 1 – BeforeConnect.

Conexao.Params.
Values[‘Database’] := TPath.
Combine(TPath.GetDocumentsPath,
‘nomedobanco.db’);

Para utilizarmos a função ‘TPath’ adicione na uses ‘System.IOUtils’, feito


isso execute o projeto. Os dados que estão em sua base de dados serão exibidos.

Imagem 8 – Deployment.

Clique em ‘Add Files’ para selecionar sua base de dados.

Imagem 11 – Emulador.

Para manipularmos os dados utilizaremos os comandos de ‘Insert’ e


‘Delete’, para isso vamos utilizar os componentes ‘SQLQuery’.

Imagem 9 – Add Files. Conecte o ‘SQLInsert’ ao ‘Conexao’ e em parâmetros (Params) adicione


um campo conforme imagem abaixo:
Após ter adicionado o banco ele será exibido na lista, então altere a opção

13
fevereiro
2014
begin
Try
if InputQuery(‘Novo
Cliente’,’Nome’,S) and (S.Trim
<> ‘’) then
Begin
SQLInsert.Close;
SQLInsert.
ParamByName(‘CLI_NOME’).
AsString := S;
Imagem 12 – Parâmetro ‘CLI_NOME’. SQLInsert.ExecSQL();
sdsClientes.Refresh;
End;
except
on e: Exception do
begin
ShowMessage(e.Message);
end
End;

Veja que utilizamos o ‘InputQuery’ para capturar o valor digitado pelo


usuário e passamos para o parâmetro criado dentro do ‘SQLInsert’. Veja na
Imagem 13 – Parâmetro.
imagem abaixo como irá ser exibido no Android:

Crie o parâmetro da mesma forma no ‘SQLDelete’.

Na propriedade SQL do ‘SQLInsert’ insira o seguinte comando:

Listagem 2 – Comando Insert.

INSERT INTO TAB_CLIENTE (CLI_


NOME) VALUES (:CLI_NOME)

Na propriedade SQL do ‘SQLDelete’ insira o comando:

Listagem 3 – Comando Delete.

DELETE FROM TAB_CLIENTE WHERE


CLI_NOME = :CLI_NOME

Por último vamos configurar o comando dos 2 botões que adicionamos


Imagem 14 – InputQuery Insert.
anteriormente, começando pelo botão ‘Novo’ no evento ‘OnClick’ coloque
conforme listagem abaixo:
Agora vamos configurar o botão ‘Delete’, veja abaixo listagem com a
codificação:

Listagem 4 – Botão Novo.


Listagem 5 – Botão Delete.
Var
Var
S: String;
S: String;

14
fevereiro
2014
begin
S := ListView1.Selected.Text;
Try
if InputQuery(‘Deletar
Cliente’,’Nome’,S) and (S.Trim
<> ‘’) then
Begin
SQLDelete.Close;
SQLDelete.
ParamByName(‘CLI_NOME’).
AsString := S;
SQLDelete.ExecSQL();
sdsClientes.Refresh;
End;
except
on e: Exception do
begin
Imagem 15 – InputQuery Delete.
ShowMessage(e.Message);
end
Conclusão
End;
Vimos neste artigo como conectar nosso dispositivo móvel na base de
dados SQLite sem depender de outra aplicação, ou seja, tudo de forma sim-
ples e direta. Este exemplo pode ser melhorado e implementado da forma
Veja que ao clicar no item da Lista ele será armazenado na variável
que desejarem.
S, veja na imagem abaixo:
Espero que tenham gostado desta dica e até a próxima!

Sobre o autor
Jeferson Silva de Lima
Consultor The Club.

suporte@theclub.com.br

15
fevereiro
2014
Projeto Pegaso Aprendendo a utilizar
Orientação a Objetos com Recursos
Multi-Plataforma – Novas Técnicas de
Programação - Parte 2

N
esta segunda e última parte do artigo abordarei mais alguns própria classe estivesse dentro do dataset em execução – isso é prático para
recursos de nosso projeto. Seguindo a lógica de raciocínio, o desenvolvedor à medida em que evolui no código-fonte, incrementando a
a nossa classe sempre deverá se interagir com a TConexao produtividade do projeto e a elegância do nível do fonte também – podendo
para prover o banco de dados desejado. Para isso, a nossa retornar qualquer tipo incluído na unit DB.pas por exemplo (um descendente
classe de exemplo TPessoaFisica terá uma variável privada de TCollection/ TOwnedCollection), ou então customizando para novos tipos:
de TConexao, que será referenciada na classe inteira, para de forma abstrata observe abaixo a função de retornar o próximo ID de uma tabela – declarado
prover este acesso. como “GetNextId” de TConexaoDBISAM e TConexaoFirebird, respectivamente:

Inicializado na construção da nossa classe de exemplo TPessoaFisica com


o parâmetro default (DBISAM), a variável interna Conexao será referenciada Figura 18 – Explanação das funções GetNextId (TConexaoDBISAM), GetCurren-
com o método padrão de construção GetConexao. Abaixo segue os códigos tCod_Pessoa (TPessoaFisica) e GetFieldsFromSQL (TConexaoDBISAM).
de criação e destruição, respectivamente.
function TConexaoDBISAM.
Figura 17 – Criação e Destruição da classe TPessoaFisica –métodos Create/Destroy. GetNextId(const fFieldName:
string; const fTable: string):
constructor TPessoaFisica. string;
Create(const fbdConexao: var
tAliasBDConexao =
fId: string;
(bdConexaoDBISAM); const _
begin
myForm: TForm = nil);
begin fId := TDBISAMQuery(Self.
if Assigned(_myForm) then RetornaDataSet(Format(sql
MyForm := _MyForm; MaxIndexFromFieldNameForm
at2, [fFieldName, fTable]))).
Conexao := Conexao.GetConexao Fields[0].AsString;
(tBDConexao(fbdConexao)); if (fId = ‘’) then fId :=
end; ‘1’;
Result := fId;
destructor TPessoaFisica. end;
Destroy;
begin
inherited;
function TConexaoFirebird.
Conexao.closeConexao;
end; GetNextId(const fFieldName:
string; const fTable: string):
string;
Uma coisa interessante a ser notada é que algumas funções retornam o var
tipo TFields, facilitando o retorno das chamadas de um dataset – como se a fId: string;

16
fevereiro
2014
begin Figura 19 – Demonstração do método CarregarBanco nas classes TConexao-
fId := TCustomSQLDataSet(Self. DBISAM e TConexaoFirebird.
RetornaDataSet(Format(sql constructor TConexaoDBISAM.
MaxIndexFromFieldNameForm create;
at1, [fFieldName, fTable]))). begin
Fields[0].AsString; if (ffDiretorioDBISAM = ‘’)
if (fId = ‘’) then fId := then
‘1’; Self.CarregarBanco(‘DBISAM’)
Result := fId; else
end; Self.CarregarBanco(ffDireto
if (Result = 1) then rioDBISAM);
FCod_Pessoa := inherited;
end;
FormatFloat(‘0000’, Self.
GetCurrentCod_Pessoa);
function TConexaoDBISAM.
CarregarBanco(const cDiretorio:
function TPessoaFisica. string): Boolean;
GetCurrentCod_Pessoa: integer; var
begin fIniFile: TIniFile;
Result := Conexao.GetFields fFile: TextFile;
FromSQL(Format(sqlSelectPess fPathCfgIni: string;
oaFisicaFromNome, [FNome])). fDiretorio: string;
Fields[0].AsInteger; fNotOK: Boolean;
end; begin
fNotOK := False;
fPathCfgIni :=
function TConexao.
ExtractFilePath(Application.
GetFieldsFromSQL(const fSQL:
ExeName)+ FCFGIni;
string): TFields;
begin dmDBISAM := TdmDBISAM.
if Self is TConexaoDBISAM Create(nil);
then dmDBISAM.BD.Connected :=
Result := False;
TConexaoDBISAM(Self). if dmDBISAM.BD.DatabaseName
GetFieldsFromSQL(fSQL) = EmptyStr then dmDBISAM.
else if Self is TConexaoXML BD.DatabaseName :=
then FDataBaseName;
Result := TConexaoXML(Self).
if not SysUtils.
GetFieldsFromSQL(fSQL)
FileExists(fPathCfgIni) then
else if Self is
begin
TConexaoFirebird then AssignFile(fFile,
Result := fPathCfgIni);
TConexaoFirebird(Self). Rewrite(fFile);
GetFieldsFromSQL(fSQL); Append(fFile);
end; Writeln(fFile,
‘[Configuracao]’);
Writeln(fFile, ‘Diretorio=
Um método que não foi explicado ainda é o CarregarBanco, presença ‘);
obrigatória em todas as classes que descendam de TConexao – pois ele é o Flush(fFile); { ensures
encarregado de “procurar” o banco de dados, e se encontrar, preparar ele that the text was actually
(configurando permissões, drivers de acesso, etc) e deixá-lo disponível para as written to file }
transações que possam ser requeridas posteriormente. Esse método deve ser CloseFile(fFile);
chamado na criação do objeto de TConexao desejado (construtor de TCone- end
xaoDBISAM/ TConexaoFirebird, por exemplo). Segue abaixo as declarações de else
CarregarBanco nas classes TConexaoDBISAM e TConexaoFirebird, bem como begin
as suas chamadas no método construtor de cada uma delas: fIniFile := TIniFile.

17
fevereiro
2014
Create(fPathCfgIni); end; //end if bd.connected
with fIniFile do = false then
begin
try if fNotOK then
dmDBISAM.BD.Directory begin
:= ReadString(‘Configuracao’, Result := False;
‘Diretorio’, dmDBISAM. end
BD.Directory); else
dmDBISAM.BD.Connected begin
:= Self.BancoExiste(dmDBISAM. if not (dmDBISAM.
BD.Directory); BD.Connected) then
finally begin
Free; fIniFile := TIniFile.
end; Create(fPathCfgIni);
end; with fIniFile do
end; begin
try
if not (dmDBISAM.BD.Connected) dmDBISAM.BD.Directory
then := ReadString(‘Configuracao’,
begin ‘Diretorio’, dmDBISAM.
if Self.BancoExiste((Extrac BD.Directory);
tFilePath(Application.ExeName) dmDBISAM.BD.Connected
+ ‘BD\’ + cDiretorio) , False) := Self.BancoExiste(dmDBISAM.
then //tenta achar localmente BD.Directory, False);
begin finally
fIniFile := TIniFile. Free;
Create(fPathCfgIni); end;
with fIniFile do end;
begin end;
try end;
WriteString(‘C Result := not fNotOK;
onfiguracao’,’Diretorio’, end;
(ExtractFilePath(Application.
ExeName) + ‘BD\’ + cDiretorio)); { TConexaoFirebird }
finally
Free; function TConexaoFirebird.
end; CarregarBanco(const cDiretorio:
end; string): Boolean;
end begin
else if not Result := True;
DirectoryExists(dmDBISAM. if (cDiretorio = EmptyStr)
BD.Directory) or (dmDBISAM. then
BD.Directory = ‘’) or not begin
(dmDBISAM.BD.Connected) then fVendorLib :=
begin FMyGDSVendorLib;
fIniFile := TIniFile. fLibraryName :=
Create(fPathCfgIni); FMyDBXExpress
with fIniFile do FirebirdLibraryName;
begin fPathDataBase :=
try FUsuariosFDB;
WriteString(‘Configura end
cao’,’Diretorio’, fDiretorio); else if (cDiretorio =
finally ‘default’) then
Free; begin
end; fVendorLib :=
end; FMyGDSVendorLib;
end else fNotOK := True; fLibraryName :=

18
fevereiro
2014
ExtractFilePath(Application. end;
ExeName) + IncludeTrai except
lingPathDelimiter(‘BD\ on E: Exception do
FIREBIRD’) + FMyDBXExpress begin
FirebirdLibraryName; Raise EInvalidDataBase.
fPathDataBase :=
Create(EErroGeralBancoDeDados +
ExtractFilePath(Application.
#13#10 + E.Message);
ExeName) + IncludeTrailingPa
thDelimiter(‘BD\FIREBIRD’) + Result := False;
fPathDataBase; end;
end end;
else end;
begin
fVendorLib := constructor TConexaoFirebird.
cDiretorio + FMyGDSVendorLib; create(const cDiretorio: string
fLibraryName := = ‘default’);
cDiretorio + FMyDBXExpress begin
FirebirdLibraryName; if not Self.
fPathDataBase :=
CarregarBanco(cDiretorio) then
cDiretorio + fPathDataBase;
Exit;
end;
inherited create;
Result := ( (DirectoryE end;
xists(fPathDataBase)) and
(FileExists(fLibraryName)) );
if not Result then Exit;

if not BancoInstanciado then Implementando a Interface IFrame – Criação Dinâmica de


dmFirebird := TdmFirebird. Frames em Tabsheets:
Create(nil);
Interfaces são classes abstratas – definem apenas as declarações de
try métodos – que são funções, procedimentos e propriedades (nesta última os
try métodos getters/setters também devem ser definidos). Em uma interface não
with dmFirebird. há escopo de público, privado, protegido, etc – justamente pelo fato de tudo ser
SQLConnection do público. Uma interface também não define variáveis. O que uma interface faz?
begin Nada. Ela define apenas o que as classes que descendam dela deva ser feito. É
Connected := False;
uma abstração na Linguagem Orientada a Objetos – toda classe que interagir
VendorLib :=
com ela (descendendo dela) deverá obrigatoriamente declarar e construir seus
dbVendorLib;
LibraryName := métodos no seu código. Toda interface tem um valor chamado GUID (Globally
dbLibraryName; Unique IDentifier - definido em um Record TGuid – unit System – tamanho
Params. 128-bit integer – 16 bytes) que é um valor único referenciado nela. Para obter
Values[‘Database’] := manualmente este valor GUID, basta pressionar Ctrl+Shift+G na IDE do Delphi.
fPathDataBase + FUsuariosFDB;
end; Portanto, em uma interface não haverá nenhuma implementação – as
finally outras classes que herdarem dela são as que implementarão o código cor-
dmFirebird.SQLConnection. respondente.
Connected := True;
// dmFirebird. Segue abaixo alguns códigos relativos à utilização da nossa interface cha-
SQLTableUsuario.Open;
mada “IFrame” (declarada na unit UnFrames, onde também possui algumas
with dmFirebird.SQLQuery
funções instanciadoras e manipuladoras de objetos do tipo Frame e sua inte-
do
begin ração com a interface citada, além de manipular o carregamento e destruição
if Text <> EmptyStr desses objetos em contêineres Tabsheet – tudo isso realizado em execução
then – para inicializar o frame a ser carregado basta associar a propriedade tag do Ta-
Open; bsheet com a o frame a ser criado – ex: tabHistorico.Tag := integer(TfrmEditor);
end; perceba que queremos exibir o nosso frame no momento (evento) da exibição
do Tabsheet – em outras palavras nos eventos onShow/OnHide:

19
fevereiro
2014
Listagem 20
end;

procedure
type DestroyFrame(APageControl:
IFrame = interface TPageControl; ATabsheet:
[‘{112D577F-BA1B-4CAA-97D6- TTabsheet);
A12D25E6503B}’] var
procedure OnShow; frame: TFrame;
procedure OnHide; begin
procedure Novo; frame :=
procedure Persistir; GetFrame(APageControl,
procedure Excluir; ATabsheet);
procedure GetUsedClass(const if frame <> nil then
fObject: TObject = nil); frame.Free;
end; end;

procedure function
TfrmCadastroPessoaFisica. GetActionFrame(APageControl:
tabHistoricoShow(Sender: TPageControl; ATabsheet:
TObject); TTabSheet; AFrameOption:
begin FrameOption; const myObject:
if Assigned(PessoaFisica) TObject = nil): TFrame;
then var
GetActionFrame(PageControl1, intf: IFrame;
Sender as TTabSheet, foShow, frame: TFrame;
PessoaFisica); begin
end; Result := nil;

procedure CreateFrame(APageControl,
TfrmCadastroPessoaFisica. ATabsheet);
tabHistoricoHide(Sender:
TObject); frame :=
begin GetFrame(APageControl,
GetActionFrame(PageControl1, ATabsheet);
Sender as TTabSheet, foHide);
end; if not Supports(frame,
IFrame, intf) then Exit;
function GetFrame(APageControl:
TPageControl; ATabSheet: case AFrameOption of
TTabsheet): TFrame; foShow:
begin begin
if not Assigned(ATabsheet) if Assigned(myObject)
then then
ATabsheet := APageControl. intf.
ActivePage; GetUsedClass(myObject);
Result := nil; intf.OnShow;
if Assigned(ATabsheet) and end;
(ATabSheet.ControlCount > 0) foHide: intf.OnHide;
and (ATabSheet.Controls[0] end;
is TFrame) then
Result := TFrame(ATabSheet. Result := frame;
Controls[0]); end;

20 fevereiro
2014
Figura 20 – Criação do objeto do tipo TFrame – na tabsheet de Histórico em tempo de execução.

Figura 21-24 – Exibição das principais Telas do nosso sistema em execução – a última é a janela-diálogo de confirmação de exclusão – personalizada pelo componente sha-
reweare TAdvSmoothMessageDialog da empresa TMSSoftware.

21
fevereiro
2014
Figura 21-24 – Exibição das principais Telas do nosso sistema em execução – a
última é a janela-diálogo de confirmação de exclusão – personalizada pelo componente
shareweare TAdvSmoothMessageDialog da empresa TMSSoftware.

22
fevereiro
2014
Conclusão que venham a contribuir com todos os desenvolvedores Delphi – esta incrível
ferramenta de programação que sempre se encontra cada vez mais imbatível
Foram discutidos tópicos relacionados a Linguagem Orientada a Objetos e poderosa frente à novas IDE´s que surgem no mercado diariamente também
em Delphi através de um exemplo fictício mas de implementação profissional aliadas a novas formas alternativas de formatos de trocas de informações
de um sistema em desenvolvimento – abordando a criação da classe negocial como JSON, etc.
de Pessoa Física, a classe TConexao e suas comunicações, bem como a criação
do banco de dados e a camada de apresentação correspondente. Foi abordado Um abraço a todos e até aos próximos artigos! Até lá!
novo template de telas personalizado com efeitos suaves, gradientes, leves
e agradáveis – customizados por componentes de terceiros e com design
diferenciado de certos componentes (como panéis com bordas arredondadas,
panéis com gradiente de barras de ferramentas e títulos nas posição top/left
no estilo Microsoft/XP) e outras técnicas de implementação como a utilização
de interfaces com frames e a classe TConexao – projetada para ambientes
Sobre o autor
multiplataforma.
Hamden Vogel
Com isso, foi distribuído este projeto de teste para acompanhamento Analista de Sistemas pós-graduado em Engenharia de Software pela
de como foi desenvolvido (a partir do código-fonte) e como foi desenhado (a UPIS e Programador Delphi com larga experiência desde 2000, tem de-
partir das telas em tempo de execução) – onde um usuário final poderá exe- senvolvido e vendido softwares em Delphi para a África e Estados Unidos,
além do mercado nacional. Colaborou com dicas e componentes para sites
cutar o aplicativo em qualquer diretório de seu computador (da maneira que especializados em Delphi. Também desenvolve em outras linguagens como
foi distribuído os fontes pelo artigo) e perceber o funcionamento do mesmo. C/C++, ASP, PHP e .NET.

Portanto, espero que a concepção deste projeto, desde sua idealização


até a entrega inicial destes fontes, banco de dados e executável possa servir de suporte@theclub.com.br
inspiração, aprendizado, refinamento e novas idealizações de novos projetos

23
fevereiro
2014
Android - Personalizando
o “Spinner”

M
uitas vezes temos a necessidade de personalizar com- Classe “Cidades.java”
ponentes ao decorrer do desenvolvimento de algum
projeto. Na realidade é isto que deixa nosso software Devemos também programar uma classe padrão que irá nos retornar
com um lay-out diferente dos outros. Quando traba- um Conjunto de valores. No caso nesta classe foram cadastradas algumas
lhamos com a programação para Android é inevitável cidades de exemplo.
não nos deparar com uma situação destas. Neste artigo irei personalizar um
dos principais componentes, o “Spinner”. Ele fornece uma maneira rápida de Veja abaixo o código da classe ”Cidades.java”.
selecionar um valor a partir de um conjunto de valores. No estado padrão, um
“Spinner” mostra seu valor atualmente selecionado. Ao selecioná-lo é exibido Listagem 01: Classe “Cidades.java”.
um Menu suspenso com todos os outros valores disponíveis, a partir do qual o
usuário pode selecionar um novo. Ele se parece com o “Combobox” do Delphi package com.example.android_
ou o “DropDownList” da plataforma .Net. spinner;

Então chega de conversa e vamos por a mão na massa. import java.util.ArrayList;

public class Cidades


Criando um Exemplo Prático {
public ArrayList<String>
É importante sabermos que para efetuarmos formatações de tamanho, RetornarCidades;
cor ou estilos em geral deste tipo de componente exige configurações dife-
renciadas, para isto devemos criar um arquivo específico (XML) próprio para public Cidades()
cada tipo de configuração. Para fins didáticos, o exemplo se dividirá em 3 {
(três) etapas, sendo: RetornarCidades = new
ArrayList<String>();
1-) Personalização geral do componente; RetornarCidades.
2-) Personalização do Item do componente; add(“AVARÉ”);
3-) Personalização para inserção de imagem no item do componente. RetornarCidades.
add(“BOTUCATU”);
O primeiro passo seria criar a Atividade Principal clicando no menu “File/ RetornarCidades.
New/Android Application Project” para criar um novo projeto. Na Tabela 1 add(“CERQUEIRA CÉSAR”);
estão as principais configurações. RetornarCidades.
add(“FARTURA”);
Propriedade Valor Descrição RetornarCidades.
add(“ITATINGA”);
Activity Name MainActivity Nome da Atividade RetornarCidades.
Layout Name Activity_main Nome do Layout add(“ITAÍ”);
Navigation Type None Tipo de navegação RetornarCidades.
Tabela 1. Configurações Iniciais do Projeto.

24
fevereiro
2014
add(“PIRAJU”); xmlns:tools=”http://
RetornarCidades.add(“SÃO schemas.android.com/tools”
PAULO”); android:layout_width=”match_
} parent”
} android:layout_
height=”match_parent”
android:paddingBottom=”@
dimen/activity_vertical_margin”
A função desta classe é nos retornar um “ArrayList” dos valores cadastrados android:paddingLeft=”@
no método “Construtor”. Veremos mais adiante sua utilização. dimen/activity_horizontal_
margin”
android:paddingRight=”@
Activity_Main.xml dimen/activity_horizontal_
margin”
O rosto principal do exemplo será composto por 3 (três) Componentes android:paddingTop=”@dimen/
“Spinners”. Ver Imagem 01. activity_vertical_margin”
tools:context=”.
MainActivity” >

<Spinner
android:id=”@+id/
spinner1”
android:layout_
width=”400dp”
android:layout_
height=”50dp”
android:layout_
alignParentTop=”true”
android:layout_
centerHorizontal=”true”
android:layout_
marginTop=”22dp” />

<Spinner
android:id=”@+id/
spinner2”
android:layout_
width=”400dp”
android:layout_
height=”50dp”
android:layout_
alignLeft=”@+id/spinner1”
android:layout_
below=”@+id/spinner1”
android:layout_
marginTop=”42dp” />

<Spinner
Figura 01: Activity_Main.xml. android:id=”@+id/
spinner3”
O código XML correspondente: (Listagem 02) android:layout_
width=”400dp”
Listagem 02: XML da tela principal. android:layout_
height=”70dp”
<RelativeLayout android:layout_
xmlns:android=”http://schemas. alignLeft=”@+id/spinner2”
android.com/apk/res/android” android:layout_

25
fevereiro
2014
2-) Personalização do Item do componente
below=”@+id/spinner2”
android:layout_ Devemos seguir os mesmos passos descritos anteriormente, a diferença
marginTop=”58dp” /> deste é que definiremos outro nome para o arquivo, como: “spinner_dropdo-
</RelativeLayout> wn_theclub.xml” e utilizaremos alguns atributos da classe “CheckedTextView”.
Os principais são: “singleline” (Itens do “Spinner” com apenas uma linha) e
“textColor” (Cor da Fonte). Ver Listagem 04.

1-) Personalização geral do componente


Listagem 04: Código XML do “Spinner_dropdown_theclub”.
Para criar o arquivo XML clique com o botão direito sobre o caminho “../res/ <?xml version=”1.0”
layout” escolhendo a opção “New/Other/Android XML File”. Ver Imagem 02. encoding=”utf-8”?>
<CheckedTextView
xmlns:android=”http://schemas.
android.com/apk/res/android”
android:id=”@android:id/
text1”
style=”?android:attr/
spinnerDropDownItemStyle”
android:singleLine=”true”
android:layout_width=”match_
parent”
android:layout_
height=”?android:attr/
listPreferredItemHeight”
android:ellipsize=”marquee”

android:textColor=”#ee66ff”/>

3-) Personalização para inserção de imagem no item do


componente

Por padrão, quando criamos um novo projeto no Android temos uma


imagem chamada “ic_launcher.png” localizada no diretório “Drawable”. Utili-
Figura 02: Criando o arquivo de configuração. zaremos esta para fins de aprendizado. Teremos que utilizar o “TableLayout”
seguido de uma “TableRow”(Através destes componentes que conseguiremos
Defina o nome para o arquivo como: “spinner_theclub.xml” (Este será o concatenar dois tipos de valores). Dentro dele utilizaremos uma classe “Ima-
nome utilizado como referência mais adiante) Adicionaremos o código para geView” para recuperarmos a imagem outra “TextView” para atribuirmos os
aumentar o tamanho da fonte para “30sp” (textSize) e definirmos a cor para valores. Dentro desta segunda classe é primordial utilizar as propriedades
Vermelho (textColor). Note que estamos trabalhando como referência um “Text” e “Id”, pois é a partir delas que interligamos nossas configurações mais
componente do tipo “TextView”, ou seja, todos os atributos desta classe serão adiante. Ver Listagem 05 para melhores detalhes.
encapsulados para em seguida implementarmos no “Spinner”. Listagem 03.
Listagem 05: Código XML do “Spinner_imagem_theclub”.
Listagem 03: Código XML do “Spinner_theclub”.
<?xml version=”1.0”
<TextView xmlns:android=”http:// encoding=”utf-8”?>
schemas.android.com/apk/res/ <TableLayout
android” xmlns:android=”http://schemas.
android:id=”@android:id/ android.com/apk/res/android”
text1”
android:layout_width=”match_ android:orientation=”vertical”
parent” android:layout_
android:layout_height=”wrap_ width=”fill_parent”
content” android:layout_
android:textSize=”30sp” height=”fill_parent”>
android:textColor=”#ff0123” <TableRow android:id=”@+id/
/>

26 fevereiro
2014
MainActivity.java
tableRow1” android:layout_
width=”wrap_content” Para cada exemplo achei melhor criar um Procedimento. O projeto será
android:layout_height=”wrap_ dividido em 4 (quatro) Procedimentos, sendo:
content” android:padding=”10px”>
<ImageView - InicializaListeners(): Responsável por inicializar os componentes “Spin-
android:layout_width=”32sp” ners” e o objeto “Cidades”.
android:src=”@drawable/ - ValorPersonalizado(): Personalizar os valores gerais do “Spinner”. (“Spin-
ic_launcher” android:layout_ ner_theclub.xml”)
height=”32sp” /> - ItemPersonalizado(): Personalizar especificamente os itens do “Spinner”.
<TextView (“Spinner_dropdown_theclub.xml”)
android:textSize=”22sp” - ImagemItemPersonalizado(): Utilizar uma imagem no “Spinner”. (“Spin-
android:text=”Cidade” ner_imagem_theclub.xml”)
android:textStyle=”bold”
android:layout_width=”fill_
parent” android:id=”@+id/
SpinnerCidadeItem” package com.example.android_
android:layout_ spinner;
height=”fill_parent”
android:paddingLeft=”5sp” />
</TableRow>
</TableLayout> Utilizaremos algumas bibliotecas adicionais para desenvolver este exem-
plo, veja abaixo:

Ao término o projeto terá a seguinte estrutura, Ver Imagem 03.


import java.util.ArrayList;
import java.util.HashMap;
import android.os.Bundle;
import android.app.Activity;
import android.widget.
ArrayAdapter;
import android.widget.
SimpleAdapter;
import android.widget.Spinner;

public class MainActivity


extends Activity
{

private Spinner spn1,
spn2,spn3;
private Cidades cidades;

Criamos 3 (três) variáveis privadas do tipo “Spinner” e outra para a classe


“Cidades”.

@Override
protected void onCreate(Bundle
savedInstanceState)
{
super.
onCreate(savedInstanceState);
setContentView(R.layout.
activity_main);
InicializaListeners();
Figura 03: Arquivos do Exemplo. ValorPersonalizado();

27
fevereiro
2014
ItemPersonalizado();

ImagemItemPersonalizado();
}

No método OnCreate() é onde invocaremos os procedimentos descritos


anteriormente.

public void
InicializaListeners()
{
spn1 = (Spinner)
findViewById(R.id.spinner1);
spn2 = (Spinner)
findViewById(R.id.spinner2);
spn3 = (Spinner)
findViewById(R.id.spinner3);
cidades = new
Cidades();
} Figura 04: Método ValorPersonalizado().

Como o próprio nome já diz, inicializamos todas as variáveis declaradas


anteriormente com o método “FindViewById”.

public void
ItemPersonalizado()
public void {
ValorPersonalizado() ArrayAdapter<String>
{ arrayAdapter2 = new
ArrayAdapter<String> ArrayAdapter<String>(this,R.
arrayAdapter1 = new layout.spinner_theclub,
ArrayAdapter<String>(this,R. cidades.RetornarCidades);
layout.spinner_theclub, arrayAdapter2.
cidades.RetornarCidades); setDropDownViewResource(R.
spn1. layout.spinner_dropdown_
setAdapter(arrayAdapter1); theclub);
} spn2.
setAdapter(arrayAdapter2);
}

A Classe “ArrayAdapter<string>” receberá a lista de cidades cadastradas


na classe Cidades junto com as configurações. O primeiro parâmetro é o
Contexto da aplicação, o segundo seria o “XML” criado por nós (É neste exato
momento que nosso “Spinner” assumirá o formato que desejamos) e o último Nesta função teremos como base o item anterior, personalizando o valor
valor seria a lista de cidades. Definimos para o componente usando o método e o item selecionado. O método “setDropDownViewResource()” irá carregar
“setAdapter”. Ver Imagem 04. o arquivo de configuração “spinner_dropdown_theclub”. Ver Imagem 05.

28 fevereiro
2014
Para inserirmos uma imagem no “Spinner”, teremos um trabalho a mais
para fazer. Primeiramente devemos declarar um “ArrayList” utilizando o tipo
de dados “HashMap”. Quando utilizamos este tipo devemos obrigatoriamente
informar o par “chave/valor”. Para preencher os itens do “Spinner” faremos
um laço e em seguida usar a classe “SimpleAdapter” contendo os parâmetros:
- Contexto da aplicação, - o “Arraylist” com os campos chave/valor, - o arquivo
de configuração “spinner_imagem_theclub.xml”, a chave “Cidades” e por final
o “SpinnerCidadeItem” contido no arquivo de configuração (Nesta referência
é onde será armazenada os dados oriundos do “ArrayList”). Ver Imagem 06.

Figura 05: Método ItemPersonalizado().

public void
ImagemItemPersonalizado()
{
ArrayList<HashMap<String, Figura 06: Método ImagemItemPersonalizado().
String>> alist = new
ArrayList<HashMap<String,
String>>(); Conclusões
HashMap<String, String> map =
new HashMap<String, String>();
A linguagem Java + XML nos proporciona diversos tipo de recursos no
for(int i=0; i < cidades. desenvolvimento de aplicativos para a plataforma Android. Neste artigo,
RetornarCidades.size(); i++) achei necessário explorar um pouco mais deste componente, o “Spinner”. O
{ “Spinner” é um dos componentes mais utilizados quando precisamos retornar
map = new dados de diversas fontes (Neste artigo usamos uma classe com dados estáticos
HashMap<String,String>(); para esta tarefa). Pudemos “enfeitar” e deixar com uma aparência muito mais
map.put(“Cidades”, cidades. agradável alterando tamanho e cor de fontes, Imagens, estilos, entre outras
RetornarCidades.get(i). coisas. Vou ficando por aqui, Abraços e até o mês que vem!
toString());
alist.add(map);
}

SimpleAdapter
Sobre o autor
simpleAdapter = new
SimpleAdapter( Thiago Cavalheiro Montebugnoli
this, alist,R.layout.spinner_ adora aprender novas tecnologias. Formado pela Faculdade de Tecnologia de Botucatu
imagem_theclub, new String[] – 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
{“Cidades”}, Prefeitura Municipal de Itaí-SP é colunista mensal da Revista The Club Megazine e é consultor
new int[] {R.id. Técnico do The Club. Possui as seguintes certificações: MCP - Microsoft Certified Professional,
MCTS - Microsoft Certified Technology Specialist, MCAD - Microsoft Certified Application Developer
SpinnerCidadeItem}); e MCSD - Microsoft Certified Solution Developer.
spn3.
setAdapter(simpleAdapter);
}
} thiago@theclub.com.br

29
fevereiro
2014
desafio the club

Verticais

1- Objeto da aba Qreport que insere data/hota ou número de página no relatório.


2- Unit necessária para utilizar os registros do Windows.
3- Evento disparado quando um item da combo é selecionado.
5- Constante que indica a tecla enter no envento OnKeyDown.
6- Propriedade do form que habilita o reconhecimento de teclas.
8- Objeto que insere gráficos ligados ao banco de dados.
9- Clausula para sobrecarregar métodos.
11- Função para concatenar duas strings.

Horizontais

4- Cláusula de sobreposição de métodos.


7- Unit do sqldatase.
10- Maior clube de programadores do Brasil. (palavra chave)
12- Método que localiza registros no adotable.
13- Função para comparar datas.
14- Função para incrementar uma data.

1. Qrsysdata - 2. Registry - 3. Onselect - 4. Override - 5. Vkreturn - 6. Keyprewiew - 7. Sqlexpr - 8. Dbchart - 9. Overload - 10. TheClub - 11. Concat - 12. Locate - 13. Datecompare - 14. Incday

30
fevereiro
2014
05
fevereiro
2014
fevereiro
2014

Você também pode gostar