Delphi - Segredos e Solues

 CAPTULO 12

 Recursos Avanados da Interface com o Usurio

Agora que voc aprendeu a maioria das tcnicas de programao
necessrias no Delphi, est na hora de voltar novamente  interface com
o usurio. Este captulo explora  mais um pouco a utilizao de alguns
dos componentes da paleta Componente (que foi abordada no Captulo 3).
Aqui vamos lhe mostrar as tcnicas necessrias para acrescentar  barras
de ferramentas e barras de status ao seu aplicativo. Adicionalmente, ns
vamos lhe mostrar mais a respeito das caixas de dilogo comuns. (Uma das
quais, a  caixa de dilogo Open File, foi apresentada no Captulo l.)

Quando voc comea a acrescentar muitos componentes diferentes a um
formulrio, a maneira como eles se sobrepem torna-se mais importante.
Assim, este captulo tem  uma seo a respeito da ordem em que o Delphi
costuma exibir elementos de interface. Essa seo explica o que acontece
se voc desenhar componentes sobrepostos:  quais aparecem no topo e como
isso pode ser mudado. (A chamada Ordem Z. O Z representa o eixo-z, a
maneira convencional para descrever a profundidade. )
        Em seguida, voc vai ver um pouco sobre aplicativos MDI
(interface de vrios documentos) e uma discusso de como monitorar o que
o usurio est fazendo com  o seu mouse. Finalmente, terminamos com uma
pequena discusso sobre sistemas de ajuda.

Acrescentando Barras de Ferramentas e Barras de Status aos Projetos

Os painis so os melhores componentes para construir uma barra de
ferramentas ou uma barra de status em um formulrio. Isso porque a
colocao de um painel na parte  superior ou inferior de um formulrio 
fcil no Delphi utilizando-se a propriedade Align. O valor da
propriedade Align determina onde o painel aparece. A propriedade  Align
tem seis valores possveis e o que eles fazem  descrito na Tabela 12.1.

Construindo uma Barra de Ferramentas ou uma Barra de Status

Primeiro, decida sobre os cones que voc quer utilizar para sua barra
de ferramentas. Em seguida, atribua esses cones  propriedade Glyph dos
componentes SpeedButton  que estaro na barra de ferramentas. Agora para
realmente construir a barra de ferramentas, siga estes passos:

        1. Desenhe um painel suficientemente grande para englobar os
cones que so utilizados na barra de ferramentas.
        2. Especifique a propriedade Align do painel em alTop.
        3. Prenda os componentes SpeedButton ao painel. (O mtodo do
"clique duplo" para adicionar componentes, descrito no Captulo 3, 
provavelmente a maneira  mais fcil para fazer isso.)
        4. Especifique a propriedade Glyph do boto com o nome de
arquivo dos cones que deseja.

Tabela 12.1 Os Valores e Aes da Propriedade Align.

        Valor da Propriedade Align - Ao

        alBottom - O valor para uma barra de status. O painel  alinhado
com o fundo do formulrio e automaticamente tem tambm a largura
correta.
        alClient - Esse valor dimensiona o painel para preencher a rea
de cliente do formulrio.
        alLeft - O painel  alinhado com a esquerda do formulrio e
automaticamente tem tambm a altura correta.
        alNone - O padro para formulrios comuns. Voc pode posicionar
o painel em qualquer lugar que quiser.
        alRight - O painel  alinhado com a direita do formulrio e
automaticamente tem tambm a altura correta.
        alTop - O valor para uma barra de ferramentas. O painel
aparecer alinhado com o topo e automaticamente ter a mesma largura que
o formulrio.

DICA: Para dar  barra de ferramentas uma aparncia profissional, voc
deveria posicionar os componentes SpeedButton seqencialmente sem nenhum
espao entre eles,  e eles deveriam ser centralizados dentro do painel.
Por exemplo, se a altura do painel  41 e aquela dos botes  25, voc
vai querer especificar a propriedade alTop  em 8 para que os botes
fiquem centralizados.

        Voc tambm pode querer considerar o acrscimo de dicas de ajuda
que o prprio Delphi utiliza. Assim, se o usurio no tem certeza sobre
o que um cone faz,  ele precisa apenas deixar o mouse sobre o boto
durante um certo tempo antes que aparea  a propriedade ShowHint em
True. (Especifique a propriedade Hint com o texto que voc quer
apresentar e a propriedade HintPause para especificar o tempo que demora
antes dele aparecer.)

NOTA: Voc pode querer que os botes se comportem como um grupo; por
exemplo, voc pode querer que eles operem somente um por vez. Para fazer
isso, especifique a  propriedade GroupIndex adequadamente.

        Botes agrupados tambm do a impresso de se alternar entre si
ao serem pressionados ou no. Se voc quer que um SpeedButton
no-agrupado aparente se alternar  entre ser pressionado e no
pressionado, especifique AllowAllUp como True e a propried

Barras de Status

As barras de status tendem a ser orientadas com texto. Tipicamente, os
nicos grficos utilizados so linhas sombreadas para separar os itens
de texto de maneira  a dar uma aparncia melhor  barra. Essas linhas
podem ser criadas utilizando o objeto Canvas. Um mtodo possvel para
atualizar a barra de status  escrever o cdigo  que envia o texto 
barra de status em qualquer procedimento que necessite atualiz-la.
Entretanto, a escolha mais limpa normalmente consiste em chamar um
subprograma  que atualize a barra de status -  sempre melhor ter os
procedimentos se concentrando naquilo que se pretende que devam fazer em
vez de permitir que eles tambm  atualizem as barras de status! (Por
exemplo, o procedimento geral que atualiza a barra de status talvez
tenha que chamar um outro procedimento para fazer a anlise  gramatical
do texto. )

