Está o mouse sobre um componente? Foi pressionado algum botão do mouse? Qual botão foi? Será que o usuário liberou um botão? Qual botão? Exatamente onde no interior do formulário está o mouse? Será que o usuário moveu o mouse para fora da formulário ou para outro formulário?

O Delphi (como o Windows) monitora constantemente o que o usuário está fazendo com o mouse. Naturalmente, o Delphi pode detectar qualquer ação do mouse. Quando uma aplicação Delphi detecta uma ação do mouse, o que ele faz é chamar um manipulador de eventos definido para o evento correspondente.

Respondendo ao mouse


Existem quatro tipos de ações do mouse que você pode responder em suas aplicações. Três destas são exclusivamente ações do mouse: onmousedown, OnMouseMove e OnMouseUp. O quarto tipo de ação, é um pouco diferente, pois também pode ser gerado por alguns tipos de teclas (como por exemplo pressionar Enter em uma caixa de diálogo modal).

Os componentes reconhecem um evento do mouse quando o ponteiro do mouse está dentro do componente. No entanto, se um botão do mouse é pressionado e mantido enquanto o ponteiro do mouse está dentro de um componente ou formulário, o objeto captura o mouse. Isso significa que nenhum objeto Delphi pode reagir a eventos do mouse até que o usuário libere o botão do mouse, independentemente de onde o usuário mova o mouse.

Existem três eventos do mouse que são fundamentais: OnMouseDown, OnMouseMove e OnMouseUp. O MouseUp e o MouseDown têm os mesmos cinco parâmetros (o MouseMove não tem um parâmetro Button):

  1. Sender - O objeto que envia a ação do mouse.
  2. Button - Indica qual botão do mouse foi envolvido: mbLeft (esquerdo), mbMiddle (meio), ou mbRight (direito).
  3. Shift - Indica o estado da tecla Alt, Ctrl e Shift eo estado dos botões do mouse quando o evento ocorreu.
  4. X – Indica a coordenada X do pixel do ponteiro do mouse na área de cliente do remetente.
  5. Y – Indica a coordenada Y do pixel do ponteiro do mouse na área de cliente do remetente.


OnMouseDown / OnMouseUp

Sempre que o usuário pressiona um botão do mouse, um evento OnMouseDown vai para o objeto que o ponteiro está sobre. Para ver o manipulador de eventos no local de trabalho, devemos atribuir o seguinte código ao procedimento OnMouseDown:

	
procedure TForm1.FormMouseDown(Sender: TObject;
    Button: TMouseButton; Shift: TShiftState;
    X, Y: Integer);
begin
  Canvas.Ellipse(x-20, y-20, x+20, y+20);
end;
Quando o aplicativo é executado, você pode pressionar o botão do mouse com o cursor do mouse sobre o formulário e verá um círculo aparecer no ponto clicado. Este evento simples usa o X e Y como parâmetros enviados para o método, e chama o método Ellipse da tela para exibir o círculo.

Vamos incrementar um pouco este código. Suponha que nós queremos desenhar retângulos vermelhos quando o usuário pressionar o botão esquerdo do mouse, retângulos azuis quando o botão direito for pressionado e círculos amarelos quando o botão do meio for selecionado. O argumento Button tem três constantes predefinidas para determinar qual botão foi pressionado: mbLeft, mbRight, mbMiddle:

	
procedure TForm1.FormMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
begin
 case Button of
  mbLeft:
  begin
   Canvas.Brush.Color := clRed;
   Canvas.Rectangle(x-20,y-20,x+20,y+20);
  end;
  mbRight:
  begin
   Canvas.Brush.Color := clBlue;
   Canvas.Rectangle(x-20,y-20,x+20,y+20);
  end;
  mbMiddle:
  begin
   Canvas.Brush.Color := clYellow;
   Canvas.Ellipse(x-20,y-20,x+20,y+20);
  end;
end;
Nota: Quanto ao evento OnMouseUp: use o manipulador de eventos para implementar um processamento especial quando o usuário libera o botão do mouse.

OnMouseMove

O evento OnMouseMove ocorre quando o usuário move o ponteiro do mouse enquanto este está sobre um controle. Sabendo que o manipulador de eventos OnMouseMove será chamado com relativa frequência, qualquer código dentro desse manipulador de evento será executado normalmente.

Como sabemos, podemos combinar o teclado com o mouse. Por exemplo, podemos ter a combinação tecla Shift do teclado com o movimento do mouse e desenhar um círculo. Vamos ver OnMouseMove em ação (projeto novo / novo formulário):


procedure TForm1.FormMouseMove(Sender: TObject;
    Shift: TShiftState; X,Y: Integer);
begin
   if ssShift in Shift then
    Canvas.Ellipse(x-20,y-20,x+20,y+20)
   else if ssCtrl in Shift then
    Canvas.Rectangle(x-20,y-20,x+20,y+20);
end;
Com esse código, desenhamos círculos no formulário se a tecla shift estiver pressionada e desenhamos retângulos se a tecla Ctrl estiver pressionada.

Agora, use e abuse dos eventos do mouse em suas aplicações.

Um grande abraço e até o próximo artigo!

Rafael Marins Ribeiro
Engenheiro de Softwares
rafael.marins.ribeiro@gmail.com