maio 2012
ndice
04
Android
14
Autor: Thiago C.
Montebugnoli
C#
Delphi
Editorial
05
09
Delphi
Delphi - Parte III
Autor: Luciano
Pimenta
20
Desafio The Club
Dicas
28
Legenda
30
Iniciante
Intermedirio
Avanado
maio 2012
03
Bem-vindo
Av. Prof Celso Ferreira da Silva, 190
Jd. Europa - Avar - SP - CEP 18.707-150
Informaes e Suporte: (14) 3732-1529
Internet
http://www.theclub.com.br
Cadastro: cadastro@theclub.com.br
Suporte: suporte@theclub.com.br
Informaes: info@theclub.com.br
Skype Cadastro: theclub_cadastro
Skype Suporte: theclub_linha1
theclub_linha2
theclub_linha3
www.twitter.com/theclubbr
Impresso e acabamento:
GRIL - Grfica e Editora
Taquarituba-SP - Tel. (14) 3762-1345
Reproduo
04
maio 2012
Delphi
maio 2012
05
Explicando o exemplo
A ideia principal que ao abrir a tela
de pedidos de clientes o usurio possa abrir ao
mesmo tempo a tela de cadastro (isso explica a
configurao de FormStyle = fsMDIChild).
Tendo as duas telas lado a lado, o usurio
poder consultar um produto e arrast-lo para a
tela de pedidos, assim chamando a tela de cadastro
de itens j em modo de insero, e ainda com o
produto arrastado j implementado ao campo que
refere-se ao produto do item.
O conceito bem simples e pode ser
implementado de vrias outras formas, neste
exemplo, poderamos fazer o mesmo com o cliente
do pedido, porm o conceito seria o mesmo.
Pr-requisitos
Para este exemplo alguns requisitos
j devero estar em funcionamento, para que se
possa seguir com o exemplo, so eles:
06
maio 2012
procedure TfmProdutos.
dbgPesquisa
CellClick
(Column: TColumn);
begin
{
atribuimos os valores
nos devidos Tfields dos
datasets
e tambm fazemos a
chamada do evento onclick
do btnIncluir item.
}
if (Target <> nil) then
if (dm.cdsItens.State
= dsBrowse) then
begin
dm.cdsItens.
Como j foi dito, o prprio objeto de
origem ir controlar tambm o fim da ao drag
on drop, entende-se com isso que o dbgPesquisa
ir descrever o que ir acontecer aps o objeto
de destino aceitar a ao, ou seja, aps finalizar
a ao, iremos dar um insert na tabela de itens j
implementando o valor da chave do produto e o
nome do mesmo para o campo virtual da tabela de
itens.
Veja o cdigo a ser implementado no evento
onEndDrag do dbgPesquisa na listagem 2.
procedure TfmProdutos.
dbgPesquisaEndDrag
(Sender, Target: TObject;
X,
Y: Integer);
begin
{
Objeto de Origem ao de finalizar o Drag
Drop
Define o procedimento
a ser tomado aps
finalizar a ao de
dragdrop
(quando solta o click
do mouse)
Como estamos
trabalhando com registros
da base de dados
Insert;
dm.cdsItensID_
PRODUTO.AsInteger:=
dm.cdsProdutosID_PRODUTO.
AsInteger;
fmPedidos.
btnIncluir.Click;
fmPedidos.Show;
fmPedidos.
dbgItensPedido.SetFocus;
end;
end;
procedure TfmPedidos.
dbgItensDragDrop(
Sender, Source: TObject;
X,
Y: Integer);
begin
{
Objeto Destino - Ao
de confirmao para o
DragDrop
Aps aceitar o objeto
arrastado, chama-se o
mtodo
EndDrag do objeto de
origem para finalizar a
ao DragDrop
}
if (Source = fmProdutos.
dbgPesquisa) then
fmProdutos.
dbgPesquisa.EndDrag(True);
end;
procedure TfmPedidos.
dbgItensDragOver(
Sender, Source: TObject;
X,
maio 2012
07
Y: Integer; State:
TDragState; var Accept:
Boolean);
begin
{
Objeto de Destino
- ao de verificar se
aceita o DragDrop
Verifica se o
componente sendo arrastado
pode
ser solto neste objeto
- Destino
}
if (Source = fmProdutos.
dbgPesquisa) then
Accept:= true;
end;
Concluso
Sobre o autor
Lucas Vieira de Oliveira
Com este artigo foi exemplificado uma
das vrias formas de se trabalhar com a ao de
arrastar e soltar utilizando o Delphi e seus formulrios do tipo MDI.
Trabalhando com registros da base de dados,
ou seja, de uma forma ilusria para o usurio ocorre
o evento Arrastar e soltar, porm como podemos
08
maio 2012
suporte@theclub.com.br
Linguagem C#
Arrays, ArrayList
e List
Continuando com nossos artigos relacionados ao C#, escreverei
um pouco sobre os denominados
Arrays e das classes ArrayList e
List. De uma forma geral, estas
colees admitem insero e manipulao de vrios itens em seu
interior, podendo acess-los atravs
de ndices ou chaves. Mas qual seria
diferena entre eles? Falarei um
pouco de cada estrutura seguido de
exemplos prticos.
Array
So colees de dados de um mesmo
tipo, como por exemplo: texto ou inteiro.
Figura 01: Formulrio de Exemplos.
Uma caracterstica dos Arrays
que eles so estticos, ou seja, depois
maio 2012
09
Sintaxe:
Declarao da varivel:
Alimentando o Vetor:
<variavel>[0] = Valor;
10
maio 2012
valores_string[9] =
TESTE 09;
#endregion
ArrayList
=
=
=
=
=
valores_string[8] =
TESTE 08;
List
Sintaxe:
{
//Recuperamos o item
}
Declarao da varivel:
<ArrayList> <variavel> =
new <ArrayList>();
<variavel>.Add(Valor);
Sintaxe:
Declarao da varivel:
<List><tipo> <variavel> =
new <List><tipo>();
<variavel>.Add(Valor);
maio 2012
11
Concluso
Neste artigo procurei demonstrar de
uma forma simples e direta a utilizao
dos principais tipos de colees de dados
em C#.
Figura 04: Exemplo de List.
valores.
Add(1000000);
valores.
Add(10000000);
valores.
Add(100000000);
valores.
Add(1000000000);
12
maio 2012
Sobre o autor
Marcos Csar Silva
Consultor de Sistemas na consultoria de sistemas DataSmart e Consultor Tcnico do The Club, Bacharel em Cincia
da Computao, MBA em Gesto Empresarial, Certificaes
MCAD (Microsoft Certified Application Developer) e MCSD.
NET (Microsoft Certified Solution Developer .NET)
marcos@theclub.com.br
maio 2012
13
ANDROID
Uma abordagem
sobre persistncia
de dados
Ol amigos do The Club, tivemos outros artigos relacionados a persistncia de dados em banco no Sistema Android. Neste artigo vou procurar
detalhar um pouco mais dos recursos utilizados nos artigos anteriores e
conhecer outros para se trabalhar com Banco de Dados. Estas informaes
se tornam primordiais para quem est comeando a aprender este tipo
de linguagem de programao. Continuaremos trabalhando com o SQLite,
lembrando que o mesmo responsvel por persistir os dados no Banco.
O foco deste artigo permitir que os senhores montem uma tela simples
de cadastro e outra de consulta persistindo e trabalhando com os dados.
maio 2012
Importando as telas
O passo seguinte seria aproveitarmos as telas e boa parte da codificao
do artigo Navegando entre Telas do Ms de Maro de 2012.
A diferena que estaremos persistindo os dados no Banco de Dados, ao
invs de salvar na memria em uma classe. Ver Imagem 02.
android:id=@+id/linearLayout5
android:layout_height=67dp>
<Button android:text= Anterior
android:id=@+id/btAnterior
android:layout_height=wrap_
content android:layout_
width=160dp></Button>
<Button android:text=Posterior
android:id=@+id/btPosterior
android:layout_width=160dp
android:layout_height=wrap_
content></Button>
</LinearLayout>
15
maio 2012
String strPro = ;
switch (rgCursos.
getCheckedRadioButtonId())
{
case R.id.rbLiteDelphi : strPro
= The Club
Lite (Delphi) R$59,90;
break;
case R.id.rbLiteC : strPro = The
Club Lite (Delphi) - R$59,90;
break;
case R.id.rbProfessional : strPro =
The Club Lite (Delphi) - R$59,90;
break;
case R.id.rbStudent : strPro = The
Club Lite
(Delphi) - R$59,90;
break;
}
String sql = INSERT INTO TB_
THECLUB (NOM_CLI, CID_CLI, EST_CLI,
PRO_CLI) VALUES (
+ txtCliente.getText().
toString() +,
+ txtCidade.getText().
toString()+,
+ spEstado.
getSelectedItem().toString()+,
+ strPro+);
BancoDados.execSQL(sql);
MensagemAlerta(Mensagem, Dados
salvos com Sucesso!);
}
catch (Exception e)
{
MensagemAlerta(Mensagem, Erro ao
gravar dados no Banco de Dados!+e.
toString());
}
finally
{
BancoDados.close();
}
}
maio 2012
17
O mtodo que faz este trabalho de navegao o cursor.moveToPrevious() e o cursor.moveToNext(), sendo que o primeiro se movimenta para
o registro anterior e o segundo para o posterior. Logo em seguida invocaremos
o mtodo MostrarDados() para preencher nossos respectivos objetos.
maio 2012
{
@Override
public void onClick(View v)
{
setContentView(R.layout.
cadastro);
btEfetuar = (Button) findViewById(R.
id.btnEfetuar);
btEfetuar.setOnClickListener(new View.
OnClickListener()
{
@Override
public void
onClick(View arg0)
{
AbreouCriaBancoDados();
InicializaObjetos();
GravarDados();
}
});
Button btVoltarCadastro = (Button)
findViewById(R.id.btVoltarCadastro);
btVoltarCadastro.setOnClickListener(new
View.OnClickListener()
{
@Override
public void
onClick(View v)
{
ChamaMenuPrincipal();
}
}
);
}
});
}
}
);
}
}
);
}
No ChamaConsulta() tambm inicializamos o mtodo AbreouCriaBancoDados(), logo em seguida o InicializaObjetos(). O prximo passo utilizamos o
BuscarDados() e por final o MostrarDados(). Como nesta tela utilizamos mais
outros dois controles para navegao entre os registros, ento aqui o local
de chamar o RegistroAnterior() e o RegistroPosterior(), ambos para navegao
entre os dados. Ver Imagem 05.
id.btAnterior);
btAnterior.setOnClickListener(new View.
OnClickListener()
{
@Override
public void
onClick(View arg0)
{
RegistroAnterior();
}
}
);
Button btPosterior = (Button)
findViewById(R.id.btPosterior);
btPosterior.setOnClickListener(new View.
OnClickListener()
{
@Override
public void
onClick(View arg0)
{
RegistroPosterior();
}
}
);
Button btVoltarConsulta = (Button)
findViewById(R.id.btVoltarConsulta);
btVoltarConsulta.setOnClickListener(new
View.OnClickListener()
{
@Override
public void
onClick(View v)
{
ChamaMenuPrincipal();
}
Concluso
Procurei neste artigo abordar de uma forma simples a persistncia de
dados utilizando o sistema Android. Dividi em pequenas rotinas cada estrutura
para podermos dar uma maior abordagem sobre o assunto. Finalizamos duas
telas principais, uma de Cadastro e outra de Consulta.
Abrao e at o ms que vem!
Sobre o autor
Thiago Cavalheiro Montebugnoli
Thiago Cavalheiro Montebugnoli tecnlogo, formado pela Faculdade
de Tecnologia de Botucatu SP (FATEC) foi consultor tcnico 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 Processamento de Dados da Prefeitura Municipal de Ita-SP. Possui as seguintes
certificaes: MCP - Microsoft Certified Professional, MCTS - Microsoft Certified Technology Specialist, MCAD - Microsoft Certified Application Developer
e MCSD - Microsoft Certified Solution Developer.
thiago@theclub.com.br
maio 2012
19
Delphi
Parte III
Vimos no artigo anterior, um
pouco sobre os tipos de dados suportados pelo Delphi, assim como
estruturas de cdigo para desenvolvimento de projetos com Delphi.
Nesse artigo, vamos conhecer uma
das melhores bibliotecas de componentes visuais das ferramentas
de desenvolvimento, a VCL (Visual
Library Component).
Tool Palette
20
maio 2012
Aba Standard
A aba possui os componentes mais
comuns para criao de aplicaes
Win32 no Delphi.
Label (rtulo), Edit (caixa de texto),
Button (boto), ComboBox (caixa de
combinao), ListBox (caixa de seleo),
MainMenu e PopupMenu (menu e menu
de contexto), Panel (container para outros componentes) etc.
O Edit e o Label so fceis de entender, como j vimos nos exemplos do artigo anterior. Fica uma dica interessante
para a validao que faz o Edit, onde
podemos configurar para que o mesmo
aceite somente nmeros, alterando a
propriedade NumberOnly para true.
maio 2012
21
Expanded.
Vamos configurar a imagem dos painis e dar ttulos aos mesmos (propriedade Caption), exemplificado pela Figura 7.
Aba Additional
Nessa aba, encontramos alguns
componentes com visual mais arrojado,
vamos dizer assim. Temos dois tipos
de botes, o BitBtn e o SpeedButton.
O primeiro possui uma propriedade
chamada Kind, onde de acordo com a
opo escolhido, um tipo de imagem
mostrada.
J no SpeedButton, temos a aparncia de um boto flat, de acordo com a
propriedade Flat do mesmo. Veja na Figura 5 as opes do BitBtn e SpeedButton
Um componente presente em novas
verses do Delphi o ButtonedEdit. Com
ele, podemos adicionar em uma caixa
de texto dois botes, usando imagens.
Os botes podem ficar alinhados a direta ou esquerda. Pessoalmente, achei o
controle muito legal, pois utilizo em sistemas, botes para realizarem consultas
auxiliares, onde o boto de pesquisa fica
ao lado da caixa de texto.
Com o ButtonedEdit, basta indicar
uma imagem para o boto direito e terei
uma caixa de texto, que indica que tenho
uma consulta para realizar ali. Sobre os
eventos dos botes, temos os OnRightButtonClick e o OnLeftButtonClick, logicamente um evento Click para cada boto.
No controle, temos ainda a propriedade para somente nmeros do Edit
(ButtonedEdit descende de TCustomEdit), podemos indicar um Hint para o
boto etc. Veja na Figura 6 o controle.
Para configurar essas imagens, primaio 2012
meiro, temos que configurar um ImageList para a propriedade Images do ButtonedEdit. Aps, usando as propriedades
RightButton e LeftButton, configuramos
o ndice da imagem e tambm por fim,
configurando a propriedade Visible para
True.
Outro componente que acho muito
bom o CategoryPanelGroup, pois tem
a capacidade de criar painis e dentro
desses, adicionar controles. Com isso,
podemos fazer um painel de navegao
semelhante ao NavBar da sute DevExpress. Se voc no conhece o NavBar,
veja nesse link: www.devexpress.com/
Products/VCL/ExNavBar.
Vamos criar um painel de navegao
muito incrementado. Adicione o controle
em um formulrio. Adicione trs painis,
clicando com o boto direito e escolhendo Add Panel.
Na propriedade Images do CategoryPanelGroup, vamos vincular um
ImageList com imagens grandes, do
tipo 24x24 (referente ao tamanho da
imagem, que no componente ser configurado nas propriedades Height e Width), que so as imagens que aparecero
no ttulo dos painis.
Voc pode configurar a imagem que
vai aparecer quando o painel estiver
expandido ou recolhido, quando o
mouse passar sobre a imagem, tudo isso
usando as propriedades: XXHotImageIndex, XXImageIndex e XXPressedImageIndex, onde o XX indica ser Collapsed ou
Aba Win32
Elas devem ser separadas pelo caractere pipe |, assim um hint pode
ser colocado com o seguinte valor:
Cadastro|Cadastro de Clientes|2. O
primeiro texto, ser o ttulo do balo, o
segundo a descrio do hint e o ltimo
o ndice da imagem que temos no ImageList vinculado ao BallonHint.
Se quisermos, podemos jogar
com essas trs opes, por exemplo:
Cadastro||2, no mostrar a descrio
Diferentemente do PageControl, o
TabControl, no trabalha com abas individuais. Voc adiciona as abas, usando a
propriedade Tabs (um TStrings) e qualquer componente adicionado, ser visualizado em todas as abas. Esse controle
serve para voc adicionar apenas alguns
controles e eles mudarem de acordo com
o clique de cada aba.
maio 2012
Dicas avanadas
Nessa seo vou mostrar algumas
dicas de componentes vistos anteriormente, que utilizando algumas linhas de
cdigo, podemos modificar seu layout,
adicionar imagens etc. Componentes,
como: ListBox, ComboBox, StatusBar
entre outros, no possuem uma propriedade para que possamos ligar um item
a uma imagem ou cone. Mas, podemos
mostrar essas imagens, pintando as
mesmas nos componentes, utilizando a
classe Canvas.
Para testar, coloque em um formulrio o ListBox e um ImageList. Adicione
alguns cones, altere a propriedade Style
do ListBox para lbOwnerDrawFixed e no
evento OnDrawItem adicione o cdigo
da Listagem 1.
procedure TForm2.
ListBox1DrawItem
(Control:
TWinControl;
Index: Integer;
Rect: TRect; State:
TOwnerDrawState);
begin
ListBox1.Canvas.
FillRect(Rect);
ListBox1.Canvas.
TextOut(Rect.Left+18,
Rect.Top,
ListBox1.
Items[Index]);
ImageList1.
Draw(ListBox1.Canvas,
Rect.Left, Rect.Top,
Index);
end;
maio 2012
25
procedure TForm3.
StatusBar1DrawPanel
(StatusBar: TStatusBar;
Panel: TStatusPanel;
const Rect: TRect);
begin
if Panel.Index = 0 then
begin
ProgressBar1.Width :=
Rect.Right - Rect.Left +
1;
ProgressBar1.Height :=
Rect.Bottom - Rect.Top +
1;
ProgressBar1.
PaintTo(StatusBar.Canvas.
Handle,
Rect.Left, Rect.
Top);
end;
end;
procedure TForm3.
Button1Click
(Sender: TObject);
var
i: integer;
begin
for i := ProgressBar1.
Min to ProgressBar1.Max do
begin
ProgressBar1.Position
:= i;
StatusBar1.Repaint;
26
maio 2012
Sleep(10);
end;
ProgressBar1.Position :=
ProgressBar1.Min;
StatusBar1.Repaint;
end;
if Panel.Index = 0 then
end
else
begin
StatusBar1.Canvas.
FillRect(Rect);
StatusBar1.Canvas.
TextOut(Rect.left + 18,
rect.Top, Panel.Text);
ImageList1.
Draw(StatusBar.
Canvas,rect.left,
rect.top,Panel.Index);
end;
procedure TForm4.
FormKeyDown
(Sender: TObject;
var Key: Word; Shift:
TShiftState);
begin
e cor do painel.
if odd (GetKeyState(VK_
NUMLOCK)) then
StatusBar1.Panels[1].
Text := NUM
else
StatusBar1.Panels[1].
Text := ;
end;
StatusBar1.Canvas.Brush.
Color := $00FFEECC;
Concluses
Como j comentei, teramos que ter
um livro para mostrar todos os componentes da VCL. Tentei mostrar os mais
comuns e mais interessantes. Componentes que no mostrei nesse artigo
devero ser vistos no decorrer do curso,
como componentes para relatrios, aba
dbExpress, Ribbon etc.
Um grande abrao a todos e at a
prxima!
Sobre o autor
Luciano Pimenta
www.lucianopimenta.net
maio 2012
27
Dicas DELPHI
end;
end;
Funo que retorna o nmero de ocorrncias de uma substring dentro de uma string
Uses
StrUtils
function TForm1.OcorrenciaString(SubString,
StringPrincipal: String;
Sensitive: Boolean): Integer;
var
PosOcorrencia : Integer;
Sub, Principal : String;
begin
if (Sensitive) then
begin
Sub := SubString;
Principal := StringPrincipal;
end
else
begin
Um exemplo de utilizao: Considere o caminho C:\
Arquivos de Programas\Projeto\Reports, para saber o nvel da
pasta Reports utilize a \ como substring e faa a busca no
caminho completo, retornar o nmero trs correspondente ao
nvel da pasta. A varivel booleana Sensitive pode ser utilizada
com uma CheckBox, para habilitar e desabilitar o case-sensitive
da busca.
Sub := LowerCase(SubString);
Principal :=
LowerCase(StringPrincipal);
end;
Result := 0;
//funo PosEx da biblioteca StrUtils,
//ela retorna a posio da primeira
ocorrncia
type
TCaptionNavigator = class(TDBNavigator);
No evento onCreate do formulrio vamos implementar o cdigo para adicionar os captions aos botes do DBNavigator. Preste ateno que criamos uma constante chamada
Captions que um array que receber os captions de cada
boto seguindo a ordem da esquerda para a direita. Em seguida
criaremos uma varivel chamada Boto, que far referncia aos
botes do DBNavigator. Veja na listagem 2 a implementao
do cdigo.
28
maio 2012
procedure TForm1.FormCreate(Sender:
TObject);
const
Captions : array[TNavigateBtn] of String
= (
Primeiro, Anterior,
Prximo,
ltimo, Incluir,
Excluir, Editar,
Salvar, Cancelar,
Atualizar);
var
Botao : TNavigateBtn;
begin
for Botao := nbFirst to nbRefresh do
begin
with TCaptionNavigator(DBNavigator1).
Buttons[Botao] do
begin
Caption := Captions[Botao];
end;
end;
end;
Concluso
Foi criado um lao de repetio para navegar um a um
entre os botes do DBNavigator, e assim adicionando a cada
boto seu respectivo caption.
procedure TForm1.Button1Click(Sender:
TObject);
var
StatusBateria: TSystemPowerStatus;
begin
GetSystemPowerStatus(StatusBateria);
if Boolean(StatusBateria.ACLineStatus)
then
begin
ShowMessage(Este computador est
ligado fonte!);
end
else
begin
ShowMessage(Format(Energia restante
na bateria: %d %., [StatusBateria.
BatteryLifePercent]));
end;
end;
uses
MSHTML_TLB, SHDocVw_TLB;
procedure TForm1.Button1Clici(Sender:
TObject);
var
Janelas: IShellWindows;
Navegador: IWebbrowser2;
Disp: IDispatch;
Doc: IHTMLDocument2;
i: Integer;
begin
Janelas:= CoShellWindows.Create;
for i:= 0 to Janelas.Count do
begin
Disp:= Janelas.Item(i);
if Disp = nil then
Continue;
Disp.QueryInterface(iWebBrowser2,
Navegador);
if Navegador <> nil then
begin
Navegador.Document.
QueryInterface(IHTMLDocument2, Doc);
if Doc <> nil then
begin
Navegador:= Janelas.Item(i) as
IWebbrowser2;
Navegador.Refresh;
end;
end;
end;
end;
maio 2012
29
Horizontal
30
maio 2012
Vertical
maio 2012
maio 2012