DICA: Para dar  barra de status uma aparncia mais profissional com um
texto rebaixado em lugar de elevado e uma bela moldura, especifique a
propriedade Bevellnner  do painel como sendo byLowered, e a propriedade
Border- Width como sendo 2.

Caixas de Dilogo Comuns

Porque voc tem trabalhado com o Windows e o Delphi, voc j se
acostumou a ver uma das oito caixas de dilogo comuns para abrir e
salvar um arquivo, imprimir, escolher  fontes, ou especificando cores.
Esses componentes tiram vantagens dos dilogos padro no COMMDLG.DLL. O
COMMDLG.DLL est localizado em seu diretrio \WINDOWS\SYSTEM.  O Windows
inclui essa DLL. Verses novas dessa DLL so lanadas de tempos em
tempos, de maneira que  melhor verificar a informao de verso do
arquivo com a opo  Properties no menu File do File Manager. As caixas
de dilogo comuns so fceis de ser utilizadas em princpio, mas o
nmero de possibilidades  grande; assim, este  captulo pode lhe
fornecer apenas uma idia de como trabalhar com elas.
        Todos os componentes das caixas de dilogo comuns esto na
pgina Dialogs da paleta Componente (veja no Captulo 2 descries dos
cones, ou utilize as dicas  de ajuda). Para utilizar uma caixa de
dilogo comum, voc tem de colocar o componente ou
        Os componentes de dilogo comuns so normalmente invisveis ao
usurio enquanto o programa est processando. Para realmente apresentar
uma caixa de dilogo  comum especfica  necessrio especificar o mtodo
Execute do componente de dilogo comum  item Open File no menu File o
manipulador de eventos Click est em Open 1 OnClick, o cdigo para fazer
surgir uma caixa de dilogo File Open utilizando o nome padro  do
componente comea assim:

        procedure TForm1.OpenlClickSender: TObject);
           OpenDialog1.Execute;

        A Tabela 12.2 relaciona as caixas de dilogo comuns disponveis
no Delphi.

NOTA: Os componentes da caixa de dilogo comum no executam nenhuma
ao; apenas aceitam informaes. Voc ter sempre que escrever o cdigo
que informa ao Delphi  o que fazer com a informao colocada e depois
processar esse cdigo quando o usurio fecha a caixa de dilogo comum.

Tabela 12.2 Caixas de Dilogo Comuns Disponveis no Delphi.

        Nome da Caixa de dilogo - Descrio

        Color - Mostra as cores disponveis.
        Font - Mostra as fontes disponveis. Inclui tamanhos de pontos e
cores se apropriado.
        Open - Exibe nomes de arquivo. Pode especificar filtros para
determinadas extenses, diretrios e drives.
        Save As - Exibe nomes de arquivos. Tambm pode especificar
filtros para determinadas extenses, diretrios e drives.
        Print - Exibe a caixa de dilogo Print padro do Windows para
determinar a sada. Tambm pode ser utilizado para obter informaes a
respeito de impressoras  instaladas.
        Printer Setup - Exibe uma lista de impressoras disponveis.
Tambm permite-lhe obter informaes de como especificar a orientao o
tamanho e a fonte de  papel. (Tambm pode ser aberta a partir da caixa
de dilogo Print.)
        Find - Exibe um controle de edio para que o usurio possa
colocar uma string a ser procurada.
        Replace - Fornece dois controles de edio para o alvo e sua
substituio.

Trabalhando com Caixas de Dilogo Comuns

Antes de voc apresentar a caixa, ter que inicializar as diversas
propriedades que determinam a aparncia das caixas de dilogo comuns.
Por exemplo, voc pode deixar  como padro da caixa de dilogo Print a
opo para imprimir somente a pgina l. Isso  feito ajustando o valor
das propriedades FromPage e ToPage do componente de  dilogo comum,
conforme mostrado na listagem que segue.

        PrintDialog1.FromPage :=1;
        PrintDialogl.ToPage :=1;

        Todas as caixas de dilogo comuns permitem-lhe determinar se o
usurio d um clique no boto Cancel (ou pressiona ESC). Preparar uma
armadilha para isso   necessrio na maioria de (se no em todos) os
casos - pense como era frgil o visualizador  no boto Cancel ou uma
operao da tecla ESC que fecha uma caixa de dilogo, voc ter que
incluir um fragmento do cdigo como o seguinte:

        if OpenDialog1.Execute then
          begin
              {declaraes usando OpenDialogl.Filename};
          end;

        Se o usurio d um clique no boto Cancel ou pressiona ESC,
ento o Delphi devolve False como o valor do mtodo Execute, e assim
esse cdigo no seria processado.  Por exemplo, se ns mudssemos o
cdigo no visualizador de mapa de bits no Captulo

        procedure TForm1.FormActive(Sender: Tobject)
        begin
          if OpenDialog1. Execute then
              begin
                Image1.Picture.LoadFromFile(OpenDialog1.Filename);
              end;
        end;

