Delphi - Segredos e Solues

CAPTULO 11
 
Grficos

Este captulo mostra os fundamentos de grficos com o Delphi. Voc
tambm pode desenhar em formulrios, com a impressora, ou em um
componente Image. O componente  Shape, por outro lado, fornece-lhe uma
maneira rpida para desenhar imagens como crculos e retngulos. A
utilizao dos mtodos grficos de Delphi freqentemente  requer a
escrita de uma grande quantidade de cdigo mas, como retorno pelo
trabalho extra, esses mtodos permitem-lhe controlar todo ponto que
aparecer em sua tela  ou que  impresso em sua impressora. Pelo fato do
Microsoft Windows ser um ambiente de base grfica, o poder grfico do
Delphi pode ser espantoso.

As linguagens de programao tradicionais normalmente distinguem
grficos de texto; essa distino  muito menos importante com o Windows
e, portanto, com o Delphi.  Esse  o motivo pelo qual voc pode criar
formulrios que exibem texto com fontes to variadas e por que voc 
capaz de utilizar o mtodo TextOut para posicionar  o texto corretamente
na tela. Apesar disso, todos os mtodos grficos como TextOut realmente
pertencem ao objeto Canvas e no  tela ou ao formulrio. Isso significa
que em adio ao Form, ImageBox ou Pointer, qualquer componente que voc
comprar ou fizer, que tem um objeto Canvas, pode ser utilizado para
desenhar.
        Em geral, depois de processar um mtodo grfico, o Delphi
informa ao Windows o que exibir. O Windows, por sua vez, informa ao
adaptador de imagem como exibir  o grfico. Isso significa que o que
voc pode fazer com as declaraes grficas do Delph para controlar a
tela e a impressora. Entretanto, a utilizao desses programas de driver
 automtica. Voc no precisa se preocupar com todas as possveis
combinaes  de hardware que um usurio possa ter. Isso  diferente
daquilo que os programadores MS-DOS esto acostumados. Quando voc
programa grficos em DOS, uma parte do  programa tem de verificar que
tipo de placa grfica  instalada (ou se alguma placa grfica 
instalada), e depois ajustar o programa de acordo.

O Componente Shape

O componente Shape, que est disponvel na pgina Additional da paleta
Componente (o que tem um quadrado, um crculo e um tringulo no cone),
permite-lhe exibir  rapidamente uma figura em um formulrio sem ocupar
muitos recursos Windows. Como  de se esperar, voc utiliza as
propriedades Height e Width para controlar o tamanho  do componente
Shape em um formulrio.
        A chave para utilizar o componente Shape  a sua propriedade
Shape, que tem seis valores possveis. Por exemplo, stCircle resulta em
um crculo e stRectangle,  um retngulo. A maneira exata com que o
Delphi exibe a figura  controlado pelas propri Color utiliza as
constantes Delphi padro para seus valores como clWhite, clBlaclc, e
assim por diante. A propriedade Style tem oito valores possveis, que
tambm  so descritos utilizando as constantes internas, conforme
mostrado na Tabela 11.1.

Fundamentos de Grficos

Voc pode desenhar em um formulrio, em um componente Image, ou na
impressora. Voc viu o componente Image em funcionamento no Captulo l.
O componente Image encontra-se  na pgina Additional da paleta
Componente. Como logo ver, voc desenha nesses trs objetos da mesma
forma, utilizando o objeto Canvas, discutido no Captulo 4.

Tabela 11.1 Valores Possveis das Propriedade Style para o Componente
Shape.

        Valor da Propriedade Style - A Sua Aparncia

        bsSolid
        bsClear
        bsBDiagonal
        bsFDiagonal
        bsCross
        bs DiagCross
        bsHorizontal
        bsVertical

        Os grficos exibidos em um componente Image so persistentes. Os
grficos exibidos em um formulrio no so. (Persistente significa que
se a janela  coberta  e depois descoberta, o grfico no  apagado.)
Isso envolve sempre um compromisso entre  Image podem utilizar muita
memria. (O Delphi tem de informar ao Windows para alocar memria
suficiente que possa conter o grfico todo para poder recri-lo.) Pintar
em um formulrio utiliza menos memria mas exige mais cdigo (e algumas
vezes mais tempo de processamento). Por exemplo, se voc minimizar um
formulrio que contm  alguma coisa que voc desenhou nele, e
posteriormente fizer a sua restaurao, o grfico ter sumido.

NOTA: Uma vez que o Delphi ativa o evento OnPaint cada vez que uma parte
do formulrio  recm-exposta, voc pode escrever o cdigo necessrio no
procedimento OnPaint  sempre que desejar redesenhar parte de um
formulrio.

Portanto, o procedimento que menos utiliza a memria para tratar do
problema de grficos que desaparecem porque um usurio cobriu um
formulrio consiste em redesenhar  o grfico no manipulador de eventos
OnPaint do formulrio.

