32
setembro 2010

The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

Embed Size (px)

Citation preview

Page 1: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010

Page 2: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010

Page 3: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010 03

Delphi

Usando Crystal Reports

16Autor: Luciano Pimenta

Desafio The Club

.NET

- Dicas Delphi

29Dicas

- Cruzada

30

Delphi Delphi

.NET

índiceUtilizando o Ribbon Controls

Editorial

08Agosto é o mês em que temos de

redobrar nossa aten-ção com escadas e gatos pretos, afinal ninguém quer que o azar bata a porta... 04

Novo Delphi XE

05Tlist e Event Handlers em Delphi

13Criar consumir e debugar WCF services com Silverlight 26

LegendaInicianteIntermediárioAvançado

Autor:Bruno Alcarás

Autor: Leonora GolinAutor: Djonatas Tenfen

Autor: Antonio Spitaleri

Page 4: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 201004

Bem-vindo

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

pelos seus respectivos proprietários.

Antonio Spitaleri Neto - Editor [email protected]

Este mês completamos mais um ano de existência do The Club. Já são 16 anos auxiliando programadores de todo o Brasil no desenvolvimento de softwares em Delphi e Visual Studio.

Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas novidades. Em meu artigo “Novo Delphi XE”, mostro de forma geral as novidades da ferramenta. Nas edições seguintes iremos conhecer em maiores detalhes a nova versão do Delphi.

Nosso consultor Bruno Alcaras traz, em seu artigo: “Utilizando o Ribbon Controls” a utilização de Ribbon Controls em Delphi. Ribbon Controls são componentes que permitem melhorar bastante o visual de aplicações Delphi.

Leonora Golin aborda nesse mês a classe TList em conjunto com Event Handlers em seu artigo “TList e EventHandlers em Delphi”. Um assunto mais técnico porém de grande valor para agregar potenciali-dade as aplicações Delphi.

Em nossa seção .NET temos dois artigos: No primeiro, Luciano Pi-menta aborda o uso do gerador de relatórios Crystal Report no artigo “Usando Crystal Report”.

Na sequência Djonatas Tenfen mostra “Como consumir e debugar WCF services” em Silverlight., mostrando mais um recurso dessa fan-tástica ferramenta que é o Silverlight.

É isso. Boa leitura a todos e que venham os próximos 16 anos!

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

ColunistasAntonio Spitaleri Neto

Bruno AlcarásLeonora Golin

Luciano Pimenta

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 · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010 05

Delphi

No início do mês de setembro, a comuni-dade Delphi recebeu a notícia do lançamento do Delphi XE, que faz parte da suíte RAD Studio XE, que além do Delphi XE inclui C++ Builder XE, Delphi Prism XE e RADPHP XE.

Ao contrário das últimas versões, onde o ano de lançamento constituía o nome da versão, dessa vez a Embarcadero optou pelo XE, que realça o suporte heterogêneo a vários bancos de dados, uma das grandes caracte-rísticas dessa versão.

O grande foco do Delphi XE é o desen-volvimento ágil de aplicações e integração fácil com as demais ferramentas da suíte RAD Studio.

Nesse artigo estarei falando sobre as principais características da nova versão do Delphi em uma visão mais geral. Em artigos posteriores estaremos abordando com maiores detalhes as funcionalidades do Delphi XE.

Novo Delphi XE

Instalação do Delphi XE

Como já é tradição, a Embarcadero disponibili-za a versão trial do Delphi e demais ferramentas da suíte XE. A versão trial pode ser obtida em:

http://www.embarcadero.com/downloads

O instalador guarda muitas semelhanças com a versão 2010 do Delphi, como poderá ser visto nas figuras a seguir.

Esse instalador é online, ou seja, a maior parte dos arquivos será baixada no momento da instalação, isso torna o instalador mais leve, porém aumenta o tempo de instalação.

Em relação à instalação do Delphi 2010, houve um aumento no tempo de instalação. Outra dife-rença é que nesta instalação temos além do Delphi XE a instalação conjunta de algumas ferramentas de terceiros. São elas:

- AQ Time;- Final Builder;- CodeSite;- Rave Reports;- CollabNet client subversion;

Essas ferramentas oferecem recursos bastante interessantes para o desenvolvimento de aplicações com o novo Delphi XE. Com isso o desenvolvimento sobre a plataforma Delphi ganha em recursos. Mais adiante darei detalhes sobre ferramentas extras do novo Delphi XE.

Veja alguns screenshots da instalação:

Layout

Após a instalação, será apresentada uma tela de registro e depois o Delphi XE estará pronto para uso. A primeira funcionalidade a ser destacada são os layouts para as janelas.

No Delphi XE temos três opções padrão de

Page 6: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 201006

utilizar o Layout:

Default, com janelas fixas semelhantes a versões como o Delphi 2007.

Ou então o layout Classic Undocked, que torna a disposição das janelas igual ao Delphi 7. Para os desenvolvedores mais acostumados as versões antigas do Delphi essa opção é uma boa saída.

Temos ainda a opção de Debug Layout, que dá destaque para o código.

A paleta de componentes também pode ser colocada na parte superior da tela, ao estilo Delphi 7 ou então ser mantida na lateral.

Veja as opções Classic e Default de Layout:

Ve a imagem Default: Veja a imagem Classic:

Integração com Subversion

Subversion é uma tecnologia para controle de versões alternativo ao conhecido CVS. Nos últimos anos a utilização do SubVersion tem crescido bas-tante entre os profissionais que trabalham com desenvolvimento em equipe.

Para o pessoal que utiliza SubVersion, a boa notícia é que o Delphi XE oferece integração dos projetos com essa tecnologia. Através da IDE Delphi é possível fazer todas as operações no repositório SubVersion, como Commit, Merge, etc...

DataSnap XE

Uma das maiores e melhores novidades na versão 2010 do Delphi foi o novo DataSnap e seus recursos poderosos para multi camadas.

No Delphi XE, além de todos os recursos já existentes foram adicionadas facilidades e um novo Wizard para a criação do Server Module, o que agrega produtividade ao desenvolvimento DataSnap.

Além disso, o DataSnap XE agora possui inte-gração com Cloud Computing, permitindo o acesso a servidores em plataformas como o Windows

Page 7: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010 07

Default

Classic

Azure. Essa novidade, aliada a integração com Delphi Prism para desenvolvimento Web, torna o Delphi uma boa opção para o desenvolvimento para internet.

Ferramentas para agilizar o desen-volvimento

O Delphi XE traz integrada a sua IDE as fer-ramentas FinalBuilder, CodeSite e AQTime. Essas ferramentas permitem ao desenvolvedor um con-trole altamente profissional e gerenciamento mais profissional das aplicações na plataforma Delphi.

A melhoria no gerenciamento permite um me-nor gasto de tempo com planejamento e controle e um maior investimento em desenvolvimento. Isso gera grandes ganhos de produtividade.

Conclusão

Nesse artigo procurei apenas fazer um rápido “preview” das novidades do Delphi XE. Como foi possível perceber o foco dessa nova versão é a produtividade.

Nos artigos seguintes estaremos vendo com maiores detalhes todas as principais funcionalida-des dessa nova versão do Delphi.

Referência: Blog Andreano Lanusse:http://www.andreanolanusse.com/blogpt/

Consultor Técnico The Club.

Sobre o autor

Antonio Spitaleri Neto

[email protected]

Page 8: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 201008

