32
Setembro 2009

The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

  • Upload
    dodan

  • View
    223

  • Download
    0

Embed Size (px)

Citation preview

Page 1: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009

Page 2: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009

Page 3: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009 03

Delphi

InfoNews

.NET

.NET

Delphi

Criptografia com InterBase - Seu banco de dados 100% protegido.Parte II 12Autor: Felipe Santos

Desafio The ClubJogo dos 7 erros. 30

Dicas Delphi

- Mudar a cor do edit ao receber o foco- Verificar se uma variável é número ou não- Valida UF

.NET

índiceTranferindo arquivos utilizando o componente Socket

Editorial Delphi

06Passamos do meio do ano, e sabemos que para terminar este “restinho” de ano que falta vai ser rápido... 04

Lançamento do Delphi 2010

05Criando uma classe para geração de relatórios em Delphi 2009 09

Theming e Skins no ASP.NET com Visual Studio 2008

16JQuery - Aplicando efeitos em elementos HTML

20Desvendando o GridViewParte II

28 28LegendaInicianteIntermediárioAvançado

Autor: Mateus André Chies

Autor: Antonio Spitaleri Autor: Adilson Jr.

Autor: Djonata Tenfen

Autor: Vitor Manuel Rodrigues

Autor: Luciano Pimenta

Page 4: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 200904

Bem-vindo

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

pelos seus respectivos proprietários.

Marcos César Silva - Editor [email protected]

No último dia 15 deste mês nós do The Club tivemos a oportunidade de comparecer no Mini curso oferecido pela Embarcadero, onde fomos oficialmente apresentados ao Delphi 2010, podendo ter contato com as poderosas novidades desta mais recente versão da ferramenta.

Não posso deixar de agradecer Andreano Lanusse por ter nos recebido de forma tão atenciosa como sempre o fez, agradeço também aos diversos sócios que compareceram ao evento, nos dando a rara oportunidade do contato pessoal com estes diversos companheiros de trabalho. Confira mais detalhes sobre o evento na coluna InfoNews de Vitor Manuel Rodrigues.

Neste mês tenho o prazer de apresentar como nosso mais novo colunista Mateus André Chies, que mostra como realizar transferência de arquivos via Socket com seu artigo “Transferindo Arquivos Utilizando o Componente Socket”.

Temos também o artigo “Criando uma classe para geração de relatórios em Delphi 2009” elaborado pelo nosso consultor técnico Antonio Spitaleri Neto, Felipe Santos dando continuidade ao seu artigo “Criptografia com Interbase – Seu Banco de Dados 100% protegido”, mostra a aplicação dos recursos de Criptografia abordados na edição anterior. Também numa continuação Luciano Pimenta nos mostra o potencial do GridView no artigo “Desvendando o GridView – Parte II”.

De volta este mês Djonatas Tenfen dá sequência aos seus artigos sobre jQuery com o artigo “jQuery – Aplicando efeitos em elementos HTML”.

Mas o que realmente quero enfatizar é minha alegria neste mês de co-memoração dos 15 anos do The Club. Nestes últimos anos passamos por diversas fases e inúmeros desafios dos quais estive presente em muitos deles. O maior desafio sem dúvida foi à reestruturação que iniciamos á pouco mais de um ano. Mas os desafios continuam, e a nossa vontade de se superar a cada dia e a cada nova ferramenta que surge também está presente. Agradeço a todos sócios, colaboradores, colunistas e consultores que fizeram com que o The Club chegasse até os dias de hoje sendo o que é: O maior clube de programadores do Brasil!

Parabéns.

Av. Profº Celso Ferreira da Silva, 190 Jd. Europa - Avaré - SP - CEP 18.707-150

Informações: (14) 3732-1529 Suporte: (14) 3733-1588

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 Megazine 2009

Diretor TécnicoMarcos César Silva

Diagramação e ArteVitor M. Rodrigues

RevisãoTassiane Fileto

ColunistasAdilson Jr.

Antonio Spitaleri NetoDjonatas TenfenFelipe Santos

Luciano PimentaLuis Alexandre de OliveiraMarco Antonio Armando

Mateus André ChiesVitor M. Rodrigues

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.

Page 5: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009 05

InfoNews

No dia 15 de setembro aconteceu em São Paulo o mini curso de Delphi 2010 a mais nova versão do Delphi que acaba de sair do forno.

Estiveram presentes desenvolvedores de todo o Brasil para prestigiar e principalmente conhecer as novidades do Delphi 2010.

Desenvolvido pela Em-barcadero Technologies líder de mercado em fornecimento de ferra-mentas de bancos de

dados multiplataforma e softwares para desen-volvedores, o Delphi 2010 veio com a promessa de muitas mudanças. E realmente foi o que vimos. A Embarcadero caprichou e trouxe muita novidade.

Veja algumas dessas novidades:

• Capacidades de Touch e Gesture, que permi-tem que os desenvolvedores construam aplicações GUI, tablet, touchpad e kiosk modernas, interativas e baseadas em touch com um flexível framework de componente capacitado para touch - que é de fácil utilização e funciona com as plataformas Windows 7, Windows 2000, XP e Vista.

• Conectividade estendida a bancos de dados, com suporte inédito ao popular banco de dados Firebird, com drivers atualizados para Microsoft SQL Server, Oracle e MySQL®. O aperfeiçoado framework multicamadas DataSnap™ permite acesso mais amplo aos protocolos de comunicação de padrão da indústria, incluindo os novos JSON e REST, que permitem interoperabilidade com outros serviços.

• Maior produtividade do desenvolvedor com o novo IDE Insight, uma ferramenta de economia de tempo que facilita a pesquisa de arquivos, com-ponentes, funções e configurações através do uso de atalhos e termos de pesquisa; formatador de código; Explorador de Classes C++; além de vários aperfeiçoamentos do depurador.

• Entre os aperfeiçoamentos da linguagem e do compilador estão a nova compilação de ba-ckground do Delphi e do C++Builder, Atributos e RTTI (Run-Time Type Information) para a linguagem Delphi, novo suporte à linguagem C++0x com Boost atualizado, bibliotecas STL e TR1 no C++Builder; e Programação Orientada pelo Aspecto (AOP) no Delphi Prism.

No mini curso de Delphi tivemos:

Andreano Lanusse (Product Line Mana-ger Latin America & Caribbean Embarcadero Technologies) abrindo o dia com o tema:

- Como aumentar produtividade com os novos recursos do IDE

Em seguida:

- Utilizando o novo driver dbExpress para Firebird

E também:

- Touch, Gesture, Direct 2D e Windows 7

Após o almoço Bruno Lichot (Capacita-ção de Vendas e Estratégia de Treinamentos Borland) continuou o dia com o tema:

- Dinamizando suas aplicações Delphi com a nova RTTI

Andreano voltou ao palco com o tema:

- Implementando criptografia, compacta-ção, callback e JSON com DataSnap 2010

E encerrando o dia Manoel Edésio (HK Engenharia) falou sobre:

- Implementando Nota Fiscal eletrônica de forma fácil e simplificada com Delphi 2010

Foi um dia muito produtivo onde não só vimos a evolução do Delphi, como também pudemos ter contato com outros desenvolvedores e trocar experiências.

Em nome do The Club agra-deço a toda equipe Embarcade-ro organizadora do evento. Em especial ao Andreano Lanusse (Product Line Manager Latin America & Caribbean Embarca-dero Technologies) que sempre nos recebe muito bem, a Lisa Flores (Account Manager, Latin America Embarcadero Tech-

Mini Curso de Delphi 2010

nologies), Virgínia Bento (Gerente de Marketing Coordenadora de Vendas SMB Micro Focus), Bruno Lichot (Capacitação de Vendas e Estratégia de Treinamentos Borland).

Agradeço também a presença dos sócios do The Club que estiveram presente tornando assim possível um contato mais próximo.

Marcos , Andtonio, Alexandre e Vitor

Marcos César (The Club) e Andreano Lanusse (Embarcadero)