CUIDADO: Tome muito cuidado para no incluir no manipulador de eventos
OnPaint quaisquer comandos que movimentem ou redimensionem o objeto. Se
o fizer, o Delphi  simplesmente chamar de novo o procedimento OnPaint,
e voc ficaria preso em uma regresso sem fim.

        Ocasionalmente voc ser obrigado a utilizar o mtodo Refresh ao
trabalhar com grficos. Esse mtodo aplica-se tanto a formulrios como a
componentes. Ele  obriga a um refrescamento imediato do formulrio ou
componente. Se voc utilizar o mtodo R que voc escreveu para o objeto.
Esse mtodo  comumente utilizado no manipulador de eventos OnResize do
formulrio para reapresentar qualquer grfico. Tambm, embora  o Delphi
cuide do refrescamento da tela durante o tempo ocioso, ocasionalmente
voc mesmo vai querer controlar esse processo. Sempre que o Delphi
processa uma declarao  Component.Refresh, ele redesenha imediatamente
o objeto e gera o evento OnPaint (se o componente reconhecer esse
evento).

Mais sobre Componentes Image

As propriedades mais importantes de componentes Image so resumidas
aqui:

        AutoSize (image) - Quando essa propriedade do componente Image 
True antes de voc carregar a figura, o controle da imagem 
redimensionado para combinar  com o grfico colocado nele. O padro 
False e assim a figura pode ser cortada ou no pree
        Center - Essa propriedade booleana determina se o grfico 
centralizado dentro do componente Image. O padro  True.
        Picture - Essa propriedade
deter##################################################
######################################################
#
######################################################
#
######################################################
######################################################
################## ##########mina o grfico que
aparece no componente.  normalmente utilizado com o mtodo
LoadFromFile. A maneira tpica de utilizar esse mtodo pode ser assim:

       Image1.Picture.LoadFromFile/'BTFLY.BMP');

        Voc pode carregar cones, mapas de bits, ou metaarquivos
Windows utilizando a propriedade Picture.

        Stretch - Se voc especificar a propriedade AutoSize como False
e a propriedade Stretch como True, ento, o Delphi permite aos mapas de
bits e aos metaarquivos  crescerem para preencher o componente Image.
(Os cones permanecem sem alterao.)

Fundamentos de Grficos Canvas

O objeto Canvas, que  uma propriedade dos formulrios, dos componentes
Image e do Printer,  a chave para desenhar no Delphi. Voc trabalha com
propriedades e mtodos  do objeto Canvas, para fazer tudo desde colorir
um determinado ponto at desenhar um retngulo de cantos arredondados.

Cores

Se voc no especificar uma cor para seu desenho, o Delphi utiliza a cor
do primeiro plano do objeto para todos os mtodos grficos. Voc tem de
especificar a cor  antes de utilizar o mtodo grfico propriamente dito.
H trs maneiras para especificar cores:

        *Utilize as constantes de cor predefinida, como clBlack ou
clGreen.
        *Utilize a caixa de dilogo Color para selecionar uma cor, em
seguida utilize o valor dentro da propriedade Color e atribua-a 
propriedade Color de um outro  controle.
        *Utilize a funo ColorToRGB. A sintaxe dessa funo 

             ColorToRGB(Color: TColor): Longint;

onde a cor  a propriedade Color de um componente.

Controle de Pixel

Agora que voc j sabe de que maneira as cores so atribudas, como 
que voc ativa um pixel? Para isso, utilize a propriedade Pixels do
objeto Canvas. A sintaxe  para utilizar essa propriedade para um
formulrio 

        Canvas.Pixels(Col,Linha) := cdigo de cor;

ou, para um componente Image,

        NomeCaixalmagem.Canvas.Pixels(Col,Linha) := cdigo de cor;

        Se voc tem sorte suficiente para ter uma impressora colorida
com um bom driver Windows, pode acrescentar a unidade Printers 
clusula uses e depois, aps  inicializar a impressora com o mtodo
BeginDoc, utilize

        Printer.Canvas.Pixels(Col, Linha) := cdigo de cor;

Em geral, tudo o que voc tem a fazer  substituir os parmetros pelos
valores que desejar e o cdigo de cor pela constante interna apropriada.
O valor da primeira  entrada determina a coluna, e a segunda determina a
linha. Depois que o Delphi processar essa declarao, o pixel associado
com aquele ponto se ilumina.

Desenhando Formas