Criado pela Microsoft visando facilitar o acesso aos itens de seus menus através de poucos cliques e dar um visual mais sofisti-cado as suas aplicações, os Ribbon Controls estão presentes no Delphi desde sua versão 2009, e são uma ótima maneira de darmos um algo a mais para nossas aplicações. Esse com-ponente com certeza se bem usado pode ser um diferencial na sua aplicação, já que muitas vezes o mais importante para os usuários de nossos sistemas é a beleza do mesmo, em de-trimento das muitas facilidades e benefícios que ele terá adotando o nosso sistema.

Uma coisa importante a se atentar an-tes de dar início ao seu projeto utilizando o RibbonControls é que para isso, é necessária uma autorização especial da Microsoft, essa licença é gratuita mas impõe algumas limitações quanto a forma com que esses componentes devem ser utilizados. Para obter essa licença acesse http://msdn.microsoft.com/pt-br/office/aa973809(en-us).aspx leia atentamente a licença de uso e o guia de Design do RibbonControls e se cadastre. Algumas partes importantes dessa licença dizem que o usuário não pode modificar essa

Utilizando o Ribbon Controls

tecnologia a torto e a direito, as possíveis modificações devem seguir as regras impostas no Guia de Design, e o mais importante, essa tecnologia não deve ser usada em programas concorrentes aos programas do pacote Office (Word, Excel, PowerPoint, Outlook, Access ou qualquer outro presente nesse pacote), o que faz todo sentido, afinal de contas a Microsoft gastou muito dinheiro para desenvolver essa inovação e quer proteger a todo custo seus direitos.

Estou utilizando, para esse artigo, a ver-são 2010 do Delphi, mas vale lembrar que esse exemplo também pode ser feito com o Delphi 2009 que também conta com os componentes Ribbon Controls.

Veja na imagem 1.

Paleta Ribbon Controls

Os componentes desse pacote são encontra-dos na paleta Ribbon Controls do Delphi:

Eles são os seguintes

• - TRibbon – é a base do Ribbon, nele serão inseridas todas as páginas, os grupos, os com-ponentes, e através dele será feita a ligação com o ActionManager que cuidará de todas as ações que serão executadas pelos componentes inseridos no Ribbon;

• - TRibbonComboBox – um Combo-Box que interage diretamente com o Ribbon;

Imagem 1

Page 9: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010 09

• - TRibbonSpinEdit – um SpinEdit criado especialmente para ser usado em conjunto com o Ribbon;

• - TScreenTipsManager – esse com-ponente é muito interessante e vai ser melhor explorado durante o desenvolvimento desse artigo, ele permite que sejam adicionados tips (dicas) a cada um dos itens do Ribbon. Essas dicas seguem o mesmo estilo do Office, como nesse exemplo:

• - TScreenTipsPopup – esse compo-

nente serve para dar aos componentes que não estão no Ribbon o mesmo estilo de dicas que são dados aos componentes do Ribbon.

Antes de dar início a uma demonstração de seu uso vamos conhecer o principal componente, o TRibbon, visualmente e dar uma olhada em algumas propriedades específicas dele:

TRibbon Veja a imagem 2.

O TRibbon é o início dos trabalhos para criar um Menu com Ribbon Controls, quando adicionado ao form ele se ajusta automaticamente a largura do form. Para prover a comunicação entre os componentes do Ribbon e as ações que cada um deles executará, devemos inserir o componente ActionManager da paleta Additional.O Tribbon conta com algumas propriedades interessantes e que são muito úteis durante o desenvolvimento do menu, são elas:

• ActionManager – por essa propriedade o Ribbon é ligado ao seu gerenciador de ações;

• ApplicationMenu – ao clicar no (+) para expandir as opções são apresentadas algumas opções para personalização desse item. O Appli-cationMenu é aquele “botão” localizado na parte superior esquerda do Menu (dê uma olhada no Office 2007) e que traz algumas das opções mais usadas e, no caso de Excel ou Word, os documentos recentemente abertos pelo usuário. O seu uso será explorado mais adiante nesse artigo;

Exemplo: Veja a imagem 3.

• DocumentName – nessa propriedade definimos o nome do documento ou tela que está aberto no momento, e que aparecerá ao lado do Caption que definirmos para o Ribbon, podemos por exemplo definir nessa propriedade, via código, o nome da janela que está aberta no momento;

• QuickAccessTollbar – por aqui defini-mos as como será exibido o QuickAccessTollbar. O QuickAccessToolbar é um local de acesso rápido e está localizado ao lado do ApplicationMenu;

• ScreenTips – é a ligação ao TScreenTips-Manager, que irá gerenciar as dicas que aparecerão quando o cursor estiver sobre um componente que tenha uma dica definida;

• ShowHelpButton – essa propriedade é definida como True ou False e indica se o botão de ajuda, que fica no canto superior direito da tela será exibido ou não;

• Style – aqui é definido como será o estilo de seu Menu, estão disponíveis três estilos (Luna(o estilo padrão), Obsidian e Silver), escolha o que você mais gostar:

Veja nas imagens 4, 5 e 6:

Imagem 2

Imagem 3

Imagem 4 Luna

Imagem 5 Obsidian

Imagem 6 Silver

Page 10: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 201010

• Tabs – podem ser adicionadas ou mu-dadas de ordem as abas que foram adicionadas ao Ribbon.

Para dar início aos trabalhos com o Ribbon, deve-se incluir no form o componente ActionMa-nager e ligá-lo a propriedade ActionManager do componente TRibbon. Somente após isso poderão ser incluídas abas no Ribbon.

Ribbon Page

Para incluir uma aba use a propriedade Tabs ou então clique com o botaão direito e escolha a opção “Add Tabs”, nesse momento será incluída uma aba no Ribbon, da seguinte forma:

Veja a imagem 7.

Esse componente tem uma propriedade interessante, essa propriedade é a Key Tip, essa propriedade designa um atalho a página quando estiver pressionada a tecla ALT.

Ribbon Group

Depois de incluída uma aba poderemos incluir um Grupo, que é o local onde ficarão o itens do menu, essa inserção segue o mesmo estilo da in-serção de uma aba, botão direito e “Add Groups”. As principais propriedades desse componente são as seguintes:

• DialogAction – chama uma ação através de um pequeno botão que é inserido na parte inferior direita do Group, dê uma olhada no Office ou então espere o desenvolvimento desse artigo para ver um exemplo;

• GroupAlign – define como serão orga-nizados os itens dentro do grupo, se na horizontal ou na vertical;

• GroupIndex – define, quando na ocor-rência de mais de um grupo dentro da aba, a ordem que esse grupo ocupará;

• KeyTip – funciona da mesma maneira que o KeyTip da aba.;

• Rows – o número de linhas que ocupa-rão os objetos dentro do grupo

ActionManager

O ActionManager é com certeza o mais im-portante componente usado durante o desenvolvi-mento do Menu, ele que executará todas as ações correspondentes aos itens do Ribbon, vale lembrar que sem esse item incluído e ligado ao Ribbon não é possível fazer nada relacionado ao menu, as prin-cipais propriedades desse componente são:

• DisableImages, Images ,LargeDisable-sImages e LargeImages – são definidas as imagens que aparecerão nos itens do Ribbon, quando desativados ou ativados;

Projeto Exemplo

Agora vamos dar início ao nosso exemplo, nes-se exemplo não será montado um menu completo com vários botões, páginas, etc., somente será dada uma base a tudo que o desenvolvedor precisa saber para criar seu próprio menu, vamos ao exem-plo. Inicie um novo projeto e adicione a ele:

