5 de novembro de 2009

Customizando a aparência de um Grid em Delphi - parte 1

As tabelas - ou grids - são um recurso bastante usado em aplicações Delphi, principalmente aquelas que implementam acesso a informações em bancos de dados e que, portanto, fazem uso dos grids para tabular registros do banco de dados. O funcionamento padrão dos Grids em Delphi dão conta de exibir corretamente as informações associadas a eles, sem precisar de muito configuração. No geral, basta alimentar as células internas (no TStringGrid) ou ajustar as fontes de dados e queries (no TDBGrid) para ter um Grid funcional, exibindo seu conteúdo em linhas e colunas e permitindo navegação.

Há situações, no entanto, que o funcionamento básico não é o bastante. Um dos módulos disponíveis no ERP da ABC71, por exemplo, é um MRP II que faz uso intensivo de grids para exibir informações relacionadas ao Planejamento de Produção. Nestes grids é necessário dar destaque a células cujo conteúdo exija uma atenção diferenciada - falta de saldo de um produto, por exemplo. Uma outra situação, esta mais convencional, seria mostrar créditos em azul e débitos em vermelho num grid com dados do Balanço.

Há um evento nos grids com o nome de OnDrawCell (ou OnDrawDataCell, no DBGrid) e que foi projetado justamente para permitir a customização da aparência desses grids.

Antes de seguir falando sobre o evento em si, é necessário introduzir um conceito indispensável para podermos codificar a nova aparência. Em Delphi e C++ Builder, todos os componentes visuais (aqueles que aparecem na tela quando o programa é executado) são construídos em cima de uma tela de pintura chamada Canvas. Um Canvas é uma matriz de pontos - os pixels - que cobre toda a altura e largura reservada para o componente. Cada ponto tem sua própria cor, de modo que podemos dar ao componente a aparência que quisermos apenas preenchendo os pontos de acordo com o desejado.

No Delphi e no C++ Builder, os Canvas são instâncias da classe TCanvas, que na verdade encapsulam chamadas a uma biblioteca da API do Windows denominada GDI+. O GDI+ é a responsável pelos gráficos do Windows, incluindo o desenho de textos, linhas e imagens além de transmitir corretamente esses gráficos para a mídia a que se destinam (a tela do computador ou o papel numa impressora, por exemplo).

O TCanvas disponibiliza funções para desenho de linhas e polígonos, preenchimento de áreas com cores e padrões, desenho de textos e renderização de imagens já prontas. As principais propriedades do TCanvas e a utilidade de cada uma é descrita na lista abaixo:
Brush: O Pincel é usado para configurar cores e padrões de preenchimento de áreas. Os padrões permitidos incluem alguns valores predefinidos e a possibilidade de espeficar um Bitmap como modelo. Funções do TCanvas que desenham a cor de fundo (como o Rectangle, que é um retângulo preenchido) também usam as propriedades definidas no Brush para fazerem o preenchimento.
Pen: A Caneta define como será feito o desenho de linhas, incluindo a cor dos pontos que a comporão, a largura da linha e um padrão de desenho (linha cheia, pontos, traços, etc.). As funções que desenham polígonos também usam a configuração do Pen para traçar as linhas que limitam o polígono (como no caso do Rectangle)
Font: A Fonte permite estabelecer as características dos textos que serão desenhados, incluindo a família da fonte (Arial, Courier, etc.), o tamanho e cor das letras, se terá alguma decoração extra (negrito, itálico, etc.). Usada pelas funções relativas ao desenho de textos como TextOut.
CopyMode: Essa propriedade é usada quando se faz cópia de partes (ou o todo) de um Canvas para outro. Ela afeta o modo como essa cópia é feita, determinando o tipo de combinação entre os pontos existentes em cada Canvas. Isto é, se as cores dos pontos no Canvas de origem apenas substituirão aqueles existentes no destino ou se será aplicado algum operador lógico ou uma outra regra de combinação. Como resultado, pode-se conseguir uma série de efeitos.
Pixels: Cada um dos pontos que compõem a tela de pintura pode ser acessado individualmente através dessa propriedade. Ela é um array bidimensional (largura e altura da área de pintura) que permite mudar a cor mantida em cada ponto. Usar a propriedade Pixels é útil quando se quer traçar os pontos determinados por uma função matemática - algo como y = f(x).

Consulte a documentação do TCanvas para maiores detalhes sobre essas propriedades e as funções existentes.

No próximo post, volto com o exemplo dos Grids customizados para mostrar na prática o uso do Canvas.

Mais Informações
Documentação do GDI+

1 de novembro de 2009

Incluindo mapas em um Web site

Parece que virou mania trabalhar com mapas para facilitar a visualização de locais, para dar instruções de como chegar a um determinado local ou apenas para visitar vitualmente pontos turísticos como diversão. São ferramentas para o computador como o Google Earth ou aparelhos que você pode carregar consigo, como GPSs ou celulares. Na internet, endereços como o Apontador permitem que você estabeleça rotas para ir de um ponto a outro.