ele seria bem mais robusto.

As Caixas de Dilogo File Open e File Save

A Tabela 12.3 descreve as propriedades mais importantes utilizadas para
essas caixas de dilogo.
        As propriedades Options so muito importantes para determinar a
aparncia e apresentao final da caixa. Por exemplo, uma linha de
cdigo como

OpenDialog1.Options := [ofAllowMultiSelect];

permite  caixa de lista FileName utilizar as tcnicas Windows padro
para vrias selees.

Tabela 12.3 Propriedades Importantes das Caixas de Dilogo File Open e
File Save.

        Propriedade - Utilizao
                                                    DefaultExt -
Estabelece a extenso padro para os arquivos mostrados na caixa.
        Title - Especifica a barra de ttulos. Em particular, voc no
precisa utilizar Open e Save se estiver utilizando essas caixas em
outros contextos.
        FileName - Fornece o nome e o caminho do arquivo selecionado.
        Filter - Afeta a caixa Type. Voc pode ter vrios filtros
separando-os por uma barra vertical ( | ) normalmente encontrada acima
da barra reversa no teclado.  O formato  a string de descrio, a barra
vertical, o filtro, mais uma barra e assim po FilterIndex - Utilizada
quando voc estabelece vrios filtros utilizando a propriedade Filter.
        Options - Utilizada para estabelecer vrias opes possveis de
como a caixa ser apresentada.
        InitialDir - Especifica o diretrio inicial.

        Voc pode combinar mais do que um indicador, conforme mostrado
no seguinte exemplo:
 
      OpenDialog1.Options := [ofNoChangeDir, ofHideReadOnly];

         (O que essa linha de cdigo faz  impedir o usurio de alterar
o diretrio e esconde a caixa de escolha apenas de leitura.)
        Assim que o usurio d um clique no boto OIC em uma caixa de
dilogo, voc tem de ler novamente a informao colocada e depois tomar
as aes apropriadas.  Por exemplo, OpenDialogl.FileName conteria o nome
do arquivo escolhido.




A Caixa de Dilogo Color Choice

A Tabela 12.4 descreve as propriedades importantes utilizadas para essa
caixa de dilogo.

Tabela 12.4 Propriedades Importantes da Caixa de Dilogo Color Choice.

        Propriedade - Utilizao

        Color - Mostra ou pega a cor que foi escolhida pelo usurio.
        Options - Da mesma forma que com as caixas de dilogo FileSave e
File Open, essa propriedade  utilizada para estabelecer vrias opes
possveis referente  ao formato da caixa.

        As constantes simblicas para essa caixa de dilogo comea com
"cd". Por exemplo, ColorDialogl.Options : [cdFULLOPEN] apresentaria toda
a caixa de dilogo  (incluindo aquela para definir cores
personalizadas). Por exemplo, quando o usurio d um c longo para a cor
selecionada.

A Caixa de Dilogo Font Choice

        A Tabela 12.5 relaciona descries das propriedades
remanescentes importantes utilizadas para essa caixa de dilogo.

Tabela 12.5 Propriedades Importantes da Caixa de Dilogo Font Choice.

        Propriedade - Utilizao

        Font.Color - Utilizado apenas para impressoras coloridas.
        Style - Uma propriedade especificada. Se o indicador fdEFFECTS 
especificado, voc pode permitir ao usurio escolher essas propriedades.
        Font.Name - Especifica ou devolve o nome da fonte.
        Font.Size - Especifica ou devolve o tamanho da fonte.
        Options - Da mesma forma que com as caixas de dilogo File Save/
File Open, essa especifica o formato da caixa.

        Voc l novamente o valor das diversas propriedades de fontes
para ver o que o usurio deseja. Por exemplo, o valor de
FontDialogl.Font.Name  o nome da  fonte escolhida pelo usurio. Em
seguida, faa o Delphi executar o cdigo para que o valor no
        H 15 valores da propriedade Options diferentes para a caixa de
dilogo Font e todos comeam com fd. So uma propriedade arrolada
(especificada) disponvel  no Object Inspector ou voc pode
especific-los via cdigo. A propriedade Option controla  valor
fdAnsiOnly, o usurio no ser capaz de escolher quaisquer fontes de
smbolo. Como sempre, com uma propriedade especificada, ao utilizar
cdigo, voc as coloca  dentro de colchetes e faz sua separao com
vrgulas. Voc pode querer dar uma olhada na ajuda on-line para ver o
que os outros indicadores faro.

A Caixa de Dilogo Printer

A caixa de dilogo Printer fornece-lhe a caixa de dilogo Printer padro
do Windows. Como antes, a propriedade Options controla a aparncia da
caixa. As constantes  simblicas para a caixa de dilogo Printer comeam
todas com pr ou po. Por exemplo, se o parmetro PrintRange 
especificado em prALLPAGES, ento o boto de opo  All no painel Print
Range  especificado. Verifique a ajuda on-line para maiores detalhes
sobre as possveis opes que voc pode utilizar.
        A Tabela 12.6 relaciona descries das principais propriedades
utilizadas para essa caixas de dilogo.

Tabela 12.6 Propriedades Importantes da Caixa de Dilogo Printer.

        Propriedade - Utilizao

        Copies - Especifica ou devolve o nmero de cpias que o usurio