• 1 TRibbon(da paleta RibbonControls);

• 1 ActionManager(da paleta Additional)

Imagem 7

e;

• 1 ImageList(da paleta Win32). Nomeie esse componente da seguinte forma: Images.

Ligue a propriedade ActionManager do Ribbon ao ActionManager adicionado e o ImageList a pro-priedade do ActionManager: Images.

Vamos programar algumas ações simples para entender a interação entre esses componentes. Primeiramente adicione uma aba ao Ribbon (botão direito/Add Tab) e a nomeie como desejar, dentro dessa aba adicione um grupo (botão direi-to/Add Group) e fique a vontade para nomeá-lo também.

Para criarmos a primeira ação dê um duplo clique no ActionManager, neste momento será aberta uma tela como a que se vê a seguir:

Veja a imagem 8.

Para criar uma ação clique com o botão direi-to em Actions e escolha a opção New Action, ou então clique no ícone . Veremos agora algumas propriedades de um TAction:

Imagem 8

Page 11: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010 11

• Category – indica a categoria de que aquela ação faz parte, para criar uma categoria escreva o nome da categoria nessa propriedade;

• Image Index – indica qual imagem do ImageList servirá como imagem da ação;

• ShortCut – entre as opções apresenta-das, define qual será o atalho para essa ação.

Vamos criar uma ação básica, que servirá só para ilustrar esse exemplo, dê um duplo clique em Action1 em Actions e escreva o seguinte código:

ShowMessage(‘Utilizando Ribbon Controls !!!!’);

Depois adicione uma imagem ao ImageList e a ligue a essa ação através de ImageIndex.

O próximo passo é clicar e arrastar a ação recém-criada no ActionManager e arrasta-lá até o RibbonGroup, nesse momento será criado um TActionClientItem, que também tem algumas propriedades que permitem sua personalização, são elas:

• CommandProperties/ButtonSize – de-fine o tamnho do botão no Ribbon, se grande ou pequeno;

• ButtonType – define o botão como simples ou como dropdown. Se definido como DropDown , podemos adicionar mais ações a ele, que serão encontradas quando clicarmos na seta;

• CommandStyle – podemos definir de que tipo é esse ¨TActionClientItem, se um Radio-Button, um CheckBox, um Button, etc;

• Items – aqui são adicionadas as ações que serão encontradas em um botão definido como DropDown. Para tanto basta clicar em Items, na tela que se abrirá clicar com o botão direito, add e ligar o TActionClientItem a ação desejada, anteriormente criada no ActionManager. Vale lembrar que essas opções estarão disponíveis apenas se o ButtonStyle estiver definido com DropDown.

Existem ainda ações pré-definidas, como ações de colar, recortar, copiar, entre outras que podem ser criadas escolhendo New Standard Action no ActionManager. Adicione mais algumas ações, as separando por categorias, isso será útil para de-monstração do uso do Application Menu.

ApplicationMenu

Vamos adicionar agora um ApplicationMenu, para tanto clique no Ribbon com o botão direito e escolha a opção Add Application Menu, nesse momento será adicionado ao Ribbon o seguinte item: . Para editar esse item vá até a propriedade ApplicationMenu do Ribbon, as principais proprie-dades encontradas são:

• Caption – o que será exibido no item, por padrão está definido Recent Documents;

• CommandType – define o que será exibido na parte à direita do AplicationMenu, se comandos ou itens recentes. Para um exemplo de itens recentes verifique o exemplo de Ribbon presente na pasta de exemplos do Delphi;

• Icon – pode ser definido um ícone para esse Application Menu;

• IconSize – o tamanho do ícone é defi-nido por essa propriedade;

• KeyTip – funciona da mesma forma do KeyTip das abas ou grupos.

Para adicionar as ações ao ApplicationMenu, proceda da mesma forma que o Ribbon, vá até o ActionManager e arraste as ações para dentro do componente. Arraste também uma categoria interira para dentro do componente, serão criados subitens dentro do Application, como no caso de “Arquivo” na imagem.

Veja a imagem 9.

Para adicionarmos botões ao Application-Menu, como o de Opções e o de sair do Office, acesse o RibbonApplicationMenuBar através do Object TreeView do Delphi e em sua propriedade Options insira um novo OptionItem e o ligue a ação desejada no ActionManager.

Veja a imagem 10.

Percebam que foi criado o botão Sair na parte inferior do componente.

QuickAccessToolbar

Para usar o Quick Access Toolbar não existema segredos. Para adiciona-lo clique com o botão direi-to no Ribbon e escolha Add Quick Access Tollbar, ao

Imagem 9

Imagem 10

Page 12: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 201012

lado do ApplicationMenu será criado um local para acesso rápido as funções do sistema. Para utiliza-lo é usado o mesmo procedimento de sempre: arraste a ação do ActionManager para o QuickAccess e pronto, essa opção já estará disponível.

ScreenTipsManager

Para deixar os hints de seu Ribbon com o estilo Office é necessária a inclusão do componente Scre-enTipsManager. Para utilizá-lo primeiramente de-vemos ligá-lo a propriedade ScreenTips do Ribbon, depois ligaremos a propriedade LinkedActionList desse componente ao ActionManager, para isso clique na propriedade, botão direito Add e ligue ao ActionManager. É possível editar a aparência do tip de forma padrão para todos através das proprie-dades do componente ou então individualmente usando o duplo clique no ScreenTipsManager. Após isso será visualizada a seguinte tela:

Veja a imagem 11.

Através dela será feita a edição das Tips, ela é dividida em algumas partes:

• TreeView – todas as ações que foram criadas no ActionManager estão nele, prontas para receber um Tip;

• Mode – se estará ativado ou não este tip;

• ShowImage, ShowFooter e Preview – define se nesse tip aparecerá uma imagem, se definida, se aparecerá o rodapé “Press F1 for more help”. O botão preview serve para uma pré-visualização do tip;

• - aqui definimos o texto do Tip e se queremos alguma imagem ao lado dele;

• BorderStyle – é definido o estilo da borda, se normal ou arredondado;

• Color - para formar um gradiente, de-vemos informar a cor de inicio e a cor final;

• Display – o posicionamento do tip em relação à tela;

• Option – se aparecerão o título e um possível atalho, se o mesmo estiver disponível para aquela ação;

• Footer – o que será exibido no rodapé do tip pode ser definida uma imagem.

Veja um exemplo de um tip editado pelas essas opções:

Imagem 11

Consultor Técnico The Club.

Sobre o autor

Bruno Alcarás

[email protected]

Conclusão

A beleza dos nossos aplicativos é um grande atrativo para os usuários e o RibbonControls pode valorizar muito nossos sistemas, com certeza vale passar algumas horas estudando-o e descobrindo os muitos recursos que o mesmo pode oferecer no intuito de facilitar e deixar os nossos sistemas mais bonitos. Para um completo exemplo do seu uso, estude os exemplos que ficam da pasta RibbonCon-trols no diretório de Demos do Delphi.

E isso é tudo pessoal, até outra hora.

Page 13: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010 13

O conceito de multidifusão ou multicas-ting foi introduzido pela tecnologia .Net que permite atribuir métodos distintos para o mesmo manipulador de eventos. O desenvol-vedor Delphi não possui essa funcionalidade, porém o MultiCast pode ser simulado através do uso conjunto de Tlist e Event Handlers.