Aproveito a oportunidade e saio fora do script para parabenizar o “The Club” pelos seus 15 anos.

Parabéns “The Club” e parabéns a todos que fazem parte dessa família.

Um grande abraço e “beijo nas crianças”!!!

Page 6: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 200906

Delphi

O título já nos da uma noção do objetivo principal deste artigo, transferir arquivo entre duas aplicações delphi versão 7 utilizando os componentes da palheta Internet ClientSocket e ServerSocket. A aplicação dessa forma de transferência de arquivos via rede vai de acordo com a necessidade e imaginação de cada programador. Existem diversas apli-cações simples e uteis que se pode aplicar, como por exemplo, transferir backup de banco de dados, transferência de backup de outros arquivos, transferência de arquivo multimídia, que geralmente são grandes, esses são apenas alguns exemplos.

Configurando a Parte Servidor

Crie uma nova aplicação no delphi 7, - File – New – Application, adicione a formulário principal um BitBtn, uma Label, um edit, 2 componentes Server-Socket, uma ProgressBar e ainda SaveDialog, e configure o layout e os nome conforme a figura 1. Ainda nos componente ServerSocket1 e ServerSocket2 a propriedade Port para 2038 e 2039 respectivamente.

Transferindo Arquivos Utilizando o Componente

Socket

Figura 1: Imagem do Servidor.

Vamos agora para codificação. Cria as seguintes variáveis globais:

var Form1: TForm1; TamanhoArquivo : Int64; Arquivo : TMemoryStream; RecebendoArquivo : Boolean; Data: String;

No evento onclick do BitBtn1 adicione a seguinte codificação que esta comentada.

procedure TForm1.BitBtn1Click(Sender: TObject);begin ServerSocket1.Active := not ServerSocket1.Active; //Ativa o Socket Server1 ServerSocket2.Active := not ServerSocket2.Active; //Ativa o Socket Server2 if ServerSocket1.Active then //Se o Socker Server1 estiver ativado BitBtn1.Caption := ‘Desativar’ //Desativa o BitBtn1 else //se não BitBtn1.Caption := ‘Ativar’; //Ativa o BitBtn1end

Page 7: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009 07

Transferindo Arquivos Utilizando o Componente

Socket

Nesse momento já é possível compilar a aplicação e testar o botão Ativar/Desativar o servidor.

Agora vamos codificar o evento ClientRead dos ServerSocket, que esse evento é acionado sempre que um cliente se conecta no servidor e envia algum tipo de dados. Conforme as codificações abaixo, comentada.

procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);Begin try Data := Socket.ReceiveText; //Para esse componente ServerSocket1 será enviado uma string como a extensão do arquivo Edit1.Text := Data; //Atribui a propriedade text do edit1 o valor da variavel Data except on E:Exception do ShowMessage(E.Message); end;end;

procedure TForm1.ServerSocket2ClientRead(Sender: TObject; Socket: TCustomWinSocket);Var TamBuffer : integer; Paux : pointer;begin if not RecebendoArquivo then // Se a variavel RecebendoArquivo for false Begin Socket.ReceiveBuf(TamanhoArquivo,sizeof(Int64)); // Recebe o tamanho do arquivo RecebendoArquivo := True; //Preenche a variavel com true if Arquivo = nil then //Se a variavel for Arquivo for vazio Arquivo := TMemoryStream.Create; //Aloca memória para a variável Arquivo ProgressBar1.Max := TamanhoArquivo;// Define que o máximo da processbar1 é o tamanho do arquivo end else //se não Begin TamBuffer := Socket.ReceiveLength; //recebe o tamanho do arquico GetMem(PAux,TamBuffer); Socket.ReceiveBuf(PAux^,TamBuffer); Arquivo.Write(PAux^,TamBuffer); //Preenche a variavel arquivo com o arquico recebido do clinte Dispose(PAux); ProgressBar1.Position := Arquivo.Size; //Nesse momento esta prenchendo a variavel e avaçando a processbar

if TamanhoArquivo = Arquivo.Size then //Quando chega ao final do arquivo Begin RecebendoArquivo := False; //Atribui false para a variavel RecebendoArquivo ShowMessage (‘Transferencia completa’); //Mostra a mensagem que a Tranferencia foi concluida If SaveDialog1.Execute then //Executa o SaveDialog1 Arquivo.SaveToFile(SaveDialog1.FileName); //Salva o arquivo no caminho selecionado pelo usuário Arquivo.Free; //Libera da memória o arquivo Arquivo := Nil; ProgressBar1.Position := ProgressBar1.Min; // Passa a posição para inicial na processbar end; end;end;

Agora a parte servidor já esta conluiada. Vamos começar codificar a parte cliente.

Configurando a Parte Cliente

Crie uma nova aplicação delphi 7 – File – New – Application, adicione a formulário dois edits, e dois label, dois BitBtn, dois ClientSocket e um OpenDialog, e configure o layout e os nome conforme a figura 2. Ainda nos componente ClientSocket1 e ClientSocket a propriedade Port para 2038 e 2039 respectivamente.

Figura 2: Imagem Cliente

Vamos agora para codificação. Cria as seguintes variáveis globais:

var Form1: TForm1; ArqTmp : TmemoryStream;

No evento onclick do bitBtn1 adicione a codificação abaixo que esta comentada.

Page 8: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 200908

procedure TForm1.BitBtn1Click(Sender: TObject);begin try ClientSocket1.Address := Edit1.Text; //Atribui a propriedade Address o endereço do servidor que esta no edit1 ClientSocket2.Address := Edit1.Text; //Atribui a propriedade Address o endereço do servidor que esta no edit1 if ClientSocket1.Active then // se ClientSocket1 esta ativo Begin ClientSocket1.Active := False;// Desabilita o ClientSocket1 ClientSocket2.Active := False;// Desabilita o ClientSocket2 BitBtn1.Caption := ‘Ativar’;// Altera o captio do BitBtn1 para Ativar BitBtn2.Enabled := False; // Desabilita o Bitbtn2 end else //se não Begin ClientSocket1.Active := True; // Ativa o ClientSocket1 ClientSocket2.Active := True; // Ativa o ClientSocket2 BitBtn1.Caption := ‘Desativar’; // Altera o Caption do BitBtn1 para Desativar BitBtn2.Enabled := True; //Habilita o BitBtn2 end; except on E:exception do ShowMessage(E.Message); end;end;

Nesse momento já é possível compilar a aplicação e testar o botão Ativar/Desativar o cliente, mas lembre-se para ativar e desativar o cliente é necessário ativar o servidor.

Agora vamos codificar o BitBtn2 que é o botão de enviar o arquivo, primeiro vamos executar o OpenDialog1 para seleciona um arquivo, vamos enviar um variável do tipo texto com a extensão do arquivo e posteriormente vamos enviar o tamanho do arquivo e enfim vamos enviar o arquivo. Conforme codificação abaixo que se encontra comentada.

procedure TForm1.BitBtn2Click(Sender: TObject);Var Tamanho : Int64;begin try if OpenDialog1.Execute then //Executa o OpenDialog1 para selecionar o arquivo Begin ClientSocket1.Socket.SendText(ExtractFileExt(OpenDialog1.FileName)); // Envia a extensão do arquivo ArqTmp.Clear; // Limpa a variavel

ArqTMp ArqTmp.LoadFromFile(OpenDialog1.FileName); // Carrega o arquivo na varial ArqTmp Tamanho := ArqTmp.Size; // Atribui a variavel Tamanho o tamanho do arquivo ClientSocket2.Socket.SendBuf(Tamanho,SizeOf(Int64)); // Envia o Tamanho do arquivo ClientSocket2.Socket.SendBuf(ArqTmp.Memory^,ArqTmp.Size);// Envia o arquivo end; except on E:exception do ShowMessage(E.Message); end;end;

Antes de compilar e testar temos que controlar as seguintes variáveis nos seguinte eventos o formulário, o oncreate, no momento que o formulário é criado e no onDestroy, no momento que o formulário é destruído, conforme codificação abaixo comentada.