deseja que sejam feitas pela impressora.
        FromPage,ToPage - Define as pginas desejadas.
        MaxPage,MinPage - Especifica o nmero mximo e mnimo de pginas
que o usurio coloca no painel Print Range.

Formulrios MDI

MDI  a sigla para Multiple Documents Interface (interface de vrios
documentos), que  o termo da Microsoft para um ambiente de janelas como
muitos processadores  de textos e planilhas onde uma janela, normalmente
chamada de container MDI ou formulrio-pai MDI, contm muitas outras
janelas, normalmente chamadas de formulrio-filho.  Por exemplo, voc
pode utilizar um formulrio container MDI para permitir a um usurio
trabalhar com duas janelas diferentes no mesmo aplicativo. Voc pode ter
apenas  um formulrio de container MDI para um projeto e aquele
formulrio precisa, naturalmente, ser o inicial.
       Para fazer um formulrio container MDI, especifique a propriedade
FormStyle do formulrio que voc quer que seja o container MDI como
sendo fsMDIForm. Em  seguida, crie os formulrios adicionais
(normalmente tambm do menu File). Esses sero os for especificar a
propriedade FormStyle do formulrio = fsMDIChild. (Voc tambm pode
transformar um formulrio existente em um formulrio MDI filho pelo
ajuste dessa  propriedade.) Durante o projeto, os formulrios-filhos e o
formulrio MDI pai so parecidos -  difcil distinguir a diferena que
h entre eles. Por outro lado, quando voc processa o projeto, todos os
formulrios-filhos tm de ser mostrados explicitamente (com o mtodo
Visible) e so exibidos dentro dos  limites do formulrio MDI pai. Alm
do mais, se o formulrio filho  minimizado, seu cone aparece dentro do
formulrio MDI pai, e no na rea de trabalho do Windows.  (Se voc
maximiza um formulrio filho, se ttulo substitui o ttulo do formulrio
pai.) Finalmente, voc no pode nem esconder nem desativar os
formulrios-filhos  sem utilizar a API do Windows. Um dos recursos mais
agradveis dos formulrios MDI do Delphi  que os menus do modelo
container mudam de acordo com o formulrio-filho que tem o foco. Isso
lhe  permite trabalhar com menus especficos para cada formulrio-filho.
O que acontece  que o menu para o formulrio filho que tem o foco
aparece na barra de menu do  formulrio do container MDI  substituindo
o menu que se encontrava ali. Em particular, o usurio v o menu do
formulrio-filho somente quando aquele formulrio-filho  est ativo.

O Menu Window e o Mtodo Arrange

Todo aplicativo MDI deveria ter um menu Window que permite ao usurio
arranjar ou colocar em cascata as janelas-filhas - de maneira muito
parecida ao que faz o prprio  Windows. O menu Window tambm deveria
incluir uma lista das janelas MDI filhas. Isso  fcil de fazer. Vamos
supor que voc tenha um item de menu designado MyWindows em um
formulrio MDI. Em seguida para acrescentar a lista de janelas MDI
filhas  especifique

        Form.WindowMenu := MyWindows;

O Delphi exibir automaticamente a lista dos ttulos de formulrios MDI
filhas - e at coloca uma marca de escolha ao lado daquele que se
encontrava ativo mais recentemente.  Para ativar os itens Tile, Cascade
e Arrange no menu Windows, escreva um cdigo como este:

        procedure TFrame.Form.TileClick(Sender: Tobject);
        begin
          TileMode := tbHorizontal;
          Tile;
        end;

O exemplo utiliza o mtodo Tile e a propriedade TileMode. Os dois outros
mtodos de que voc vai precisar so Cascade e ArrangeIcons, que
descrevemos em seguida.

Cascade - O mtodo Cascade rearranja as janelas-filhas de modo que elas
se sobreponham de tal forma que apenas a barra de ttulo de cada janela
ser visvel. Arrangelcons - Quando voc tem vrias janelas-filhas
minimizadas, pode utilizar esse mtodo para rearranjar os cones para
que sejam igualmente espaados dentro  da janela-pai.

Mais sobre Como o Delphi Exibe um Trabalho: A Ordem-Z

Quando o Delphi pinta as partes de seu aplicativo, ele faz isso em trs
nveis. O nvel posterior (fundo)  onde voc coloca informaes
diretamente no formulrio  utilizando os mtodos grficos que voc viu
no Captulo 1 l. O nvel intermedirio contm os componentes grficos
(linhas, formas, caixas de pintura e o componente  imagem). O nvel
superior contm os componentes, no-grficos como botes, caixas de
lista, caixas de escolha e botes de opo. Determinados componentes
como rtulos,  tm uma propriedade transparente que permite s
informaes dos nveis inferiores serem vistas. Dentro de cada nvel,
voc pode controlar a ordem em que o componente aparece. Por exemplo, se
voc sobrepe dois componentes de imagem ou botes de comando, 
possvel  especificar qual dos dois fica por cima? Se voc utiliza um
formulrio MDI, voc pode controlar que formulrio filho est por cima
depois de utilizar o mtodo Arrange? Voc pode controlar a ordem em que
os componentes aparecem desta forma. Durante o projeto, voc pode
utilizar a opo Bring To Front e a opo Send To Back do menu  Edit
para afetar a ordem inicial do que est no topo. Para fazer sua
alterao dinamicamente durante o processamento do programa, voc
precisa do mtodo BringToFront  ou SendToBack. A sintaxe 
 
       componente.mtodo;