Com essa simulação é possível especifi-car que dois ou mais métodos (procedures e funções) sejam chamados quando um evento for disparado.

Para facilitar, seguem algumas definições:

-Eventos Multicast: Eventos que disparam múltiplos métodos simultaneamente;

-Manipuladores de eventos (Event Handlers): São propriedades associadas aos objetos da VCL que são ativadas quando os objetos recebem uma determinada ação (como um clique, por exemplo). À ocorrência dessas ações ou eventos estarão

TList e Event Handlers em Delphi

associadas à execução de métodos (procedures ou funções);

-Tlist: É uma classe cuja função é armazenar uma lista de ponteiros. É usado para manter listas de objetos. Traz propriedades e métodos para:

Adicionar ou deletar objetos em uma lista.

Reorganizar os objetos em uma lista.

Localizar e acessar os objetos em uma lista.

Classificar os objetos em uma lista.

-Objeto TMethod: Uma estrutura que arma-zena código e campos de dados para representar um método.

Para que?

Os eventos multicast podem ser muito úteis na criação de aplicações com bancos de dados, quando houver a necessidade de que mais de uma procedure entre em execução quando o evento OnAfterScroll for disparado, por exemplo.

Como?

Para conseguir esse recurso no Delphi Win32 é preciso simular a criação de eventos multicast através da criação de uma classe.

Segue o exemplo simples, lembrando que vamos simular a manipulação de eventos multicast através da construção de um objeto Delphi Win32 que mantenha uma lista dos métodos que um evento disparará.

Criar uma classe simples, TmultiEventClass, com apenas um evento de tipo TmultiEvent.

Criar um objeto Tlist cuja característica é ser um MultiEventHandler, ou Manipulador de Eventos para armazenar uma lista de métodos que serão chamados quando o evento for disparado (o FireMultiEvent).

Utilizar um tipo Tmethod para representar cada método (função ou procedure). Um tipo Tmethod pode ser usado para executar um método pelo seu nome.

Page 14: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 201014

Segue código da interface da classe Tmul-tiEvent.

typePMethod = ^TMethod;TMultiEvent = procedure(const Value : string) of object;TMultiEventClass = classPrivate fMultiEventHandlers : TList; // fMultiEventHandlers é a Tlist que será usada para armazenar ponteiros para métodos que serão disparados por um evento de tipo TEvent.Public constructor Create; destructor Destroy; override; procedure AddMultiEvent(const Value: TMultiEvent);//adicionar um manipulador de eventos; procedure RemoveMultiEvent(const Value: TMultiEvent);//remover um manipulador de eventos; procedure FireMultiEvent;end;Segue a implementação:{ TMultiEventClass }

//cria o armazém dos manipuladores de eventoconstructor TMultiEventClass.Create;begin inherited Create; fMultiEventHandlers := TList.Create;end;//limpadestructor TMultiEventClass.Destroy;

var cnt: Integer;begin for cnt := 0 to -1 + fMultiEventHandlers.Count do Dispose (fMultiEventHandlers[cnt]);

fMultiEventHandlers.Free; inherited;end;//adicionar um manipulador de eventos à lista}procedure TMultiEventClass.AddMultiEvent(const Value: TMultiEvent);var h: PMethod;begin h := New(PMethod); h^.Code := TMethod(Value).Code; h^.Data := TMethod(Value).Data; fMultiEventHandlers.Add(h);end;//remover um manipulador de eventos da listaprocedure TMultiEventClass.RemoveMultiEvent(const Value: TMultiEvent);var cnt: Integer;begin for cnt := 0 to -1 + fMultiEventHandlers.Count do begin if (TMethod(Value).Code = TMethod(fMultiEventHandlers[cnt]^).Code) and (TMethod(Value).Data =

TMethod(fMultiEventHandlers[cnt]^).Data) then begins Dispose(fMultiEventHandlers[cnt]); fMultiEventHandlers.Delete(cnt); Break;

end; end;end;//dispara evento (chama todos os manipuladores). A procedure//FireMultiEvent simula um evento com mais de um manipulador//de evento.procedure TMultiEventClass.FireMultiEvent;

var cnt: Integer; msg : string;begin for cnt := 0 to -1 + fMultiEventHandlers.Count do begin msg := Format(‘%d/%d %s’, [1 + cnt, fMultiEventHandlers.Count, ‘fired!’]); TmultiEvent(fMultiEventHandlers[cnt]^)(msg); end;end;Agora, um exemplo simples.1) Arraste um TButton em um formulário e especifique o seguinte código para o evento OnClick.{ TForm1 }procedure TForm1.Button1Click(Sender: TObject);var test : TMultiEventClass;begin test := TMultiEventClass.Create; //criado objeto test que irá armazenar referência para dois //métodos try test.AddMultiEvent(Handler1); test.AddMultiEvent(Handler2);

test.RemoveMultiEvent(Handler1); //handler1 é removido test.AddMultiEvent(Handler3); //outro método é adicionado test.FireMultiEvent; //dispara os manipuladores de eventos finally test.Free; end;end;Os três métodos Handler 1, Handler2 e Handler3 são definidos como:

Page 15: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010 15

procedure TForm1.Handler1(const value: string);begin ShowMessage(‘h1: ‘ + value);end;procedure TForm1.Handler2(const value: string);begin ShowMessage(‘h2: ‘ + value);end;procedure TForm1.Handler3(const value: string);begin ShowMessage(‘h3: ‘ + value);

O layout da aplicação exemplo deverá ficar como na figura que segue:

Na execução, as procedures de exibição de ShowMessages serão disparadas:

Consultora Técnica The Club.

Sobre o autor

Leonora Golin

[email protected]

Conclusão

Espero ter conseguido o objetivo de esclarecer o funcionamento e a funcionalidade dos manipula-dores de eventos que são propriedades de alguns objetos que, ao receber uma ação (evento), ativam essa propriedade e disparam vários métodos simul-tâneos e não apenas um. Esta é uma desvantagem do DelphiWin32 com relação ao .Net que pode ser facilmente sanada com algumas linhas de código.

Então... Mãos à obra... E fire, fire, fire!!

Page 16: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 201016

Relatórios são uma característica do sistema que poucos desenvolvedores gostam, pelo menos, conheço alguns que preferem criar sistemas complexos, a fazer um relató-rio. Quando falamos em relatórios na Web então, parece o caos, pois teremos de usar HTML, CSS etc.

Com o Crystal Reports, podemos criar relatórios robustos e poderosos em aplicações ASP.NET, como várias funcionalidades, como: parâmetros, fórmulas, grupos, subrelatórios, gráficos etc. Essas funcionalidades veremos como criar, usando apenas alguns cliques neste artigo.

Nota: Usaremos nesse artigo, o Visual Studio 2008. Você pode estar perguntando, por que não usar a nova versão, Visual Stu-dio 2010? No Visual Studio 2010, o Crystal Reports deixou de fazer parte da ferramenta, ele terá de ser instalado em separado.

A versão que suporta o Visual Studio 2010, ainda esta em fase beta, então, achei melhor, mostrar os exemplos no Visual Studio 2008. Vale lembrar que os exemplos têm 100% de chance de serem compatíveis com a versão do Crystal Reports para Visual Studio 2010.

Usando Crystal Reports

Para mais informações da versão beta, você pode acessar: www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/20322.

Criando a aplicação ASP.NET

Abra o Visual Studio 2008 e crie uma nova aplicação ASP.NET (File>New>Web Site). Usaremos a linguagem C# e digite a pasta virtual para salvar