procedure TForm1.FormCreate(Sender: TObject);begin ArqTmp := TmemoryStream.Create; //Aloca a memória da variavel ArqTmpend;procedure TForm1.FormDestroy(Sender: TObject);begin ClientSocket1.Close; //Fecha o ClientSocket1 ClientSocket2.Close; //Fecha o ClientSocket2 ArqTmp.Clear; // libera da memória o ArqTmp ArqTmp.Destroy; // Destroi o arquivo da memória ArqTmpend;

Conclusão:

Conclui-se com este artigo que se pode transferir qualquer tipo de arquivo via rede utilizando os componentes socket do delphi, ele é extremamente po-deroso, pode se transferir arquivo pela internet, enviar arquivo para a empresa ou para os clientes mesmo, ainda pode-se utilizar essa tecnologia para transferir arquivos multimídia com seus amigos. Agora basta programar a funcionalidade e passar a incrementar em suas aplicações, conforme sua necessidade utilize sua imaginação para aproveitar e incrementar.

Técnico em Informática, bacharelando em Sistemas de Informação.

Sobre o autor

Mateus André Chies

[email protected]

Page 9: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009 09

No desenvolvimento voltado a automa-ção comercial, sem dúvida os relatórios são parte fundamental. É através dos relatórios que o usuário do sistema verifica dados ge-rados pelo sistema e toma decisões.

O Delphi 2009 traz em sua instalação o gerador de relatórios Rave Reports 7.6, sem dúvida uma boa opção de software para geração de relatórios.Porém quando trabalhamos com Rave,

nos deparamos com um incoveniente: Temos de criar datasets específicos para cada tipo de relató-rio que desejamos adicionar ao sistema. Isso em um sistema maior traz uma certa desorganização devido ao excesso de componentes. Esse problema pode ser reduzido com a geração de relatórios em run-time, possibilidade pouco explorada pelos usuários do Rave reports.

Nesse artigo estarei mostrando como pode-mos criar uma classe que irá montar os relatórios no Rave em run-time sem necessidade de criação de datasets e layouts de relatório específicos para cada situação.

Montando a Aplicação exemplo

Inicie uma nova aplicação no Delphi 2009 e faça a conexão com o banco de dados.Não entrarei em detalhes sobre a conexão já que não é o foco do artigo, mas estarei usando no exemplo o banco employee.fdb que acompanha o firebird, e para a

Criando uma classe para geração de relatórios em Delphi 2009

conexão estarei utilizando o driver dbexpress.Um detalhe com relação a conexão: No com-

mandtext do componente sqldataset, traga apenas os seguintes campos da tabela employees: DEPT_NO, FIRST_NAME, HIRE_DATE, JOB_COUNTRY. Isso será necessário para uma melhor organização do relatório, mas nada impede que sejam utilizados mais campos, sempre levando em consideração a necessidade de momento em relação ao relatório que será gerado.

Após realizadas as conexões, monte o layout da aplicação exemplo de acordo com a figura a seguir:

Veja a Figura 1.

Vamos agora a codificação, no evento onclick do botão”Pesquisar” faça:

Esse evento é apenas adicionar um recurso a mais na aplicação e permitir ao usuário realizar uma pesquisa na base de dados.

procedure Tfrmpesqveiculos.sppesquisarClick(Sender: TObject);begin

Figura 01

Page 10: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 200910

with DataModule1.cdsemployee do begin Close; CommandText:=’select * from EMPLOYEE where FIRST_NAME like ‘+QuotedStr(‘%’+edtveiculo.Text+’%’); Open; end;end;

No evento onclick do botão “Relatório” iremos disparar a criação do relatório através do compo-nente rvsystem1:

Rvsystem1.execute;

Criando a classe

Iremos agora realizar a implementação da classe que irá ser a responsável por gerar o re-latório em tempo de execução através da leitura de um componente clientdataset. No exemplo nomeei o clientdataset utilizado para a conexão como cdsemployee, é esse client que será lido pela nossa classe.

Adicione uma nova unit ao projeto, e salve-a com o nome de unclassrelatório.

Na seção uses da unit, faremos a declaração das units que serão utilizadas por nossa classe, veja a declaração a seguir:

uses windows,forms,graphics,sysutils,db,dbclient,classes,rpsystem,rpbase,rpdefine,dialogs;

Ainda na interface , antes de declararmos a classe de relatório, criaremos um tipo de dado que será utilizado pela classe. Esse tipo de dado é necessário para que um dos métodos de nossa classe retorne um array de strings. Veja:

type Relcampos=array of string;

Agora iremos declarar a classe.Nossa classe terá o nome TRelatório com o T maiúsculo inicial a fim de seguir o padrão de nomenclatura de tipos do Delphi. Faça a declaração conforme mostrado a seguir:

type TRelatorio=class dset:TClientDataSet; reporttitle:string; private function preenchearray:Relcampos; procedure printreport(report:TBaseReport); public procedure executerep (report:TBaseReport); end;

Os dois atributos da classe: dset e reporttitle estão declarados fora da seção public porém as demais units do projeto terão acesso a eles.

O atributo dset será a fonte de dados para o relatório, representada por um componente clientdataset.

Reporttitle é o atributo através do qual será definido o título do relatório.

Na seção private colocamos as declarações de métodos que serão necessários apenas para a classe e estarão invisíveis para o restante do projeto. São eles:

Preenchearray: esse método fará a leitura dos nomes dos campos do dataset e retornará um array com esses nomes para serem utilizados na monta-gem do relatório. É esse método que fará uso do tipo Relcampos que criamos anteriormente.

Printreport: esse método fará a montagem do relatório com as colunas e os dados provenientes do dataset.

Na seção public declaramos o método exe-cuterep que será o responsável por “disparar” os métodos de montagem do relatório e será utilizado pelo projeto para executar o relatório.

Vamos agora a implementação dos métodos:

Método preenchearray:

Esse método fará uma leitura dos nomes dos campos do clientdataset representado pelo atribu-to dset e preencherá o um array com esses nomes retornando esse array para a função printreport.

function TRelatorio.preenchearray: Relcampos;

var campos:Relcampos; i:integer;begin SetLength(campos,dset.FieldCount); for i:=0 to dset.FieldCount-1 do campos[i]:=dset.Fields[i].FieldName; Result:=campos;end;

Método printreport:

Esse método é o mais importante da classe, já que será o responsável por montar as colunas do relatório e inserir os dados presentes no clientda-taset no mesmo.

Repare que este método possui quatro laços de repetição: o primeiro marca as colunas de acordo com a quantidade de campos do dataset, o segundo coloca o nome de exibição do campo (displaylabel) como cabeçalho de cada coluna, e por fim temos um laço while combinado com um laço for para inserir no relatório os dados presentes no dataset.

procedure TRelatorio.printreport(report: TBaseReport);var i:integer; campos:Relcampos;begin campos:=preenchearray; with report do begin GotoXY(2.0,1.0); SetFont(‘Arial’,16); Print(reporttitle); NewLine; NewLine; SetFont(‘Cambria’,12); FontColor:=clred; for I := 0 to dset.FieldCount-1 do SetTab((i+0.1)*2,pjLeft,i+1,0,0,0); NewLine; for I := 0 to dset.FieldCount-1 do PrintTab(dset.Fields[i].DisplayLabel); NewLine; dset.First;

Page 11: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009 11

SetFont(‘Cambria’,10.0); FontColor:=clBlack; while not dset.Eof do begin for I := 0 to dset.FieldCount - 1 do PrintTab(dset.FieldByName(campos[i]).AsString); NewLine; dset.Next; end; end;end;

Repare que na montagem do relatório estou utilizando a fonte Arial 16 para o título, cambria 12 para o cabeçalho das colunas e cambria 10 para os dados. Fique a vontade para alterar a fonte de acordo com sua preferência.

Método executerep:

Esse método será o “gatilho” utilizado pelas demais units do projeto para disparar a montagem do relatório através do método printreport.

