Criando Componentes com Eventos Programados – Parte I

Contexto Geral

Na Internet encontramos diversos artigos (muito bacanas, diga-se de passagem) que mostram como mover um componente em Run-Time, usando os Eventos OnMouseMove, OnMouseDown e OnMouseUp.

Neste Artigo (“Criando Componentes com Eventos Programados”), vamos criar nosso próprio componente que já possuíram tais funcionalidades, ou seja, o nosso componente já virá com os eventos (citados acima) programados. Portanto, quando instalarmos não precisará construir nenhuma linha de código para que ele tenha tal comportamento.

Para esse artigo será utilizado CodeGear RAD Studio 2007 – Delphi Win32, mais funcionaria em qualquer versão do Delphi, com diferença apenas na Instalação.

“Bom, acho que é hora de pôr a mão na massa”.

Vamos começar fazendo o modelo antigo...

(Se você quiser “Dinamizar” algo, deve conhecer primeiro o seu funcionamento “Burocrático”.)

 

                O que faríamos se largássemos um componente na tela e quiséssemos atribuir tais funcionalidades? Veja como é fácil.

 

 

Temos um Formulário com um Label (THYAGO THOMPSON) sendo executado e sabemos que em modo de projeto, podemos posicionar esse Label em qualquer lugar a nossa escolha dentro do repositório que o mesmo está contido (Form, Panel, GroupBox, etc).

Imagine fazer isso com a aplicação em funcionamento. Por padrão isso não pode ser feito, a não ser que antes de gerar nosso executável, programemos tais funcionalidades no nosso componente.

 

Então, é a nossa hora...

 

Vamos criar um novo Projeto Win32 (File > New > VCL Forms Application – Delphi for Win32), como mostra a figura abaixo.

 


 

Largue dentro do formulário, 02 Componentes Label (Tool Palette Standard) e chame-os de lblDinamico e lblEstatico respectivamente. Como mostra a figura abaixo.

 

 

 

Selecione o 1º Label (lblDinamico), e programe os eventos OnMouseMove, OnMouseUp e OnMouseDown da seguinte forma:

 

var

  Form1: TForm1;

 

  MouseDownSpot: TPoint;  {Variável usada para armazenar a posição atual do Componente (X (Left) e Y (Top)}

  Capturar: boolean; {Variável que indica quando mover o componente}

 

{O evento OnMouseDown ocorre quando clicamos e mantemos o botão do Mouse pressionado}

procedure TForm1.lblDinamicoMouseDown(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Integer);

begin

  Capturar := true; //ou seja, pode mover o Componente

  MouseDownSpot.X := X; //Posição X atual (Left)

  MouseDownSpot.Y := Y; //Posição Y atual (Top)

end;

 

{O evento OnMouseMove ocorre quando com botão do Mouse pressionado, o movemos para alguma direção}

procedure TForm1.lblDinamicoMouseMove(Sender: TObject; Shift: TShiftState; X,

  Y: Integer);

begin

  if Capturar then begin //Se a ordem for “Pode Mover” então

      lblDinamico.Left := lblDinamico.Left - (MouseDownSpot.x-x); //Calculamos a nova posição do X (Left)

      lblDinamico.Top  := lblDinamico.Top - (MouseDownSpot.y-y); //Calculamos a nova posição do Y (Top)

  end;

end;

Entenda o que está sendo feito nas linhas abaixo:

 lblDinamico.Left := lblDinamico.Left - (MouseDownSpot.x-x);

                 lblDinamico.Top  := lblDinamico.Top - (MouseDownSpot.y-y);

    

                Estamos atribuindo ao Left do nosso componente o seu próprio valor menos a diferença entre a posição atual (armazenada pelo OnMouseDown em MouseDownSpot.X e MouseDownSpot.Y) e a nova posição (armazenada no X e Y que são as coordenadas do próprio evento OnMouseMove). “X” para Left e “Y” para Top.

 

{O evento OnMouseUp ocorre quando soltamos o botão do Mouse que estava pressionado}

procedure TForm1.lblDinamicoMouseUp(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Integer);

begin

  ReleaseCapture; //Libera a Thread de captura da posição do mouse

  Capturar := false; //não pode mover o Componente

  lblDinamico.Left := lblDinamico.Left - (MouseDownSpot.x -x);

  lblDinamico.Top  := lblDinamico.Top  - (MouseDownSpot.y - y);

end;

 

Pronto! Execute o programa e veja que o componente lblDinamico pode ser movido em Run-Time, mais o lblEstatico não. Para que o lblEstatico tenha as mesmas funcionalidades, teremos que programar seus eventos também.

 Sendo assim, se tivermos 1, 2, 5, 10, 30, 100 componentes que desejamos que tivessem tais funcionalidades, teremos que programar da mesma forma todos eles.

Há os que prefiram usar (e correr os riscos do) Copiar e Colar e modificar o código pra cada um deles. Nós vamos fazer muito melhor. Vamos Construir um Componente que já faz isso automaticamente.

Um Forte Abraço e nos vemos na 2ª Parte deste Artigo...


            E-mail: thyago.delphi@gmail.com