o projeto (Figura 1). Veja a Figura 1.

Existe um template chamado ASP.NET Crystal Reports Web Site que cria uma aplicação ASP.NET, onde é adicionado um controle CrystalRepor-tViewer (para exibir o relatório) e um CrystalRe-portSource (objeto que disponibiliza o relatório para o CrystalReportViewer).

Figura 1. Criando o projeto ASP.NET

Page 17: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010 17

Não existem muitas diferenças em relação ao projeto que criamos, mas fique a vontade de usar essa opção.

Criando o primeiro relatório

Com a aplicação ASP.NET criada, clique com o botão direito no nome do projeto e escolha a opção Add New Item. Na janela, escolha o item Crystal Report e dê um nome ao relatório (Figura 2).

Veja a Figura 2..

Clique em Add para finalizar. Será criado um arquivo CrystalReport.rpt no Solution Explorer e para configurar o relatório será mostrado um wizard (Figura 3).

Figura 3. Wizard para criação do banco de dados

Clique em OK e no próximo passo, vamos escolher a tecnologia para acesso ao banco de dados. Escolha Create New Conecction>OLE DB. Será aberto um editor, selecione Microsoft OLE DB Provider for SQL Server e clique em Next.

A seguir, adicione as configurações do banco de dados SQL Server (usarei nos exemplos, o banco de dados Northwind do SQL Server 2008 Express). Clique em Next e em Finish para terminar a confi-guração do banco.

Voltamos agora para a tela que mostra a conexão com o banco criada, onde podemos es-colher a(s) tabela(s) que trabalharemos (escolha Customers), bastando arrastar a(s) mesma(s) para a seção Selected Tables (Figura 4).

Figura 2. Criando o primeiro relatório

Veja a Figura 4. C

Clique em Next. Agora podemos escolher os campos (Fields) que serão mostrados no relatório. Escolha os campos necessários e clique em Next. A próxima etapa indica se vamos criar um grupo para o relatório, clique em Next.

Nota: Podemos adicionar um grupo após a criação do relatório.

Clique em Next novamente e escolha um estilo para o relatório na última tela do wizard. Clique em Finish para finalizar a criação do relatório (Figura 5).

Figura 4. Conexão com o banco criada e escolhendo as tabelas

Page 18: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 201018

Veja a Figura 5.

Temos um treeview com várias opções, entre elas: acesso aos campos da consulta, fórmulas, grupos, parâmetros, campos especiais (que mostra data de criação do relatório, total de registros, número da página etc), entre outros.

No relatório temos cinco seções: Report Header (cabeçalho do relatório), Page Header (cabeçalho da página), Details (seção onde serão mostrados os dados), Report Footer (rodapé do relatório) e Page Footer (rodapé da página).

Para visualizar o relatório, crie um novo Web Form (menu Website>Add New Item), dando o nome de “preview.aspx” e adicionando um Crys-talReportViewer. Na Smart Tag do controle, escolha New report source no item Choose Report Source. Será aberto um editor para escolher o relatório que desejamos exibir.

Escolha CrystalReport.rpt na opção Specify a Crystal Report for the CrystalReportSource control e clique em OK (Figura 6).

Veja a Figura 6.

Note que o relatório é mostrado em tempo de execução (sem os valores reais). Também podemos visualizar o relatório através da opção Main Report Preview na tela das seções do relatório. No formu-lário Default.aspx, adicione um botão e adicione o seguinte código:

Response.Redirect(“preview.aspx”);

Execute a aplicação e veja o relatório em execução (Figura 7).

Veja a Figura 7.

A barra de ferramentas do relatório tem as opções para: exportação, impressão, navegação entre as páginas do relatório, busca de textos e zoom etc. Na exportação, temos a opção de exportar para os formatos: Crystal Report (RPT), Acrobat (PDF), Word (DOC), Excel (XLS) e Rich Text Format (RTF).

Podemos configurar (remover/adicionar opções, inclusive a própria barra de ferramentas como um todo), através das propriedades do CrystalReportViewer.

Figura 5. Relatório fica “dockado” no IDE do Visual Studio

Figura 6. Escolhendo o relatório para ser exibido

Figura 7. Executando o relatório na aplicação ASP.NET

Page 19: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010 19

Agrupamento

Para criar um relatório agrupado, é bastante simples. Poderíamos ter configurado essa funcio-nalidade no próprio wizard de criação do relatório. Mas com o relatório pronto, basta clicar com o botão direito e escolher a opção Insert>Group.

Será aberta uma janela, onde devemos infor-mar o campo que vamos agrupar. Escolha City e clique em OK. Rode a aplicação novamente e veja como o relatório ficou agrupado pelo campo City. Será mostrada uma lista dos grupos ao lado do relatório, onde ao escolher um item, o mesmo será marcado e seus dados mostrados em destaque.

Para os próximos relatórios criados no artigo, para visualizá-los em tela, basta alterar o relatório no CrystalReportSource adicionado na tela de preeview.

Veja a Figura 8.

Agrupamento por período ou valo-res

O cliente solicitou um relatório sobre a venda dos funcionários para serem agrupadas por um período de valores, por exemplo. Um grupo com os funcionários que venderam até R$ 100.000,00, outro com os funcionários entre R$ 100.000,00 e R$ 200.000,00 e outro com os funcionários que tiveram vendas acima de R$ 200.000,00.

Com o Crystal esse tipo de relatório é fácil de ser desenvolvido. Crie um novo relatório e vamos customizar a consulta, usando um comando SQL ao invés de uma tabela do banco. Na tela de escolha das tabelas do banco, de um duplo clique no item Add Command. No editor que será mostrado, adicione a consulta SQL da Listagem 1.

Listagem 1. Customizando a consulta que retornará os dados

select Employees.EmployeeID, Employees.FirstName, Employees.LastName, SUM([Order Details].UnitPrice * [Order Details].Quantity) as TotalVendafrom Employeesinner join Orders on Employees.EmployeeID =

Figura 8. Relatório agrupado e um treeview para navegação dos grupos

Orders.EmployeeIDinner join [Order Details] on [Order Details].OrderID = Orders.OrderIDgroup by Employees.EmployeeID, Employees.FirstName, Employees.LastName

Essa consulta retorna o total de vendas de cada funcionário. Crie o relatório normalmente, com todos os campos da consulta. Após criar o relatório, vamos inserir um grupo para o campo TotalVenda, semelhante ao exemplo anterior, com a única diferença que no editor de grupos, vamos

escolher a opção in specified order (Figura 9). Veja a Figura 9.

Será mostrada a aba Specified order onde vamos adicionar os períodos que queremos. Clique em New e vamos criar os critérios para os grupos. Digite “Até 100.000,00”, escolha is less than e es-creva “100.000,00”. Clique em OK. Crie mais dois critérios, com as opções is between (valores entre “100.000,01” e “200.000,00”) e is greater than para o valor “200.000,01”.

O responsável pela correta criação dos grupos é a opção do tipo do critério: is less then (menos que), is between (entre dois valores) e is greater

Figura 9. Criando grupos personalizados

Page 20: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 201020

than (maior que).

Clique em Finish. Salve o relatório, altere a propriedade ReportSource do CrystalReportViewer para o relatório recém criado. Rode a aplicação e veja o relatório com agrupamento por valores, semelhante ao mostrado na Figura 10.

Veja a Figura 10.

Fórmulas