Aqui também é realizada a abertura e fe-chamento da fonte de dados e o tratamento de possíveis erros na geração de relatórios.

procedure TRelatorio.executerep (report:TBaseReport);begin try try dset.Open; printreport(report); except ShowMessage(‘Erro ao gerar Relatório’); Abort; end; finally dset.Close; end;end;

Gerando o relatório

Com a nossa classe devidamente criada, vamos testá-la no aplicativo.

Inclua a unit onde se encontra a classe na unit principal do projeto.Selecione o objeto rvsystem1 e no evento onprint faça:

procedure Tfrmpesqveiculos.RvSystem1Print (Sender: TObject);var rel:TRelatorio;begin try rel:=TRelatorio.Create; rel.dset:=DataModule1.cdsemployee; rel.reporttitle:=’Employees’; rel.executerep(RvSystem1.BaseReport); finally FreeAndNil(rel); end;end;

Execute o projeto e clique no botão relatório.Se tudo cor-rer bem o relatório será gerado com a seguinte aparência:

Figura 02

Veja a Figura 02.

Conclusão

A possibilidade que o ravereports em conjunto com o Delphi 2009 nos oferece para gerarmos rela-tórios totalmente em run-time sem dúvida é uma boa solução quando desejamos criar relatórios para diferentes necessidades em nossas aplicações sem recorrer a criação de datasets específicos para cada relatório. Isso sem dúvida torna o projeto muito mais organizado.

Abraços e até a próxima!

Consultor Técnico The Club.

Sobre o autor

Antonio Spitaleri Neto

[email protected]

Page 12: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 200912

Olá pessoal,

No artigo desse mês, vamos dar continui-dade ao assunto Criptografia com o InterBase SMP 2009. Na edição anterior mostramos o que é, como funciona e quais os níveis de criptografia que o InterBase oferece. Agora iremos ver como aplicar, como utilizar todos esses recursos. Vale lembrar que para poder-mos utilizar a Criptografia com o InterBase, o recurso de Embedded User Authetication (EUA) deve estar ativo. Mas esse assunto já foi bem detalhado na edição anterior.

Vamos então começar detalhando o pri-meiro nível de criptografia do InterBase – o Database Level Crypt.

DATABASE LEVEL CRIPT

O Database Level Cript é o primeiro nível de criptografia do InterBase e é a base para todos os outros níveis. Podemos ativar o Database Level Cript utilizando tanto os utilitários de linha de comando bem como o IBConsole. Vamos passo-a-passo demonstrar utilizando o IBConsole:

1. Abrimos as propriedades do banco de dados que desejamos criptografar:

2. Com o EUA ativo, a propriedade Encryp-ted é ativada. Alteramos seu valor de NO para YES e confirmamos:

CRIPTOGRAFIA COM INTERBASE

SEU BANCO DE DADOS 100% PROTEGIDOPARTE 2

3. Ao confirmarmos, um Wizard guiará o processo de criptografia que será confirmada em três etapas.

a. A definição da senha do usuário SYSD-SO. O novo usuário de sistema SYSDSO é o usuário responsável pela criação das chaves de criptografia. Somente o usuário SYSDSO poderá criar e gerenciar as chaves de criptografia que utilizaremos em todos os níveis. O usuário SYSDBA então utilizará as cha-ves criadas pelo SYSDSO para criptografar o banco de dados, suas tabelas, colunas, comunicação e backups. Na prática a tarefa de SYSDSO acabará sendo feita pelo próprio administrador que possui a senha de SYSDBA, mas possibilita também que outra pessoa seja responsável pelas chaves, adap-tando o modelo a diversos padrões de segurança.

Page 13: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009 13

b. A definição da SEP (System Encryption Password). É uma senha padrão que será utilizada em conjunto com a chave de criptografia para criptografar o banco de dados. Essa senha será vinculada ao hardware do servidor InterBase. Assim o banco de dados criptografado não poderá ser movido para outro servidor. Opcionalmente você pode marcar o checkbox EXTERNAL da tela para que essa senha não seja gravada com o hardware.

c. A criação chave de criptografia do banco

de dados. A chave deverá ter um nome que pode ou não ser Case Sensitive. Você também pode determinar que essa primeira chave seja a chave padrão para ser utilizada futuramente em outros níveis. A chave pode também ter a marcação de With Grant Option, que permitirá ao usuário SYSDBA delegar a outros usuários poderes de dar ou retirar permissões sobre essa chave. Escolhe-se então o padrão da chave (AES ou DES), o tamanho da chave (dependendo o tipo da chave podendo chegar até 256 bits) e se queremos ativar as opções INIT VECTOR e PADDING para criar uma chave mais forte (recomendado).

d. Pronto. O banco de dados já estará criptografado em seu primeiro nível:

COLUMN LEVEL CRIPT

Uma vez que o banco de dados já está cripto-grafado, podemos agora criptografar suas tabelas e colunas. Vejamos o passo a passo:

1. Conectamos no banco de dados com o novo usuário SYSDSO para criarmos uma nova cha-ve de criptografia. Novamente definiremos o nome da chave, seu padrão de cifragem e seu tamanho. A chave opcionalmente pode ser composta com uma senha. Importante: Chaves com senhas são necessárias quando desejamos utilizar criptografias em backups.

Veja a Imagem 6.

2. Agora, voltamos a nos conectar como SYSDBA para aplicar a criptografia. A criptografia em colunas e tabelas pode ser feita em tabelas já existentes, bem como em novas tabelas. Podemos utilizar o IBConsole para editar uma determinada coluna e aplicar a criptografia. Informamos a chave que desejamos utilizar e opcionalmente informa-mos um valor Decrypt Default. Esse valor será exibido sempre que um usuário sem permissão de acesso à descriptografar a coluna tentar ler o con-teúdo da mesma. Se esse valor não for informado então o usuário receberá uma exception de erro de falta de direito de acesso à ação. Vale informar também o Decrypt Default deve obedecer ao tipo de dado da coluna, ou seja, se a coluna é do tipo Integer, então o valor deve ser Integer também, e assim por diante.

Veja a Imagem 7.

Podemos também criar novas tabelas e colu-nas já criptografadas, como no exemplo:

Imagem 6

Imagem 7

Page 14: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 200914

CREATE TABLE NEW_TABLE( CODIGO INTEGER NOT NULL, SALARIO NUMERIC(7,2) NOT NULL ENCRYPT WITH “COL_CRIPT” DECRYPT DEFAULT 0)

3. Pronto, nossa coluna já está cripto-grafada. Se um usuário qualquer tentar ler essa coluna o mesmo verá todos os registros com o valor = 0. Se desejarmos aplicar direito a um usu-ário para que ele possa ler essa coluna, podemos utilizar os comandos DML GRANT e REVOKE, ou utilizar o utilitário IBConsole. Para isso, editamos e incluímos uma permissão de acesso ao usuário desejado, informado, por exemplo, que o mesmo pode descriptografar a tabela e quais as colunas ele pode descriptografar. A imagem abaixo ilustra essa aplicação:

Veja a Imagem 8.

4. Pronto. Já temos o segundo nível de criptografia configurado.

BACKUP LEVEL CRIPT

Para utilizarmos nível de criptografia em backups precisamos já possuir uma chave de criptografia associada a uma senha. Essa é uma tarefa do usuário SYSDSO, como já havíamos visto anteriormente.

Veja a Imagem 9.

Agora podemos utilizar o IBConsole na sessão de backup e realizar um backup criptografado. Na tela do backup será solicitada a chave de crip-tografia desejada. Basta informar e conformar o processo:

Veja a Imagem 10.

Para restaurar o backup, a senha da chave de criptografia e a chave SEP serão solicitadas. Caso alguma dessas informações seja informada errada, o usuário não conseguirá restaurar o backup:

Imagem 8

Imagem 9

Imagem 10

Page 15: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009 15

Podemos também utilizar o utilitário GBAK para criar e restaurar backups criptografados:

GBAK –B –ENCRYPT BKP_CRIPT –SEP 1234 BANCO.IB BANCO.IBK