A sofisticação dessas ferramentas tem aumentado cada vez mais, com exibição de imagens de satélite em melhor resolução e inclusão de outros serviços associados, como indicação de ônibus que passam pelo local ou próximo a ele, estações de metrô nas proximidades, lojas e caixas 24 horas localizadas nas redondezas, etc.

Agora, também está ficando mais fácil incluir este tipo de serviço no seu próprio site. Como parte do sistema de buscas Bing, a Microsoft lançou um conjunto de serviços e APIs que permitem formatar um mapa com as características desejadas e incluí-lo no seu site.

De acordo com o site da Microsoft, "o Bing Maps é um serviço online de mapas que permite aos usuários pesquisar, descobrir, explorar, planejar e compartilhar informações a respeito de locais específicos. Ao usar mapas tradicionais de rodovias, fotos aéreas com textos, fotos em ângulo baixo aéreas e de alta resolução e capacidade de pesquisa por aproximação, o Bing Maps fornece oportunidades únicas aos desenvolvedores de software para incorporar tanto localizações fixas quanto busca por locais específicos em suas aplicações Web".

A API é disponibilizada como um conjunto de classes JavaScript, apropriadas para inclusão numa página HTML. Para usá-la, então, precisamos incluir no cabeçalho do HTML uma referência a essas classes JavaScript:
<script type="text/javascript" src="http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.2"></script>

A classe principal dessa API é a VEMap, provendo acesso aos mapas em si e introduzindo funções para dar-lhes a aparência desejada, traçar rotas, incluir marcações customizadas, etc.. O funcionamento básico dela está exemplificado na função abaixo, extraído do mapa que é exibido mais em baixo nesse post:
function GetMap()
{
map = new VEMap('myMap');
map.LoadMap(new VELatLong(-23.5656,-46.6524),16,'h' ,false);
}

A função LoadMap aceita como parâmetro um par Latitude/Longitude com as coordenadas do ponto que será exibido no mapa. Os demais parâmetros indicam, na sequência, a profundidade do zoom aplicado (de 1 para o mais afastado até 20 para maior aproximação), o tipo de imagem será apresentada (imagens de satélite, mapa tradicional ou um híbrido desses dois) e, por último, se o mapa permanecerá fixo na posição configurada (true) ou se permitirá interação com o usuário (false).

O nome 'myMap', informado como parâmetro ao construtor da VEMap, é o ID da tag HTML onde o mapa será desenhado. No exemplo abaixo, a função GetMap escrita no quadro anterior é chamada no evento OnLoad da página. Veja que há uma tag DIV cujo ID é 'myMap' - é dentro desta tag que o mapa será apresentado.
<body onload="GetMap();">
<div id='myMap' style="position:relative;height:400px;"></div>
</body>

O resultado é o mapa abaixo. Ele está permitindo interação, isto é, você pode navegar para outros pontos e modificar a forma de exibição.

Se não conseguir visualizar o mapa acima, clique aqui. Se você usa o Firefox com o complemento NoScript, terá que liberar a execução de scripts para o endereço onde o Bing armazena os scripts do programa de Mapas antes de poder visualizar o mapa publicado aqui.

Além do código básico mostrado aqui, o mapa reproduzido acrescenta uma marcação indicando a localização exibida - no caso, o endereço da ABC71 em São Paulo. Outros recursos disponíveis mas não representados no exemplo são a capacidade de traçar uma rota entre dois pontos, encontrar pontos de referência e endereços, visão 3D e "Birds Eye" (um plano inclinado em relação ao chão ao invés de paralelo ao chão), etc.

Uma ferramenta que a Microsoft disponibilizou junto com o SDK facilita bastante a criação do código HTML envolvido na publicação de mapas. Trata-se do Bing Maps Interactive SDK que apresenta num menu a lista de recursos disponíveis na ferramenta e um painel lateral com o mapa gerado pela opção selecionada. Quando você terminar de montar o mapa com as características que você quer, basta mudar para a guia Source Code e copiar o código HTML gerado com o exemplo para incluí-lo em seu site.

28 de outubro de 2009

Design Patterns com Delphi : Facade

A palavra inglesa "Facade" pode ser traduzida como fachada, isto é, a parte de uma construção que é vista por quem está do lado de fora ou a parte da frente dessa construção. Quando aplicada à Engenharia de Software, Facade denomina um Design Pattern estrutural que se propõe a trabalhar como uma fachada no programa que o implementa. Com isso, outras partes do programa enxergarão apenas o que a classe do tipo Facade expõe, sem ter que se preocupar com aspectos ligados à implementação do que é exposto.

O Facade é bastante usado para implementar o código relativo a Casos de Uso num Projeto Orientado a Objetos. Num Caso de Uso, o(s) ator(es) envolvidos interagem com o sistema, acionando operações que estão disponíveis - a "fachada". Para executar a operação solicitada, o Facade cria instâncias de um ou mais objetos de negócio conforme for necessário e transfere para eles a responsabilidade de executar tarefas menores na sequência correta, de forma que no final a operação descrita no Caso de Uso é realizada. O mesmo Facade pode encapsular a funcionalidade de um ou mais Caso de Uso, se isso fizer sentido.
Diagrama UML para Facade