Em algumas situações, ao construir um re-latório, torna-se necessário inserir informações (cálculos etc) que não constam na tabela ou co-mando SQL que preenche o relatório. Nesses casos, podemos usar fórmulas com vários recursos, como a possibilidade de ser usado em agrupamentos do relatório.

Crie um novo relatório, acessando os dados da tabela Products. No relatório, clique com o botão direito em Formula Fields e escolha New. Dê o nome de “Soma” e clique em Use Editor. Veja na Figura 11 o editor de fórmulas do Crystal Report.

Veja a Figura 11.

Veja que temos acesso aos campos da con-sulta, várias funções e operadores prontos para serem usados. Podemos trabalhar com a linguagem Basic Syntax (semelhante ao Visual Basic) e Crystal Syntax (semelhante ao Pascal), onde podemos em um relatório ter fórmulas de diferentes linguagens (mas não na mesma fórmula).

Digite o seguinte código, que fará a soma do preço do produto com a quantidade em estoque:

{Products.UnitPrice}*{Products.UnitsInStock}

Você pode verificar a sintaxe da fórmula, atra-vés do botão Check . Clique em Save and close para salvar as alterações da fórmula e fechar o editor. Arraste a fórmula para a seção Details do relatório, pois usaremos a fórmula como um campo qualquer no relatório. Rode a aplicação e veja o resultado na Figura 12.

Veja a Figura 12.

Figura 10. Relatório com agrupamento por valores

Figura 11. Editor de fórmulas do Crystal Report

Figura 12. Relatório com fórmulas, sendo executado

Page 21: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010 21

Relatório em ordem alfabética

Talvez o título não indique claramente o que faremos, pois um relatório em ordem alfabética é simples, basta indicar a ordem na própria instrução SQL (order by). Mas, se precisássemos criar um relatório agrupado, de uma listagem de clientes em ordem alfabética, ou seja, mostrar em um grupo todos os clientes que comecem pela letra “A”, pela letra “B” e assim sucessivamente.

Para esse exemplo vamos criar uma fórmula, onde vamos extrair a primeira letra do nome para satisfazer a condição do grupo. Crie um novo re-latório, acessando novamente a tabela Customers e não utilize nenhum grupo, o relatório será uma listagem simples.

Crie uma fórmula (siga os passos do primeiro exemplo) com o nome de “OrdemAlfabetica”. No editor de fórmulas do Crystal digite o seguinte código:

{Customers.ContactName}[1]

Estamos “extraindo” do campo ContactName a primeira letra, que será usada para satisfazer o agrupamento do relatório. Clique com o botão direito no relatório e escolha a opção Insert>Group, na nova janela escolha o nome da fórmula criada anteriormente.

Clique em OK e veja que foi criado um grupo no relatório baseado na fórmula. Salve o relatório, rode a aplicação e veja a lista de clientes agrupada em ordem alfabética (Figura 13).

Figura 13.

Condições de campos

Podemos facilmente alterar a cor de um campo, para um tipo de condição, por exemplo, poderíamos trocar a cor do campo UnitsInStock da tabela Products, que possuírem o valor menor que 5. Crie uma listagem simples de produtos. Clique com o botão direito no campo UnitsInStock, escolha a opção Highlighting Expert.

Clique em New, em Value of escolha o campo ou fórmula que deseja realizar a condição e utilize praticamente o mesmo critério no exemplo do agrupamento por valores (is less then, is betwe-en, is greater than etc). A diferença é que você vai formatar o campo, escolhendo a fonte, cor de

Figura 13. Listagem com agrupamento em ordem alfabética

fundo, borda etc.

Escolha is less than or equal to e digite “5”. Escolha as configurações de fonte para negrito e cor vermelha. Veja na Figura 14 o editor do campo.

Veja a Figura 14.

Rode a aplicação e veja que o campo será mostrado na configuração realizada no editor, se atender os requisitos do mesmo.

Relatórios zebrados

Esse tipo de relatório é “clássico” em qualquer sistema, pois da um visual mais atrativo em uma listagem de dados. Você pode utilizar o relatório do

exemplo anterior (que seja de listagem), clicando com o botão direito na seção Details no relatório e escolhendo a opção Section Expert.

Na nova janela marque a seção Details, clique na aba Color e no botão para abrir o editor de fórmulas (veja que não precisamos criar fórmulas somente para serem visualizadas no relatório, podemos utilizá-las para outros fins). Digite o seguinte código:

if remainder(recordnumber, 2) = 0 then silver //cor cinzaelse white //cor branca

Figura 14. Editor para configuração do campo

Page 22: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 201022

Feche o editor e rode novamente o relatório, agora “zebrado”. Caso deseje criar a sua própria cor, use o código: color (red, green, blue) ou utilize as cores constantes no painel Functions, item Color Constants. Utilize o botão Main Report Preview para visualizar o relatório, sem a necessidade de rodar a aplicação.

Subrelatórios

O Crystal chama de subrelatórios, os relatórios onde precisamos vincular mais de uma tabela, como um master/detail. Crie um novo relatório, usando os dados da tabela Categories do banco de dados, semelhante ao que fizemos anterior-mente.

Depois de criado o relatório, aumente o tamanho da área de seção Details. Clique com o botão direito no relatório e escolha a opção Insert>Subreport. Note que será mostrado um retângulo, onde devemos colocá-lo na seção Details.

No editor, devemos escolher a opção Create a subreport with the Report Wizard e dê o nome ao relatório (“details”). Clique em Report Wizard para abrir o wizard de criação de relatórios, igual ao que usamos nos exemplos anteriores.

Escolha os campos da tabela Products e con-figure o relatório como quiser. Clique em OK para finalizar a criação do subrelatório. Para editar o subrelatório, clique com o botão direito e escolha a opção Edit Sub report, onde podemos alterar o subrelatório, como se fosse um relatório adiciona-do pelo Solution Explorer.

Para criar a vinculação dos relatórios, clique com o botão direito e escolha Change Subreport Links. No editor, escolha o campo Categories.CategoryID e mova-o para o item Field(s) to link to (Figura 15).

Veja a Figura 15.

Clique em OK para criar a vinculação dos rela-tórios. Devemos executar o relatório que contém os dados da tabela Categories, esse relatório que deve ser chamado em tela. Execute a aplicação e visualize o relatório master/detail no Crystal Report em aplicações ASP.NET (Figura 16).

Veja a Figura 16.

Figura 15. Criando o vínculo entre os relatórios

Figura 16. Relatório mestre/detalhe na Web

Note que ao passar o mouse no detail, ele fica como um link. Clique e visualize somente os dados desse relatório. Essa funcionalidade se cha-ma DrillDown e podemos usá-la também com os relatórios agrupados (ao clicar no grupo, o mesmo é mostrado em separado).

Para voltar a página principal, use o ComboBox (Figura 17) da barra de ferramentas do preeview.

Figura 17. Opção de navegar entre os relatórios mestre e detalhe

Parâmetros em relatórios

De nada adiantaríamos ter relatórios se não pudéssemos filtrá-los de acordo com a necessidade do usuário. Use o primeiro relatório ou crie um novo para este exemplo, onde vamos criar uma simples listagem (tabela Customers)

No relatório, clique com o botão direito no item Parameter Fields e escolha New. No editor, dê o nome de “pCustomers” em Name e configure-o

Page 23: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010 23

conforme a Figura 18. Veja a Figura 18.

Nota: Use sempre o mesmo tipo (Value type) do campo que vamos usar o parâme-tro.