GBAK –C –DECRYPT 123 –SEP 1234 BANCO.IBK BANCO.IB

CONCLUSÃO

Bom, fica bem claro que a criptografia com o InterBase SMP 2009 está muito completa e interes-sante. Aos desenvolvedores está ai um excelente oportunidade de oferecer mais segurança, novos

Felipe Santos é especialista em InterBase. Trabalha com o InterBase desde 2001. atuando como consultor e instrutor do produto em todo Brasil. Especialista em ambientes críticos. Atua e trabalha com os maiores clientes do InterBase no Brasil. Participante ativo na comunidade, com diversos artigos publicados. Participante do grupo de beta testers mundial do produto. Palestrante em eventos como IB Tour, Borcon Conference, CodeRage Latin América, Delphi Developers Day, Linux Day, entre outros. Atualmente trabalhando na área técnica do InterBase na Presence Tecnologia – agente oficial especializado do produto no Brasil.

Sobre o autor

Felipe Santos

[email protected]

recursos e serviços aos clientes, tudo de forma fácil e com poucas implementações. Ao usuário final o InterBase oferece um padrão excelente de segu-rança para atender às mais diversas necessidades e padrões exigidos. Não deixem de buscar mais informações a respeito, tanto na primeira parte de nosso artigo na edição anterior ou mesmo nos guias do InterBase.

Espero com esse artigo ter ilustrado a todos o poder da criptografia do InterBase e, consequen-

temente, uma forma de tornar seu banco de dados 100% protegido.

Até a próxima.

Referência:

InterBase 2009 Operations Guide – cap. 5 e 13.

Page 16: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 200916

Theming é uma nova ferramenta pre-sente desde o ASP.NET 2.0 que nos auxilia de maneira eficiente através de “skins files” a configuração visual das páginas de maneira concentrada, onde com pequenos passos é possível determinar o estilo visual de todos os controles de uma página, um projeto ou de todos os projetos presentes em um servidor Web.

Em um primeiro momento, o que estou dizen-do parece soar de maneira familiar, que remete ao já consagrado Cascading Style Sheet, ou simples-mente CSS. Apesar da semelhança de objetivos, estamos tratando de soluções cuja implementação é totalmente antagônica, pois estilos CSS embora sejam extremamente funcionais, sua aplicação é ligeiramente penosa pois a habilitação é controle a controle, individualmente.

Temas trazem uma nova proposta de confi-guração visual, ao invés da aplicação individual de todos os controles das páginas, uma configuração única, vinculada ao tipo de controle. Observe abai-xo a diferença das duas abordagens.

No CSS é necessário configurar a propriedade CssClass de cada controle, veja este exemplo com um TextBox:

<asp:TextBox id=”TextBox1” style=”Z-INDEX: 1; LEFT: 318px; POSITION: absolute;

Theming e Skins no ASP.NET com

Visual Studio 2008 TOP: 406px” runat=”server” cssclass=”CaixaTexto”></asp:TextBox>

Skins, uma nova abordagem

A aplicação de temas através de skins no Vi-sual Studio 2008 é bem simples, basta que em seu projeto ASP.NET adicione um novo item, um Skin File: Add New Item... (Ctrl + Shift + A)”.

Figura 1 Veja a Figura 2.

Em seguida, um diálogo explica sobre a ne-cessidade da pasta App_Themes e pergunta se adiciona esta pasta ao projeto ou não. Temas por padrão, são gravados na pasta App_Themes, portanto, pressione “Yes”.

Veja a Figura 3

Um arquivo SkinFile.skin é adicionado a Solução, dentro da pasta Theme1, que pode ser renomeada posteriormente. A pasta Theme1 tem sua importância pois é através dela que aplicamos o skin. Observe no Solution Explorer, a estrutura de pastas App_Themes | Skin1 | Skin1.skin.

Figura 4

O conteúdo do SkinFile.skin trás orientações de como definir o skin, opcionalmente poderá ser apagado. Nossas configurações ficaram neste arquivo.

Veja a Figura 5.

Neste exemplo, vamos configurar o skin para o controle TextBox. Observe que a configuração segue o próprio elemento utilizado no arquivo .aspx.

Page 17: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009 17

Theming e Skins no ASP.NET com

Visual Studio 2008 Figura 2

Figura 3

Figura 5

<asp:TextBox runat=”server” backcolor=”#FFFFC0” borderstyle=”Solid” borderwidth=”1px” bordercolor=”#00C000” />

Observe que o ID do controle foi suprimido, pois este skin será aplicado a todos os controles do tipo TextBox.

Aplicando os Skins

Uma vez configurado o Skin1.skin, chega o momento de determinar a abrangência desta configuração.

Todos os controles de uma página

Para uma página específica, o tema deverá ser habilitado através do atributo “Theme” no arquivo .aspx.

<%@ Page Language=”C#” Theme=”Skin1” AutoEventWireup=”true” CodeBehind=”Default.aspx.cs” Inherits=”WebApplication1._Default” %>

Por todo o projeto

Para aplicar o skin em todos os controles de um projeto, configuramos o arquivo web.config, presente no Project Manager. Usamos o elemento <pages> dentro do <system.web>.

<pages theme=”Skin1”> <controls> <add tagPrefix=”asp” namespace=”System.Web.UI” assembly=”System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35”/> <add

tagPrefix=”asp” namespace=”System.Web.UI.WebControls” assembly=”System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35”/> </controls> </pages>

Em todos as aplicações ASP.NET em um servidor Web

O arquivo machine.config (‘C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG’) concentra configurações que tem efeito sobre todo servidor Web, com isto, basta que adicionemos o elemento <pages> .

<pages buffer=”true” enableSessionState=”true”

Page 18: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 200918

enableViewState=”true” enableViewStateMac=”true” autoEventWireup=”true” validateRequest=”true” enablePersonalization=”false” theme=”Skin1” >... </pages>

O SkinID

A propriedade SkinID presente nos controles ASP.NET, permite que o skin seja aplicado em controles específicos, permitindo que possamos criar diversos estilos para um tipo de controle. O atributo devera ser adicionado a configuração do controle no skin file.

<asp:TextBox runat=”server” SkinID=”Caixa1” backcolor=”#FFFFC0” borderstyle=”Solid” borderwidth=”1px” bordercolor=”#00C000” /><asp:TextBox runat=”server” SkinID=”Caixa2” ForeColor=”Red” />

Feito este ajuste, basta que selecione “Caixa1” ou “Caixa2” na propriedade SkinID no controle desejado.

O EnableTheming

O EnableTheming é uma propriedade boolea-na presente nos controles ASP.NET que determina se skins poderão ser aplicados ao mesmo.

Veja a Figura 7.

Multi-Theming

Em um projeto é possível a presença de vários temas e skins, divididos em diretórios, o que nos permite determinar o layout dos controles dina-micamente. Observe que foi adicionado mais dois temas, “Skin2” e “Skin3”.

Figura 7

Figura 8

Mudando o tema dinamicamente

Você pode usar o métido Page_PreInit para troca o tema da página em tempo de execução, veja:

protected void Page_PreInit(object sender, EventArgs e) { Page.Theme = “Skin2”; }

Skins e CSS

É possível usar skins com estilos CSS, basta que

com o botão direito sobre a pasta App_Themes adi-cionar um novo item. Adicione um Style Sheet.

No arquivo gerado, clique com o botão direito

e selecione a opção “Add Style Rule”.

Figura 9

Veja a Figura 10.

Selecione a opção “Class Name” e digite Tex-tBoxStyle. Em seguida, pressione o botão botão para adicionar ao “Style rule hierarchy”.

Agora, com o botão direito sobre a classe CSS “TextBoxStyle, selecione a opção “Build Style”.

Figura 11

Page 19: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009 19

Figura 10

Figura 12

Veja a Figura 12.

Vamos configurar a categoria “Border”, como na figura 12.

Agora basta modificar nosso Skin1:

<asp:TextBox runat=”server” CssClass=”TextBoxStyle” />