Lembre-se de que voc no pode colocar um componente no colocado em
forma de janela para a frente quando ele est embaixo de um componente
de janela.

Monitorando a Atividade do Mouse

O Windows, e portanto o Delphi, monitora constantemente o que o usurio
est fazendo com o mouse. At este ponto, tudo o que voc utilizou so
os eventos OnClick  e OnDblClick. Esses detectam se o usurio deu um ou
dois cliques com o mouse em um formulrio ou componente. Esta seo
mostra como obter e utilizar informaes  mais sutis. Um boto do mouse
foi pressionado? Qual foi o boto? O ponteiro do mouse est sobre um
componente? O usurio soltou um boto, e nesse caso, qual? O usurio
moveu o mouse de um formulrio para outro? Exatamente onde dentro do
formulrio est o mouse? O Delphi pode detectar todos esses eventos.
Evidentemente, como com  todas as operaes Delphi, voc tem de escrever
os manipuladores de eventos que determinam como o Delphi responder ao
evento. Por exemplo, se voc quer fazer aparecer  um menu depois do
clique do boto direito do mouse, ter de escrever as linhas de cdigo
necessrias. Finalmente, da mesma forma que o projeto de um aplicativo
Delphi envolve o ato de arrastar componentes em um formulrio vazio, o
Delphi permite-lhe escrever aplicativos  que permitem ao usurio mover
componentes arrastando e soltando. Voc tambm vai ver como fazer isso.

Os Manipuladores de Evento do Mouse

H trs manipuladores de evento do mouse fundamentais:

        Manipulador de Eventos - Evento que o Provocou

        OnMouseDown - O usurio d um clique em dos botes do mouse.
        OnMouseUp - O usurio move o ponteiro do mouse. 

De muitas formas, esses procedimentos so anlogos aos manipuladores de
evento-chave, um exemplo dos quais voc viu no Captulo 5. Por exemplo,
como com aqueles  manipuladores de eventos, o Delphi permite-lhe
utilizar um parmetro ShiftState para determinar se o usurio estava
mantendo as teclas SHIFT, ALT ou CTRL pressionadas  ao mesmo tempo em
que ele estava pressionando ou soltando o boto do mouse. Os componentes
reconhecem um evento do mouse apenas quando o ponteiro do mouse est
dentro do componente; o formulrio subjacente reconhece o evento do
mouse em  todos os outros casos. Entretanto, se um boto do mouse 
pressionado e mantido enquanto o ponteiro do mouse est dentro de um
componente ou formulrio, aquele objeto  captura o mouse. Isso significa
que nenhum outro objeto do Delphi pode reagir a eventos do mouse at o
usurio soltar o boto do mouse, independentemente de para  onde o
usurio movimenta o mouse. Todos os manipuladores de evento do mouse
tomam o mesmo formato e utilizam os mesmos parmetros:

TForml.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift:
TShiftState: X,Y: Integer);

Conforme mostrado pela prxima seo, voc analisa o argumento Button
para determinar que boto do mouse foi pressionado. Igualmente, voc
pode descobrir se o usurio  estava pressionando qualquer combinao com
a tecla SHIFT, CTRL ou ALT pela anlise do parmetro Shift. Finalmente,
X e Y fornecendo-lhe a informao de que voc  precisa para determinar a
posio do ponteiro do mouse, utilizando as coordenadas internas do
objeto, se existirem (formulrios e caixas de figuras).

Os Eventos OnMouseUp/OnMouseDown

Para ver em operao o manipulador de eventos dado nesta seo, inicie
um projeto novo. V at o Object Inspector e ative a pgina Events. D
um clique duplo para  abrir a janela Code Editor para o manipulador de
eventos OnMouseDown. Agora digite o seguinte:

        procedure TForm1.FormMouseDown(Sender: TObject; Button:
TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        begin
        Canvas.Ellipse(X-50, Y-50, X+50, Y+50);
        end;

Esse manipulador de eventos simples utiliza a informao de
posicionamento passada por X e Y. Cada vez que voc d um clique no
boto do mouse, um pequeno crculo   centralizado exatamente onde voc
deu um clique. Caso acrescente um manipulador de eventos OnMouseUp que
se parece com

 Procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
         Shift: TShiftState; X, Y: Integer);
       begin
         with Canvas do
         begin Brush.Style := bsSolid; (NOTA: esta mudana persistira!}
            Brush.Color := clRed; (esta mudana tambm persistira}
            Ellipse(X-50, Y-50, X+50, Y+50);
         end;
       end;