Clique em OK para criar o parâmetro. Clique com o botão direito no relatório e escolha a opção Report>Select Expert. Escolha o campo chave (Cus-tomerID) e clique em OK. Na janela Select Expert, escolha is equal to no primeiro ComboBox e no segundo escolha {?pCustomers}.

Clique em OK. Rode a aplicação e veja que antes de abrir o relatório é solicitado o valor do pa-râmetro que criamos anteriormente (Figura 19)

Figura 19. Solicitação de parâmetro pelo Crystal Report

Digite um valor válido, clique em Submit e visualize o relatório parametrizado. Podemos ainda customizar a aplicação para que não seja mostrada a tela de solicitação do parâmetro. Podemos passar o valor, usando uma Query String, por exemplo.

No evento CrystalReportSource1_Load adicio-ne o código da Listagem 2.

Listagem 2. Código para mostrar o relatório e parâmetro

protected void CrystalReportSource1_Load(object sender, EventArgs e){ if (Request.QueryString[“pCustomers”] != null) {

Figura 18. Configurando parâmetros no relatório

CrystalDecisions.CrystalReports.Engine.ReportDocument MyReport = new CrystalDecisions. CrystalReports.Engine.ReportDocument(); MyReport.Load(Server.MapPath(“Parametros.rpt”)); CrystalDecisions.Shared.ParameterField pField = MyReport. ParameterFields[ “pCustomers”]; pField.CurrentValues.AddValue( Request.QueryString[“ pCustomers”]); CrystalReportViewer1. ReportSource = MyReport; }}

O código criar uma variável (MyReport) do tipo ReportDocument. Carrega o relatório (método Load). Cria também uma variável que será nosso parâmetro (pField) que recebe o valor da QueryS-tring que passaremos na URL.

Por fim, o CrystalReportViewer recebe a vari-ável de relatório. Tudo isso é realizado se a Query String não for vazia (nula). No Default.aspx adicione um TextBox e altere o código do botão:

Response.Redirect(“preeview.aspx?pCustomers=”+ TextBox1.Text);

Rode novamente a aplicação, adicione um valor no TextBox que clique no botão para visualizar o relatório, sem o uso da tela de parâmetros do Crystal Report.

Gráficos

A criação de gráficos no Crystal é bastante sim-ples. Crie um relatório, mas não adicione nenhuma tabela, clique no item Add Command e digite a instrução SQL da Listagem 3.

Listagem 3. Comando SQL para mostrar gráfico no Crystal

select Categories.CategoryID, Categories.CategoryName, COUNT(Products.CategoryID) as Totalfrom Categoriesinner join Products on Products.CategoryID = Categories.CategoryIDgroup by Categories.CategoryID, Categories.CategoryName

Page 24: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 201024

Clique em Next e adicione os campos na aba Fields. Na tela do grupo, crie um grupo para o campo CategoryName. Clique em Next até surgir à opção do gráfico. Escolha o tipo de gráfico e de um título para o mesmo.

Finalize o wizard e veja que temos o gráfico, juntamente com o relatório na parte inferior. Caso deseje, você pode remover o relatório. Para customizar o gráfico (podendo usar templates de gráficos), clique com o botão direito sobre o mesmo e escolha Chart Options>Templates.

Rode a aplicação e veja o gráfico em execução (Figura 20).

Veja a Figura 20.

Preeview dinâmico

Para visualizar cada novo relatório criado no artigo, tivemos que alterar o mesmo no CrystalRe-portSource. Para uma aplicação real, seria inviável criar um ASPX para cada relatório do sistema ou alterar o controle em tempo de execução. Como proceder então?

Precisamos ter um ASPX que seja nosso pre-eview dinâmico e de acordo com o relatório cha-mado, o mesmo seja mostrado em tela. Devemos atentar que de acordo com o relatório podemos um ou mais parâmetros para o relatório.

Vamos chamar o ASPX do preeview e passar por query string um código indicando o relatório que desejamos mostrar. Fique a vontade para pa-dronizar como melhor lhe convier. Na Listagem 4 temos o código do Page_Load do preeview.aspx.

Listagem 4. Código para carregar relatório passado pela Query string

if (Request.QueryString[“report”] != null){ string sNmRelatorio = “”; int nCdRelatorio = int.Parse(Request.QueryString[“report”].ToString());

CrystalDecisions.CrystalReports.Engine.

Figura 20. Criando gráficos no Crystal Reports

ReportDocument MyReport = new CrystalDecisions.CrystalReports.Engine.ReportDocument();

switch (nCdRelatorio) { case 1: sNmRelatorio = “CrystalReport.rpt”; break; case 2: sNmRelatorio = “Formatacao.rpt”; break; case 3: sNmRelatorio = “Formula.rpt”; break; case 4: sNmRelatorio = “Graficos.rpt”; break; case 5: sNmRelatorio = “GrupoValores.rpt”; break; case 6: sNmRelatorio = “OrdemAlfabetica.rpt”; break; case 7: sNmRelatorio = “Parametros.rpt”; CrystalDecisions.Shared.

ParameterField pField = MyReport.ParameterFields [“pCustomers”]; pField.CurrentValues.AddValue( Request.QueryString[“pCustomers”]); break; case 8: sNmRelatorio = “Subrelatorio.rpt”; break; case 9: sNmRelatorio = “Zebrado.rpt”; break; }

MyReport.Load( Server.MapPath( sNmRelatorio)); CrystalReportViewer1. ReportSource = MyReport;}

Para entender o código. Verificamos se a query string esta preenchida. Em seguida, criamos a variável responsável pelo relatório e verificamos qual o valor do parâmetro responsável por indicar o relatório que será exibido.

Com esse valor, configuramos o nome do relatório e caso for o relatório de parâmetros, configuramos o valor do parâmetro. No final, basta carregar o relatório com o nome correto e exibir o

Page 25: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010 25

mesmo no preeview.

Na tela onde temos o botão para chamar o pre-eview, vamos adicionar um RadioButtonList, onde colocaremos as opções de relatórios que temos. Veja na Figura 21 como ficam as propriedades Text e Value dos itens do RadioButtonList.

Figura 21. Configurando o RadioButtonList

Adicione um botão e digite o código da Lis-tagem 5.

Listagem 5. Configurando o relatório a ser chamado

string qs = “preeview.aspx?report=” + RadioButtonList1.SelectedValue.ToString();

if (RadioButtonList1.SelectedValue.ToString() == “7”) qs += “&pCustomers=” + TextBox1.Text;

Response.Redirect(qs);

Veja que montamos uma query string, pas-sando o valor escolhido no RadioButtonList, e caso estivermos usando o relatório de parâmetros, precisamos adicionar o valor do parâmetro que esta no TextBox.

Rode a aplicação e realize os testes (Figura 22) para visualizar todos os relatórios criados no artigo, usando a mesma tela de preeview (mesmo ASPX).

Veja a Figura 22.

Conclusões

Vimos neste artigo, como é fácil trabalhar com relatórios na Web usando o Crystal. Temos mais configurações avançadas para criar relatórios profissionais na Web. Use sua imaginação e as facilidades do Crystal Reports.

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

Figura 21. Configurando o RadioButtonList

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

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

Sobre o autor

Luciano Pimenta

www.lucianopimenta.net

Figura 22. Preeview dinâmico no Crystal Reports

Page 26: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 201026

Olá, neste post irei mostrar como fazer uma Aplicação Silverlight consumir um pro-jeto WCF Services em outro domínio, vou mostrar também como debugar essa aplica-ção através do Silverlight.