Finalmente, adicione a página a referência ao estilo:

<link rel=”stylesheet” type=”text/css” href=”App_Themes/Stylesheet1.css” />

Veja a Figura 13.

Conclusão

Theming é o novo jeito de pensar configuração de layouts em páginas ASP.NET, use e divirta-se.

Diretor de Tecnologia da TDS, centro de treinamentos oficiais CodeGear/Borland/Embarcadero no Rio de Janeiro. Professor, palestrante, conferen-cista, certificado CodeGear RAD Studio 2007, StarTeam e CaliberRM. Atua como Arquiteto, na área de análise e desenvolvimento orientado a objetos em C# há 2 anos e em Delphi há mais de 12 anos. Atualmente trabalha com treinamentos, consultoria e desenvolvimento de soluções para as platafor-mas Win32 e .NET.

Sobre o autor

Adilson Jr

[email protected] 13

Page 20: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 200920

Olá, Espero os leitores do primeiro artigo sobre jQuery tenham gostado, estarei agora explanando o segundo artigo da série de 3.

O Objetivo deste artigo é falar sobre Efeitos em elementos HTML com o jQuery, uma parte bem legal do jQuery e We2.0. Esses efeitos podem ser combinados e conseguimos construir componentes “na mão”.

Agora depois da apresentação do artigo vamos colocar a mão na mas-sa. Vamos começar com um efeito simples “show()”. Esse efeito tem como sua funcionalidade apresen-

tar determinado conteúdo de um contexto exemplo pode ser uma “div” ou um “span”. Primeiro Vamos criar uma nova Página no Visual Studio 2008 ( File > New > Web Site ) selecione a opção Asp.Net WebSite indique o diretório a ser utilizado e click em Ok, depois da página Default.aspx criada vamos adicione o Plugin do jQuery conforme instruções no artigo anterior na revista The Club Magazine de Julho de 2009.

Agora vamos implementar o Código listado na listagem 1. Dentro das Tag <form> </form> vamos implementar primeiro um Botão HTML ( lembre-se elementos HTML carregam mais rapidamente que elementos ASP.NET ) depois declaramos uma div com o ID divTexto e com a propriedade display do style como none ( não queremos que ela apareça agora ), então agora executamos a Página ( F5 ) e vamos verificar que apenas o botão irá aparecer

<input type=”button” value=”TESTE” onclick=”onClickBtn()” name=”btnTeste” > <div id = “divTexto” style=”display:none”> Informe um Texto ou um valor qualquer dentro da DIV.Pode ter qualquer conteudo aqui <br /></div>