A nomenclatura para as classes envolvidas no padrão Facade é a seguinte :
O Client é a classe (ou trecho de código) que faz uso da interface exposta pelo Facade, tendo conhecimento dos métodos expostos mas nada a respeito de como estão implementados. No diagrama, este participante é representado pela classe TWAtor.
O Facade é a classe principal nesse padrão. É ela quem expõe os métodos que estarão disponíveis para um Client usar. Este papel é exercido pela classe TWOperacaoCompra no diagrama anterior.
São chamadas de Subsystem Classes aquelas classes que são contidas na classe Facade. São instâncias dessas classes quem de fato executa as operações solicitadas, seja na totalidade ou cada uma colaborando com um pedaço da tarefa. As classes TWCliente, TWDocumentoCompra e TWAnaliseCredito são do tipo Subsytem Class no diagrama acima.

No diagrama acima aparece a representação UML das classes envolvidas num Caso de Uso implementado como Facade. Veja que a única relação existente entre a classe Facade e as classes de regras de negócio envolvidas é do tipo Associação. Isto é, não há herança entre elas. A classe Facade apenas contem instâncias de outras classes e as cria conforme vai precisando; para isso, essa classe é obrigada a conhecer de antemão as operações e propriedades das classes relacionadas.

Para representar esse Design Pattern em Delphi, basta declarar as classes de subsistema e incluí-las como membros na classe Facade. Elas serão instanciadas e destruídas conforme a necessidade - possivelmente dentro do próprio método que tenha que executar alguma operação nessa classe.
type
TWCliente = class
{ ... }
_Nome : String;
_Id : Double;

procedure Recuperar;
procedure Gravar;
{ ... }
end;

TWAnaliseCredito = class
{ ... }
function TemCredito (ACliente : TWCliente) : Boolean;
{ ... }
end;

TWOperacaoCompra = class
{ ... }
_Cliente : TWCliente;
_Analise : TWAnaliseCredito;

procedure VerificaCredito;
{ ... }
end;

{ ... }

procedure TWOperacaoCompra.VerificaCredito;
var lCredito : boolean;
begin;
_Cliente := TWCliente.Create;

{ recupera aqui informações do Cliente }

_Analise := TWAnaliseCredito.Create;
lCredito := _Analise.TemCredito (_Cliente);

{ ... }

_Analise.Free;
_Cliente.Free;
end;

Um outro exemplo de uso para o Facade é a criação de interface para operações de um subsistema inteiro. Imagine, por exemplo, que a análise de crédito de um Cliente em seu programa misture regras existentes no seu próprio banco de dados com verificações em um ou mais Sistemas de Proteção de Crédito. Um Facade seria uma boa solução de projeto para encapsular o acesso a todo o subsistema de Análise de Crédito já que esconderia os detalhes de implementação de cada um dos métodos de análise. Além disso, se tais métodos se encontrarem em outras bibliotecas (DLLs ou WebServices, por exemplo), o programa que fará uso do Facade não terá que se preocupar com cargas nem mapeamentos.

Mais Informações
Posts sobre Design Patterns

26 de outubro de 2009

Descobrindo se seu computador comporta o Windows 7

Sempre que sai uma nova versão de um Sistema Operacional - notadamente o Windows - temos uma certa resistência em fazer a troca. As preocupações vão desde o básico "será que o novo sistema terá um boa performance no meu computador ?" até as mais profundas, envolvendo a compatibilidade dos softwares que você mais usa.

Ciente disso, a Microsoft preparou um programa para diminuir os riscos, ao menos no que diz respeito à performance geral do computador e à compatibilidade de periféricos como impressoras e placas de vídeo. O programa chama-se Windows 7 Upgrade Advisor e pode ser executado em computadores com qualquer das versões do Windows que ainda têm suporte, a saber: o próprio Windows 7, o Windows Vista e o Windows XP com Service Pack 2. O programa, que é gratuíto, está disponíel no site da Microsoft através do link http://go.microsoft.com/fwlink/?LinkId=161223. Também pode ser encontrado em outros endereços em sites de download (Info Online, PC World, entre outros).
Tela do Upgrade Advisor

Após o download e a instalação, o programa poderá ser executado para determinar a compatibilidade com o Windows 7. Ele procurará em todo o seu computador por problemas potenciais com hardware, dispositivos existentes e programas que você tenha instalado. Caso encontre algum problema, ele dará recomendações sobre o que deve ser feito antes de tentar partir para a migração para o Windows 7.

Por causa da forma com que o Upgrade Advisor trabalha, você deve ligar os periféricos que você normalmente usa de modo que o programa possa acessá-los e determinar sua compatibilidade com o novo Windows. Isso inclui impressoras, scanners, discos externos, equipamentos que usem a USB (neste caso, o equipamento - como câmeras fotográficas - deve estar conectado na USB e deve estar ligado), etc.

A Microsoft não recomenda que o programa seja executado em ambiente virtualizado (usando o Virtual PC ou Remote Desktop) pois ele poderá deixar de detectar alguns recursos.

Você encontrará no site PC Saudável um tutorial básico para a execução do Advisor.