ento todas as vezes em que voc solta o mesmo boto, o Delphi preenche
o crculo de vermelho. E, depois, quando voc move o mouse at mesmo
imperceptivelmente,  ter um novo crculo. Por outro lado, mesmo que
voc possa Ter dois ou at mesmo trs botes de mouse, o Delphi no
gerar um outro evento OnMouseDown at voc soltar  o boto de mouse
original. Isso evita que voc faa alguns crculos preenchidos e outros
vazios ao utilizar esses dois procedimentos. Suponha, porm, que voc
queria fazer alguns crculos preenchidos e alguns vazios. Uma maneira
para fazer isso  utilizar a informao adicional dada pelo argumento
Button. Por exemplo, vamos supor que o usurio tenha um mouse de dois
botes. Voc pode escrever facilmente um cdigo de tal forma que se o
usurio pressionar o  boto direito do mouse, ele consegue um crculo
preenchido, e, caso contrrio, tudo o que ele consegue  o contorno de
um crculo colorido. O argumento Button tem  trs constantes
predefinidas para determinar qual o boto que foi pressionado: mbLeft,
mbRight e mbCenter. Voc pode reescrever o manipulador de eventos
OnMouseUp  para permitir tanto crculos preenchidos como vazios
utilizando os botes esquerdo/direito como segue:
 
       procedure TForm1.FormMouseUp(Sender: TObject; Button:
TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        begin
          with Canvas do
          begin
             Brush.Style := bsSolid;
             case Button of
               mbRight:
               Brush.Color := clRed;
               m b Left:
               Brush.Color := clWhite;
             end;
             Ellipse(X-50, Y-50, X+50, Y+50);
          end;
        end;

Como outro exemplo, se voc quer um menu suspenso em resposta a um
clique do boto direito do mouse, utilize uma linha de cdigo como a
seguinte:

        if Button = mbRight then PopUpMenu := MenuName;

Voc tambm pode deixar o usurio combinar o teclado com o mouse. Por
exemplo, voc pode fazer com que uma combinao SHIFT+boto direito do
mouse apresente um determinado  menu. Para fazer isso, analise o
argumento ShiftState no manipulador de eventos do movimento do mouse. Os
valores possveis para esse conjunto so descritos na Tabela  12.7.

Tabela 12.7 Valores e Aes dos Parmetros ShiftState.

        Valor do Tipo ShiftState - O que Ele faz 

ssShift - A tecla SHIFT foi pressionada com o boto do mouse. ssAlt - A
tecla ALT foi pressionada com o boto do mouse. ssCtrl - A tecla CTRL
foi pressionada com o boto do mouse. ssRight - O boto direito do mouse
foi pressionado. ssLeft - O boto esquerdo do mouse foi pressionado.
ssMiddle - O boto de meio do mouse foi pressionado (normalmente precisa
de um mouse com trs botes, mas pressionar os dois botes do mouse em
um mouse de dois-botes  normalmente provoca isto). ssDouble - Os dois
botes do mouse foram pressionados.

NOTA: Os programas Microsoft Windows (por exemplo, o prprio Delphi!)
comearam a adotar a conveno de que pressionar o boto direito do
mouse apresenta um menu  sensvel ao contexto.

O Evento OnMouseMove

O Delphi chama o manipulador de eventos OnMouseMove sempre que o usurio
move o mouse. Voc no deve adquirir o hbito de pensar que o evento
OnMouseMove  gerado  continuamente  medida que o ponteiro do mouse se
move atravs de um objeto. De fato, uma combinao do software e do
hardware do usurio determina com que freqncia  o evento OnMouseMove 
gerado. Apesar disso, uma vez que o manipulador de eventos OnMouseMove
ser chamado com relativa freqncia, qualquer cdigo dentro desse
manipulador de eventos ser executado  com freqncia. Por esse motivo,
voc vai querer apertar o cdigo dentro do manipulador de eventos
OnMouseMove o mais possvel ou prover um indicador para evitar  um
processamento repetitivo. Por exemplo, utilize variveis inteiras para
contadores e no compute novamente o valor das variveis dentro desse
evento a no ser  que o valor novo dependa dos parmetros do evento.
Lembre-se sempre de que acessar propriedades de objetos  muito mais
lento do que utilizar uma varivel.

Operaes de Arrastar e Soltar

Para mover um componente  medida que voc est projetando a interface
em seu projeto Delphi, voc mantm pressionado o boto do mouse (o
esquerdo) e depois movimenta  o ponteiro do mouse para onde voc quer
que o componente seja colocado. Um contorno do componente se move com o
ponteiro do mouse. Quando voc est satisfeito com  a posio, solta o
boto do mouse. A documentao do Microsoft Windows chama a movimentao
de um objeto com o boto do mouse pressionado de arrastar, e chama o
que acontece quando voc termina de arrastar ao soltar o boto do mouse
de soltar. O Delphi facilita a programao desse potencial em seus
projetos. Voc pode at  mesmo arrastar e soltar de um formulrio para
outro se o seu projeto utiliza vrios deles. Os componentes permitem
dois tipos de arrastamento: manual e automtico. Esses correspondem a
dois valores diferentes da propriedade DragMode. O padro  no permitir
que voc arraste componentes por a, exceto em circunstncias especiais.
(Como sempre, voc ter de escrever o cdigo para estas circunstncias
especiais; veja a  prxima seo.) Isso  chamado de arrastar
manualmente, e a propriedade DragMode ter o valor dmManual. Mudar o
valor dessa propriedade para dmAutomatic significa  que o usurio pode
arrastar o componente pelo projeto. Independentemente da especificao
para a propriedade DragMode, o componente vai se mover realmente apenas
se voc escrever o cdigo utilizando o mtodo Move para fazer sua
reposio, conforme mostrado no prximo exemplo. Para este exemplo,
comece um projeto novo e acrescente um nico boto a ele. Especifique a
propriedade DragMode daquele boto em dmAutomatic. O evento que
reconhece  as operaes de arrastar e soltar  chamado de evento
OnDragDrop, e est associado com o componente ou formulrio onde a
"soltura" ocorre. Assim, se voc quer arrastar  um componente para uma
posio nova no formulrio, voc escreve um cdigo para o manipulador de
eventos OnDragDrop do formulrio. Por exemplo, para permitir que  o ato
de arrastar e soltar mova o boto pelo formulrio neste exemplo, utilize
o seguinte:

        procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y:
Integer);
        begin
          Button1.Left := X;
          Button1.Top := Y;
        end;