Evidentemente, se voc tivesse que desenhar tudo plotando pontos
individuais, a programao de grficos seria muito demorada para ser
prtica. Em adio ao componente  Shape, o Delphi  fornecido com um
suprimento rico de recursos grficos, chamados primitivos grficos.
Esses lhe permitem plotar figuras geomtricas como linhas,  caixas,
crculos, elipses e cunhas com uma nica declarao. Por exemplo, eis o
cdigo necessrio para desenhar uma linha do canto superior esquerdo do
formulrio  para o lugar em que o usurio deu um clique no mouse:

        procedure TForm1.FormMouseDown(Sender: TObject; Button:
TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        begin
          Canvas.MoveTo(0, 0);
          Canvas.LineTo(X, Y);
        end;

        A primeira declarao move o ponto de partida da linha para 0,0
- o canto superior esquerdo. A segunda declarao d a voc uma linha
comeando no canto  superior esquerdo indo at o ponto em que o usurio
deu um clique no boto do mouse. (A linha do formulrio.)
        Normalmente, para descrever um crculo ou uma elipse no Delphi,
voc fornece as coordenadas de seu retngulo limite como os parmetros
ao mtodo Ellipse.  Por exemplo, o seguinte fragmento desenha um crculo
que preenche toda a rea de cliente do 

        Canvas.Ellipse(0, 0, ClientWidth, ClientHeight);

        Voc tambm pode acrescentar um cdigo de cor ao mtodo Ellipse.
Por exemplo:

        Canvas.Brush.Color := clRed;
        Canvas.Ellipse(0, 0, ClientWidth, ClientHeight);

desenharia um crculo vermelho.

NOTA: O objeto Canvas tambm fornece propriedades para os seguintes
objetos grficos: arcos, cordas, setores, polgonos e retngulos. Ele
tambm permite-lhe copiar  rapidamente regies retangulares de uma parte
do formulrio para outra. Verifique a ajuda on-line para maiores
informaes.

ltimo Ponto Referenciado

O Delphi mantm controle sobre o local em que o traado parou.
Normalmente esse local  chamado de ltimo ponto referenciado (LPR), e o
valor da propriedade PenPos  armazena essa informao.

NOTA: Utilize o mtodo MoveTo para mudar a propriedade PenPos em vez de
mud-la diretamente.

Canetas

A propriedade Pen (caneta) de um objeto Canvas controla a maneira como
as linhas e formas so traadas. A caneta tem cinco propriedades: Color,
Handle, Mode, Style  e Width. A largura padro de uma caneta  um pixel.
O prximo exemplo de cdigo mostra como mudar a largura de uma caneta
para dois pixels:

        Canvas.Pen.Width := 2;

        Depois que voc mudar a largura da caneta, o Delphi desenha
todas as formas utilizando a largura nova para seus limites.
        Se voc no quer uma linha slida, tudo o que tem a fazer 
mudar a propriedade Style da caneta. H sete especificaes possveis,
conforme relacionado na  Tabela I 1.2.

Tabela 11.2 Valores da Propriedade Style da Caneta.

        Valor da Propriedade style - O Que a Caneta Desenha

        psSolid (padro) - Uma linha slida.
        psDash - Uma linha formada por uma srie de traos.
        psDot - Uma linha formada por uma srie de pontos.
        psDashDot - Uma linha formada por traos e pontos alternados.
        psDashDotDot - Uma linha formada por uma srie de combinaes
trao-ponto-ponto.
        psClear - Linhas formadas de marcas no visveis.
        pslnsideFrame - Linhas com a moldura de formas fechadas que
especificam um retngulo como contorno.

        Ocasionalmente, voc precisa utilizar a propriedade Mode que
determina como a caneta interage com os pixels na tela. Por exemplo, se
voc especificar a propriedade  Mode como sendo pmNot, ento o Delphi
utilizaria a cor oposta quela que se encont

NOTA: A propriedade Handle fornece-lhe a ala de objeto GDI do Windows
para um objeto Delphi. Isto permite-lhe utilizar chamadas API do Windows
para grficos mais  sofisticados. #Pincis (Brushes)

A propriedade Brush do objeto Canvas permite-lhe especificar como o
Delphi deve preencher uma rea. Caixas e crculos normalmente so vazias
ou slidas, mas o  Delphi permite oito padres diferentes para preencher
as caixas. Para fazer isso, voc tem de mudar a propriedade Style do
formulrio ou caixa de figura. A propriedade  Style para pincis
funciona exatamente da mesma forma que para o controle Shape, e assim os
valores para as propriedades Style so os mesmos. Por exemplo, bsSolid
fornece a voc uma forma preenchida.

Salvando Grficos em Disco

O Delphi facilita o salvamento de figuras que voc desenhou em um
componente Image. A declarao SaveToStyle utiliza a seguinte sintaxe: 

        Image. Picture. SaveTo File(NomeArquivo)

        O sistema operacional utiliza a propriedade Picture para
identificar o grfico no componente. Se originalmente voc carregou a
figura de um arquivo atribuindo  um grfico  propriedade Picture do
componente Image, O Delphi salva a figura no mesmo  como arquivos de
cone. Caso contrrio, o Delphi salva a figura como um arquivo mapa de
bits (.BMP).