<head runat=”server”><title></title><script src=”jquery-1.3.2.js” type=”text/javascript”></script> <script type=”text/javascript”> function onClickBtn() { $(‘#divTexto’).show(); } </script></head><body> <form id=”form1” runat=”server”> <div> <input type=”button” value=”TESTE” onclick=”onClickBtn()” name=”btnTeste” > <div id = “divTexto” style=”display:none”> Informe um Texto ou um valor qualquer dentro da DIV. Pode ter qualquer conteudo aqui <br /> </div> </div> </form></body>

Listagem 01.

Listagem 02.

Aplicando efeitos em elementos HTML

Page 21: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009 21

em nossa página.Depois do nosso exemplo base construído

vamos aplicar o primeiro efeito. Listagem 2. Nesse código adicionamos entre as tag <head> e </head> a chamada para o arquivo js do jQuery, uma boa pratica e facilidade é simplesmente arrastas o arquivo js ( incluído anteriormente no projeto ) depois abrimos uma nova tag <script> indicando o tipo de Script que vamos usar no nosso caso “text/JavaScript” declaramos uma função denominada onClickBtn() como o próprio nome já diz essa função será responsável pelo evento on click do botão que criamos anteriormente, conforme visto no artigo anterior quando indicamos # na chamada do jQuery indica o ID do atributo então indicamos “$(‘#divTexto’).show(); “ ou seja, o jQuery vai mostrar a nossa div divTexto que estava com o display none quando criamos a nossa página. En-tão quando executamos a nossa página teremos a seguinte imagem ( imagem 1 ) depois que clicarmos no botão teremos a seguinte imagem (imagem 2). Depois de testar esse primeiro exemplo anterior vamos alterar agora a linha $(‘divTexto’).show(); para $(‘divTexto’).show(‘slow’); depois que alterar testamos novamente a página e veremos que o efeito será diferente, vai apresentar a div igual mas agora com um efeito de transição lento, podemos alterar o parâmetro slow para fast e veremos que ele o jQuery vai fazer novamente o efeito do slow mas dessa vez rápido. Ok, Esse é o primeiro efeito que fizemos com o jQuery, conseguimos mostrar agora se quisermos esconder novamente a div basta criar um outro botão e em no on click do segundo botão chamamos outra função com uma única alteração ao invés de show usamos o método hide. ( listagem 3 ).

Outros eventos que podemos testar são: slideDown(); slideUp(); fadeIn(); fadeOut(); todos os efeitos tem a opção de colocar a velocidade como primeiro parâmetro e se necessário pode-mos incluir um callback, ou seja, uma função que será executada após o fim do efeito exemplo em listagem 4.

Depois de uma abrangência geral de efeitos agora vamos fazer algo que pode ser muito útil aos desenvolvedores, vamos criar um Menu em árvore (TreeView ) com jQuery puro sem a necessidade de um Plugin externos (veja imagem do exemplo nas Imagem 3 e 4). Inicialmente vamos fazer uma lista conforme Listagem 5. Nesta listagem criamos apenas uma Lista normal HTML, no próximo artigo com o implementação de Ajax e jQuery irei mostrar como construir esse menu dinamicamente através de requisição assíncrona ao servidor. Agora in-

<html xmlns=”http://www.w3.org/1999/xhtml”><head runat=”server”> <title></title>

<script src=”jquery-1.3.2.js” type=”text/javascript”></script> <script type=”text/javascript”> function onClickBtn() { $(‘#divTeste’).show(‘slow’); }

function onClickBtnHide() { $(‘#divTeste’).hide(‘slow’); } </script></head><body> <form id=”form1” runat=”server”> <div> <input type=”button” value=”Mostrar” onclick=”onClickBtn()” name=”btnTeste”> <br /> <input type=”button” value=”Esconder” onclick=”onClickBtnHide()” name=”btnHide”> <div id = “divTeste” style=”display:none”> Informe um Texto ou um valor qualquer dentro da DIV. Pode ter qualquer conteudo aqui <br /> </div> </div> </form></body></html>

Listagem 03.

Imagem 01

Imagem 02

Page 22: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 200922

cluímos o Código da Listagem 6 ao nosso código, esse código da listagem 6 deve ser escrito entre as tags <head> e </head>. Apenas para incrementar mais o nosso exemplo inclui 2 imagens em nosso projeto minus.gif e plus.gif, minus.gif é o sinal de – da treeview que indica “recolher” os itens o a imagem plus.gif indica o + da treeview ou seja expande os items.

Agora vamos entender o código: Primeiramen-te, seleciona-se todos os itens que possuem filhos da lista aplicando-se o seletor de confinamento jQuery li:has(ul) e aplica-se uma série encadeada de comandos jQuery aos elementos coincidentes, começando por anexar um manipulador click. Esse manipulador click checa se o elemento target do event coincide com o this. Isso é válido apenas quando o item clicado for o mesmo sobre o qual o callback foi estabelecido. Isso nos permite ignorar cliques sobre os elementos filhos. Afinal, apenas queremos abrir e fechar um item quando os usuá-rios clicam no item pai, não em um de seus filhos. Se determinamos que um item pai foi clicado, então se define que seus filhos estão escondidos ou mostrados empregando o cômodo comando is() usando o filtro :hidden. Se os filhos estiverem escondidos, serão revelados usando-se o show(), e se mostrados serão escondidos usando-se hide(). Em qualquer um dos casos, muda-se o marcador do item pai para a imagem de mais ou de menos (como apropriado) e devolve-se false como o valor do call-back para evitar propagação excessiva. Define-se o formato do cursor do mouse para o ponteiro ativo usando o comando css() e esconde-se os elementos filhos para os itens ativos, executando as ações definidas dentro da sentença else da instrução IF no manipulador de clique, invocando-se o manipu-lador de clique. Como último passo antes que os usuários possam interagir com a página, é preciso martelar alguns elementos de estilo para os itens folha. Definimos o estilo list-style-image ( o qual o marcador de item ) dos itens ativos como uma das imagens GIF de mais ou de menos, conforme men-cionado anteriormente, não queremos que essa configuração seja herdada para os itens da lista que são filhos desses itens. Para impedir isso definimos se explicitamente o valor de propriedade de estilo list-style-image como none para todos os itens de css da lista. Porque os definimos diretamente sobre os itens, isso torna-se precedência sobre qualquer valor herdado. Faz-se o mesmo para o cursor do mouse para os itens folha definindo-o como o for-mato de cursor de mouse padrão. De outra forma, os itens folha contidos em um pai ativo herdaria o formato do cursor ativo.

<html xmlns=”http://www.w3.org/1999/xhtml”><head runat=”server”> <title></title>

<script src=”jquery-1.3.2.js” type=”text/javascript”></script> <script type=”text/javascript”> function onCallBack(sMensagem) { alert(e); alert(‘Executando função onCallBack’); }

function onClickBtn() { $( ‘#divTeste’).show(‘slow’, onCallBack(‘Executando CallBack’)); }

function onClickBtnHide() { $(‘#divTeste’).hide(‘slow’); } </script></head><body> <form id=”form1” runat=”server”> <div> <input type=”button” value=”Mostrar” onclick=”onClickBtn()” name=”btnTeste”> <br /> <input type=”button” value=”Esconder” onclick=”onClickBtnHide()” name=”btnHide”> <div id = “divTeste” style=”display:none”> Informe um Texto ou um valor qualquer dentro da DIV. Pode ter qualquer conteudo aqui <br /> </div> </div> </form></body></html>

Listagem 04.

Imagem 03 Imagem 04

Page 23: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009 23

<html xmlns=”http://www.w3.org/1999/xhtml”><head runat=”server”> <title></title>

<script src=”jquery-1.3.2.js” type=”text/javascript”></script></head><body> <fieldset> <legend> TreeView com Atributos UL &mdash; Tomada - 1 </legend> <ul> <li> Item 1 </li> <li> Item 2 </li> <li> Item 3 <ul> <li> Item 3.1 </li> <li> Item 3.2 <ul> <li> Item 3.2.1 </li> <li> Item 3.2.2 </li> <li> Item 3.2.3 </li> </ul> </li> <li>Item 3.3</li> </ul> </li> <li> Item 4 <ul> <li> Item 4.1 </li> <li> Item 4.1 </li> <li> Item 4.2 <ul> <li> Item 4.2.1 </li> <li> Item 4.2.2 </li> </ul> </li> </ul> </li> <li> Item 5 </li> </ul> </fieldset></body></html>

<script src=”jquery-1.3.2.js” type=”text/javascript”></script> <script type=”text/javascript”> $(function() { $(‘li:has(ul)’).click(function(event) { if (this == event.target) { if ($(this).children().is(‘:hidden’)) { $(this).css(‘list-style-image’, ‘url(minus.gif)’).children().show(); } else { $(this).css(‘list-style-image’, ‘url(plus.gif)’).children().hide(); } } return false; }).css(‘cursor’, ‘pointer’).click(); $(‘li:not(:has(ul))’).css({ cursor: ‘default’, ‘list-style-image’: ‘none’ }); }); ‘#divTeste’).show(‘slow’, onCallBack(‘Executando CallBack’)); </script>

Então é isso Pessoal. Espero que tenham gostado do artigo, aceito dúvidas e sugestões através do meu e-mail [email protected]

Trabalha a quase 7 anos com Delphi, trabalha na empresa Operacional Textil (www.operacionaltextil.com.br ) na área de tecnologia desenvolvendo ferramentas em Delphi e como hobby e visão de mercado está migrando seus conhecimentos para a plataforma .NET. Faz parte do grupo .NET Blumenau http://dotnetblumenau.ning.com/ . Possue certificação 70-536 (Microsoft .NET Framework 2.0 Application Development Foundation ) .

Sobre o autor

Djonatas Tenfen

[email protected] 05.

Listagem 06.

Page 24: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 200924

Continuaremos neste artigo as dicas de GridView que iniciamos na edição anterior. Veremos dicas de como trabalhar com ima-gens, agrupamento, validações e somatórios etc.

Trabalhando com imagens

Mostrar imagens no GridView é simples. Por exemplo, para mostrar imagens nos comandos de seleção, exclusão, atualização e edição, basta con-figurar propriedades no editor de colunas.

Use a imagem que desejar na propriedade XXImageURL, onde o XX é o tipo de comando (Cancel, Delete, Insert, Update). Por último altere ButtonType para Image. Em uma tabela de clien-tes, certamente possuimos um campo indicador do sexo.

Por que não, mostrar no GridView a listagem dos clientes e de acordo com o sexo, mostrar uma imagem diferente? Nesse exemplo, usei um arquivo XML para preencher o GirdView.

Nele temos um campo chamado SEXO, salvan-do, obviamente: “M” ou “F”. Adicione o código da Listagem 1 na página.

Listagem 1. Criando um método que retorne o nome do arquivo

protected string RetornaImagem (string sSexo){ string sRetorno = “”; if (sSexo == “M”) sRetorno = “~/imagens/M.png”; else if (sSexo == “F”) sRetorno = “~/imagens/F.png”; return sRetorno;}

O código retorna o nome do arquivo, salvo na pasta imagens de acordo com o valor passado como parâmetro. No editor de colunas do Grid-View, para o campo SEXO, transforme-o em um TemplateField.

Acesse o editor de templates e adicione um Image. Acesse a Smart Tag e escolha a op-ção Edit DataBindings. Na tela, escolha Custom binding e digite: “RetornaImagem(Convert.ToString(Eval(“SEXO”)))”.

Com esse código, fizemos o Bind na proprie-dade ImageURL do controle, que passará o valor do campo SEXO através do Eval(“SEXO”). Feche o editor, rode a aplicação e veja as imagens sendo mostradas de acordo com o sexo do cliente (Fi-gura 1).

Figura 1. Mostrando imagens de acordo com o

valor do campo

Validações

Podemos usar os controles de validação normalmente na edição/inserção de valores no GridView. Novamente, faremos uso de Templates. Conecte a uma tabela do banco e escolha uma formatação para o GridView.

Nesse caso, para que as opções de inserção, atualização sejam adicionadas no Grid, devemos configurar o mesmo. No wizard, onde configuramos

Page 25: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009 25

os campos, clique no botão Advanced e será aberta uma janela (Figura 2).

Veja a Figura 2. Assim, o DataSource é o responsável pelos

comandos de atualização, exclusão e inserção no banco de dados, o programador não precisa fazer nada . Transforme os campos que deseja colocar as validações, como templates. Acesse o editor de templates (TempletField) e escolha o item Edi-tItemTemplate na opção Display. Será mostrado o TextBox quando o usuário escolher a opção de inserção ou edição da linha.

Adicione um RequiredFieldValidator e aponte o ControlToValidate para o TextBox, e digite a mensa-gem de erro em ErrorMessage. Feche o editor, rode a aplicação e tente atualizar um registro deixando o campo em branco (Figura 3).

Veja a Figura 3.

Somatório no rodapé

Se o GridView possui um campo com valores numéricos ou monetários, certamente você gos-taria de mostrar um total no rodapé da página. Primeiramente, altere para True a propriedade ShowFooter do GridView.

Neste exemplo, simplesmente vamos mostrar a quantidade de registros do GridView, mas facil-mente, poderíamos adicionar o somatório de um campo do Grid, usando um DataSet por exemplo, ou usando variáveis no evento RowDataBound.

Após, acesse o evento e adicione o seguinte código:

if (e.Row.RowType == DataControlRowType.Footer){ e.Row.Cells[0].Text = “Quant: “ + GridView1.Rows.Count;}

Primeiramente, verificamos se estamos no rodapé do GridView através da propriedade Ro-wType. Assim, colocamos na segunda coluna (inicia pelo valor “0”), um texto e a quantidade (Figura 4). Essa dica é ótima para colocarmos em carrinhos de compras para indicar a quantidade e valor total.

Figura 2. Opções de manipulação de dados no GridView

Figura 3. Validando os campos no GridView

Agrupamento

Para fazer um agrupamento, usaremos a mesma técnica já bastante mostrada, templates. Será muito semelhante ao exemplo de master/detail usando templates. Para este exemplo, conectaremos o GridView à tabela Categories do Northwind.

Deixe apenas um campo e transforme-o em TemplateField no editor de colunas. Adicione outro GridView no editor de templates e configure para a tabela Products, mas que mostre apenas os produtos de uma categoria específica. Nesse caso será um Label que você pode adicionar no editor de templates.

Na consulta, utilize a mesma técnica já apre-sentada, a seleção dos dados da tabela, devem ser filtradas pelo código da categoria que estará em um controle no primeiro GriView.

Depois basta rodar a aplicação e visualizar o Figura 4. Mostrando o somatório no GridView

Page 26: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 200926

agrupamento (Figura 5). Qualquer dúvida consulte o projeto que está para download (neste exemplo, removi o cabeçalho das colunas do GridView dos produtos).

Figura 5. Agrupamento com dois GridViews

Outra dica para agrupamento, sem usar duas consultas ao banco, seria o de remover os itens do agrupamento que se repetem. Para esse exemplo, crie um novo formulário e adicione um GridView. Use a consulta para esse GridView:

select P.ProductID, P.ProductName, P.UnitPrice, C.CategoryNamefrom PRODUCTS PINNER JOIN CATEGORIES C on C.CategoryID = P.CategoryIDorder by C.CategoryName

Faça a conexão normal do grid. Reorganize os campos para que fique primeiramente, o nome da categoria, após o código do produto, nome do produto e preço. Transforme o campo da categoria como um templatefield.

Acesso o evento RowDataBound e use o código da Listagem 2. O código esta comentado, para um melhor entendimento. A idéia é pegar o valor do templatefield e comparar com o ViewState do cam-

//verifica se é a “linha” do Gridif (e.Row.RowType == DataControlRowType.DataRow){ //procura pelo controle que mostra a categoria Label lbl = (Label)e.Row.FindControl(“Label1”); string sValor = lbl.Text; //pega o valor do campo string sViewState = (string)ViewState[“CategoryName”];

//compara valores if (sValor == sViewState) { //se iguais, esconde o valor e limpa controle lbl.Visible = false; lbl.Text = “”; } else { //mostra o valor e configure o ViewState sViewState = sValor; ViewState[“CategoryName”] = sViewState; lbl.Text = sViewState; lbl.Visible = true; }}

Figura 6. Agrupamento com um GridView

Listagem 2. Código para agrupamento do GridView

Page 27: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009 27

Confira o video deste artigo no site do The Club na edição online da revista.

po, tudo isso dentro do evento que é “executado” para cada linha do GridView.

Veja a Listagem 2

Assim, removemos os campos duplicados e simulamos o agrupamento. Veja o resultado na Figura 6.

Veja a Figura 6.

É 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

Conclusão

Vimos neste artigo algumas dicas para a utilização do GridView, um dos controles mais utilizados em aplicações ASP.NET no Visual Studio 2008. Temos muitas customizações que podem ser feitas no controle, mas deixo a critério da necessidade do leitor.

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

Page 28: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 200928

Dicas DELPHIMudar a cor do Edit ao receber foco

Na seção private do form declare o procedimento abaixo:

private procedure MudancaDeFoco(Sender: TObject); public end;

Na seção implementation, escreva o código do procedimento:

procedure TForm1.MudancaDeFoco(Sender: TObject);var I: integer; Ed: TEdit;begin { Percorre a matriz de componentes do form } for I := 0 to ComponentCount - 1 do { Se o componente é do tipo TEdit... } if Components[I] is TEdit then begin { Faz um type-casting pata o tipo TEdit } Ed := Components[I] as TEdit;

{ Se o Edit está com o foco... } if Ed.Focused then Ed.Color := clYellow { Amarelo } else Ed.Color := clWhite; { Branco } end;end;

No evento OnCreate do Form, coloque o código abaixo:

procedure TForm1.FormCreate(Sender: TObject);var

I: integer;begin for I := 0 to ComponentCount - 1 do if Components[I] is TEdit then (Components[I] as TEdit).OnExit := MudancaDeFoco;end;

No evento OnActivate coloque:

procedure TForm1.FormActivate(Sender: TObject);begin MudancaDeFoco(nil);end;

Verifica se uma variável é número ou não

function IsNumeric(S : String) : Boolean;beginResult := True;Try StrToInt(S);ExceptResult := False;end;end;

Valida UF

function ValidarEstado(Dado : string) : boolean;constEstados = ‘SPMGRJRSSCPRESDFMTMSGOTOBA SEALPBPEMARNCEPIPAAMAPFNACRRRO’;varPosicao : integer;

Page 29: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009 29

beginResult := true;if Dado ‘ thenbeginPosicao := Pos(UpperCase(Dado), Estados);if (Posicao = 0) or ((Posicao mod 2) = 0) then beginResult := false;end; end; end;

Imprimir ou visualizar a impressão e exportar para pdf usando rave

procedure TfrmRavePDF.Button1Click(Sender: TObject);begin //EXPORTANDO PRA PDF//

RvSystem1.DefaultDest:= rdFile; RvSystem1.DoNativeOutput := false; RvSystem1.RenderObject :=rvRenderPDF1; RvSystem1.OutputFileName:= ‘C:Exemplo.pdf’; //caminho onde vai gerar o arquivo pdf RvSystem1.SystemSetups:= RvSystem1.SystemSetups -[ssAllowSetup]; RvProject1.ProjectFile := ‘C:TesteRelatorioQuickProjetoRelatorioPDF.rav’;//Local que coloquei o rav como exemplo

RvProject1.Engine:= RvSystem1; RvProject1.SelectReport(‘Teste1’, True); // nome do page no rav criado RvProject1.ExecuteReport(‘RelatorioPDF’); // nome do *.rav RVProject1.Execute;

//COLOCANDO EM PREVIEW OU SE QUISER IMPRIMIR DIRETO MUDAR DE RDPREVIEW PARA RDPRINT//

RvSystem1.DefaultDest:= rdPreview; RvProject1.ProjectFile := ‘C:TesteRelatorioQuickProjetoRelatorioPDF.rav’; RvProject1.Engine:= RvSystem1; RvProject1.SelectReport(‘Teste1’,

True); RvProject1.ExecuteReport(‘RelatorioPDF’); RVProject1.Execute;

Remove os espaços em branco de ambos os lados da string

Function Alltrim(const Search: string): string;{Remove os espaços em branco de ambos os lados da string}constBlackSpace = [#33..#126];varIndex: byte;beginIndex:=1;while (Index <= Length(Search)) and not (Search[Index] in BlackSpace) do begin Index:=Index + 1; end;Result:=Copy(Search, Index, 255);Index := Length(Result);while (Index > 0) and not (Result[Index] in BlackSpace) do begin Index:=Index - 1; end;Result := Copy(Result, 1, Index);end;

Criar forms com cantos arredondados

Procedure TForm1.FormCreate(Sender: TObject);var region : hrgn;begin region:= CreateRoundRectRgn(0, 0, width, height, 20, 20); setwindowrgn(handle, region, true);end;

Page 30: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 200930

Jogodos 7erros

Page 31: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009

Page 32: The Club - megazine · Delphi é marca registrada da Borland International, ... São Paulo o mini curso de Delphi 2010 a ... Windows 7, Windows 2000, XP e

Setembro 2009