Uma vez que o tipo do parmetro Source  um componente, voc pode se
referir s suas propriedades e mtodos utilizando a notao de ponto,
como no exemplo precedente.  Se voc precisa de mais informaes a
respeito do tipo de componente que est sendo arrastado antes de aplicar
um mtodo ou especificar uma propriedade, utilize  o nome do componente
Source em uma declarao "if TipoDeComponente is then". (Voc viu isso
no Captulo 6.) Se voc processar este exemplo, ver que o objeto
permanece visvel em sua posio original enquanto o ponteiro de
arrastamento do mouse se move. Voc no pode utilizar  o evento
OnDragDrop para tornar um componente invisvel enquanto a operao de
arrastar/soltar est ocorrendo. Isso acontece porque esse manipulador de
eventos   chamado apenas depois que o usurio solta o objeto. De fato,
o evento OnDragDrop nem sequer precisa mover o componente.
Freqentemente voc utiliza esse evento apenas  para permitir ao usurio
que inicie alguma ao. Isso  comum especialmente ao arrastar de um
formulrio para outro.
       Se voc se cansar do ponteiro de arrastamento do mouse utilizado
pelo Delphi durante uma operao de arrastar, voc pode mud-lo. A
maneira mais fcil para  fazer isso  especificar a propriedade
DragCursor do componente durante o projeto. Para faz escolha uma
configurao. A outra possibilidade  criar seu prprio cursor
personalizado. Se voc projeta um cone personalizado, uma prtica comum
 inverter as  cores do cone de arrastamento.

A Tabela 12.8 resume os eventos e as propriedades utilizadas para
arrastar e soltar.

Tabela 12.8 Eventos, Mtodos e Propriedades Utilizadas para Arrastar e
Soltar.

        Item - Descrio

Propriedade DragMode - Permite um arrastamento automtico (valor =
dmAutomatic) ou manual (valor = dmManual). Propriedade DragCursor -
Especifique essa para mudar o ponteiro do mouse para um cone
configurado ao arrastar. evento OnDragDrop - Associado com o alvo da
operao; gerado quando o componente de fonte  solto no componente
alvo. evento OnDragOver - Associado com qualquer componente sobre o qual
passa o componente de fonte durante o arrastamento. mtodo BeginDrag -
Comea a arrastar quando DragMode  colocado em manual. mtodo EndDrag -
Interrompe o arrastamento quando DrasgMode  colocado em manual.

Arrastar e Soltar Manualmente

Se voc deixou o valor da propriedade DragMode em seu valor padro de
dmManual, ento ter que utilizar o mtodo BeginDrag/EndDrag para
permitir que o componente  seja arrastado. A sintaxe para esse mtodo 

       componente. BeginDrag(Imediato);

Imediato  um valor booleano True ou False, conforme descrito aqui:

       componente.BeginDrag(True); O arrastar comea imediatamente.
       componente.BeginDrag(False); O arrastar comea depois que o mouse
se mover cinco pixels.5

Uma maneira de utilizar a flexibilidade fornecida por esse mtodo 
permitir que usurios experientes arrastem e soltem componentes mas
estabelea como padro no  deixar os usurios fazerem isto. Por
exemplo, pressione simultaneamente a tecla CTRL com o boto do mouse
para permitir que o arrastamento ocorra. Voc pode fazer  isso iniciando
o manipulador de eventos OnMouseDown com o seguinte:
 
       procedure TForml.Button1 MouseDown(Sender: TObject; Button:
TMousdeButton;
          Shift: TShiftState; X, Y: Integer);
        begin
          if Shift = ssCtrl then
              Button1.BeginDrag(True);
        end;

Um outro exemplo de onde voc talvez queira utilizar esse mtodo  nos
programas de demonstrao autoprocessados. Voc pode utilizar o mtodo
BeginDrag para iniciar  a operao de arrastamento e o mtodo EndDrag
para soltar o componente. Isso lhe permite demonstrar as operaes de
arrastar e soltar.

NOTA: Se voc coloca a propriedade DragMode em dmAutomatic, ento o
usurio pode arrastar componentes sem que voc precise escrever qualquer
cdigo para permitir  isso.

O Evento OnDragOver

Todos os objetos Delphi, exceto os menus e os temporizadores, detectaro
se um componente est passando sobre eles. Voc pode utilizar o evento
OnDragOver para permitir  uma flexibilidade ainda maior para seus
projetos. Esse evento permite-lhe monitorar o caminho tomado por um
componente enquanto est sendo arrastado. Voc pode considerar  a
mudana na cor do segundo plano do componente sobre o qual voc est
passando.

O modelo de manipulador de eventos para formulrios 

       procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y:
Integer;
         State: TDragState; var Accept: Boolean);
       begin

       end;

Para componentes, este modelo de manipulador de eventos toma a forma de

        procedure TForm1.Button1.DragOver(Sender, Source: TObject; X, Y:
Integer;
          State: TDragState; varAccept: Boolean);
        begin

        end;