Criando Aplicação

Primeiro criamos a aplicação Silverlight nor-malmente (Silverlight Application) no Visual Studio 2010, no meu exemplo irei utilizar Silverlight 4 e não vou utilizar WCF Ria Services.

Criar consumir e debugar WCF Ser vices com Silverlight

Criando Serviço

Aguarde a aplicação ser criada totalmente pelo Silverlight, em seguida adicione um WCF Services em sua Solution, a solution irá ficar semelhante à imagem abaixo.

Criando arquivos de segurança

Agora que o serviço e a aplicação já esta criado crie os arquivos de segurança Crie um arquivo novo no seu projeto Web através do Menu Add> New Item > XML File nomeie ele como clientaccess-policy.xml o conteúdo do arquivo deverá ser as seguintes tags XML:

<?xml version=”1.0” encoding=”utf-8”?><access-policy> <cross-domain-access> <policy> <allow-from http-request-headers=”*”> <domain uri=”*”/> </allow-from> <grant-to> <resource path=”/” include-subpaths=”true”/> </grant-to> </policy> </cross-domain-access></access-policy>

Page 27: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010 27

Crie agora o segundo arquivo XML também dentro do projeto web, siga os mesmos passos do arquivo anterior nomeie ele como crossdomain.xml e inclua as seguintes tags XML:

<?xml version=”1.0”?><!DOCTYPE cross-domain-policy SYSTEM “http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd”><cross-domain-policy> <allow-http-request-headers-from domain=”*” headers=”SOAPAction, Content-Type”/></cross-domain-policy>

Estes arquivos podem ser utilizados para que seja possível consumir serviços fora do mesmo do-mínio a qual a aplicação está sendo hospedada.

Criando arquivo de segurança dentro do projeto WCF

Crie um novo arquivo XML dentro da raiz do projeto WCF Services e nomeie ele como clien-taccesspolicy.xml e inclua ó mesmo conteúdo do outro arquivo clientaccesspolicy.xml que foi criado anteriormente no projeto WEB, veja como deverá estar sua aplicação neste momento.

Consumindo Serviço WCF

Primeiro execute aplicação para que o serviço seja inicializado.

Para consumir serviço WCF no Silverlight basta clicar com o botão direito sobre o projeto Silverli-ghtApplication1 > Add > Add Service Reference… em seguida irá abrir uma tela para selecionar qual o serviço a ser referenciado.

Click em Discovery para que o Visual Studio

procure os serviços contidos na solution e mostre na caixa de Services, renomeie o serviço se ne-cessário e click em Ok, em seguida o serviço será referenciado.

Agora que o serviço esta referenciado abra o arquivo MainPage.xamls e entre as TAGs Grid inclua um botão para que seja o serviço seja consumido:

<Grid x:Name=”LayoutRoot” Background=”White”> <Button x:Name=”btnConsumirServico” Content=”Consumir um serviço WCF” Width=”200” Height=”25” /></Grid>De um duplo click neste botão para criar o evneto OnClick do botão, já no código C# codifique o onClick do botão:private void btnConsumirServico_Click(object sender, RoutedEventArgs e){ ServiceReference1.Service1Client servico = new ServiceReference1.Service1Client(); servico.GetDataCompleted += new EventHandler< ServiceReference1.Get DataCompletedEventArgs>

(servico_GetDataCompleted); servico.GetDataAsync(10);}

Uma dica neste ponto é quando logo após codificar o comando servico.GetDataCompleted =+ tecle 2 vezes a tecla tab para que o visual studio crie o método automaticamente, veja que estare-mos fazendo uma chamada Assíncrona do serviço, estamos determinando um EventHandler para o vento Completed da função GetData, em seguida chamamos o função passando como parâmetro o número 10. No método servico_GetDataCompleted inclua o seguinte código:

void servico_GetDataCompleted(object sender, ServiceReference1.GetDataCompletedEventArgs e){ if (e.Error != null) throw new Exception(e.Error.Message); else MessageBox.Show(e.Result);}

Neste código estou apenas mostrando o resultado do serviço em uma MessageBox, agora vamos testar nossa aplicação, tecle F5 aguarde a execução, em seguida click no botão e o resultado esperado será:

Page 28: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 201028

Trabalha a quase 7 anos com Delphi, trabalha na empresa Benner Sistemas (www.benner.com.br ) na área de tecnologia desenvolvendo fer-ramentas 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 ) . Twitter: djonatastenfen - blog http://www.djonatastenfen.blogspot.com/

Sobre o autor

Djonatas Tenfen

[email protected]

Excelente. Agora já estamos consumindo um serviço.

Debugando Serviço

Agora vem a parta mais interessante. Se colo-carmos um Breakpoint na rotina GetData(int value) que está codificada ( Default ) no arquivo Service1.svc.cs no projeto WCF criado, executar a aplicação e clicar no botão, simplesmente a aplicação não vai parar no Breakpoint e vai executar, isso poder ser um problema caso desejamos descobrir algum eventual problema, podemos sim testar a aplica-ção através da ferramenta WCF Test Client que é executada quando colocamos como Start Project o WCF Services e colocamos um arquivo svc como Start Page.

Para conseguir debugar o WCF Services bansta setar o serviço WCF como StartUp Project

Executar a aplicação através do F5, aguarde o WCF Client Test ser inicializado, em seguida vá ao menu View > Solution Explorer click com o botão direito sobre a sua aplicação Web selecione a opção Debug > Start New Instance e agora você pode executar a sua aplicação Web e debugar o serviço ao mesmo tempo

O projeto pode ser baixado em: DebugWcf.

rarDjonatas TenfenSócio Gerente CodeTec Solutions

Page 29: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010 29

Dicas DELPHI

Anuncie

conosco

Solicite um orçamento:

Skype: theclub_cadastro

E-mail: [email protected]

Fone: (14) 3732-1529

Anuncie na revista e ganhe um

banner publicitário no site do The Club

Criar um nova Tabela a partir de uma estrutura de outra Tabela

Como criar uma nova tabela, vazia, com a mesma estrutura de uma outra tabela que já está sendo usada pelo sistema?

implementation

uses DB, DBTables;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);var TabOrigem, TabDestino: TTable;begin TabOrigem := TTable.create(self); with TabOrigem do begin DatabaseName := ‘NomedoDataBase’; TableName := ‘NomedaTabelaOrigem.db’; open; end; TabDestino := TTable.create(self); with TabDestino do begin DatabaseName := ‘NomedoDataBase’; TableName := ‘NomedaTabelaOrigem2.db’; FieldDefs.Assign(TabOrigem.FieldDefs); IndexDefs.Assign(TabOrigem.IndexDefs); CreateTable; end; TabOrigem.close;end;

Fazer um TEdit aceitar apenas números

Como fazer para que o TEdit só aceite números de 0 a 9 e o BackSpace (Chr(8)). Se vocę quiser a vírgula também, coloque DecimalSeparator dentro do colchete.

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);begin if not (Key in[‘0’..’9’,Chr(8)]) then Key:= #0;end;Ouprocedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);begin if not (Key in[‘0’..’9’,Chr(8),DecimalSeparator]) then Key:= #0; end;

Page 30: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 201030

VerticalHorizontal

Page 31: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010

Page 32: The Club - megazine · desenvolvimento de softwares em Delphi e Visual Studio. Nesse mês temos também o lançamento da nova versão do Delphi. Trata-se da versão XE, que traz boas

setembro 2010