Source  o componente que est sendo arrastado, mas o manipulador de
eventos est associado com o componente sobre o qual assamos. Os
parmetros X e Y fornecem  a voc os valores Left e Top onde o
componente que est sendo arrastado atualmente est localizado. Isso 
dado em termos de escala do objeto sobre o qual voc passa  para os
formulrios e o formulrio subjacente para todos os outros componentes.
O parmetro State tem trs valores possveis:

Valor do Parmetro State - Descrio

        dsDragEnter - Agora a fonte est dentro do alvo.
        dsDragLeave - A fonte est logo  esquerda do alvo.
        dsDragMove - A fonte foi movida para dentro do alvo.

Sistemas de Ajuda

Um aplicativo Windows profissional precisa de um sistema de ajuda que
faz o que os usurios de Windows esperam. Se a sua ajuda on-line no tem
a aparncia de um  sistema de ajuda Windows, os usurios tero muito
para aprender (e voc provavelmente ter que trabalhar muito para
ensin-los). O Delphi  fornecido com o compilador  Windows Help para
possibilitar a criao de um sistema de ajuda para seus aplicativos.
Falando grosseiramente, a maneira como voc utiliza o compilador Help 
simples: voc escreve um arquivo de texto contendo certos cdigos de
formatao que o compilador  Help traduz em pulos, definies e assim
por diante. O arquivo de texto tem de ser escrito com um processador de
textos que suporta aquilo que a Microsoft chama  de RTF (formato de
texto rico). Muitos processadores de recursos completos suportam este
formato. Evidentemente que voc se sai melhor utilizando um processador
de textos Windows ao preparar os arquivos de texto para alimentar o
compilador Help. Dessa forma, voc pode trabalhar com o compilador Help
em uma janela e o processador  de textos na outra. Entretanto, ns no
recomendamos esse procedimento. (Se voc insistir, a ajuda on-line do
Delphi tem uma discusso das tcnicas necessrias.) Isso ocorre porque
 muito mais fcil criar um sistemas de ajuda utilizando uma das
diversas ferramentas fornecidas por terceiros - ns garantimos que voc
vai achar que o seu dinheiro  foi bem gasto.

DICA: As nossas ferramentas comerciais favoritas para construir sistemas
de ajuda so RoboHelp da Blue Sky e Doc-to-Help da WexTech. A Borland
tambm vende um produto  muito bom chamado de ForeHelp. H ainda algumas
ferramentas (WHAT, "Windows Help Authoring Templates," e WHPE, "Windows
Help Project Editor") no CD-ROM Microsoft  Software Developers que podem
facilitar a escrita de arquivos de ajuda. (Verifique em WinHelp Lib do
forum WINDSK na CompuServe a existncia de ferramentas adicionais.)

Em qualquer caso, um sistema de ajuda tambm deveria incluir o menu
padro com que os usurios esto acostumados. O menu Help deveria com
certeza ter os itens Sumrio,  Procura e Sobre. O item Procura deveria
trazer a lista de palavras-chave em que o usurio pode procurar. Essas
palavras-chave sero conectadas aos tpicos que voc  escreve. Vrias
partes de seu aplicativo (como o prprio Delphi) deveriam ter uma ajuda
sensvel ao texto. Dessa forma, todos os usurios sabem que se
pressionarem  F1 conseguiro ajuda a respeito de um determinado item em
um formulrio. Voc utiliza a propriedade HelpFile do objeto Application
para associar um arquivo Help (compilado) ao seu aplicativo. Voc cria
uma ajuda sensvel ao texto especificando  HelpContext do formulrio ou
componente. Assim que voc atribuir o valor da propriedade HelpContext,
ter que informar ao compilador Help como mapear a propriedade
HelpContext a determinados tpicos. O arquivo de projeto Help contm a
informao necessria ao compilador Help para fazer esse trabalho. O
arquivo de projeto Help tem que ser um arquivo ASCII comum.  Normalmente
se utiliza .HPJ como extenso em todos os arquivos de projeto Help. O
compilador Help muda isso para .HLP para a verso compilada. O arquivo
de projeto  Help relaciona todos os arquivos de tpicos e pode
opcionalmente acrescentar mapas de bits ou um mapa entre strings de
contexto e nmeros de contexto. Voc tambm  pode atribuir duas strings
de contexto ao mesmo tpico modificando o arquivo de projeto. Para
mapear os nmeros de contexto Help a determinados tpicos para uma ajuda
sensvel ao contexto, coloque o tpico depois da palavra-chave [MAP],
seguido por um  espao em branco (pressione BARRA DE ESPAO ou TAB),
seguido pelos nmeros de contexto Help. A seguir h um exemplo do que
voc pode ter na seo [MAP] do arquivo  de projeto Help se voc est
fazendo isso manualmente em vez de utilizar uma das ferramentas de
terceiros.

        [MAP]
        primeiro_string_de_contexto 5 ;5  nmero de contexto
                                          ;Comentrios seguem
ponto-e-vrgula
        segundo_string_de_contexto 10 ;10  nmero de contexto
        terceiro_string_de_contexto 15 ;15  nmero de contexto

A questo  que o nmero de contexto  passado pelo programa Delphi como
o valor da propriedade HelpContext.
