Como arrastar um componente em Run Time no Delphi - VCL

Delphi

06/09/2023

tenho esse código que move um componente em Run Time, acredito que ainda possa passar por modificações e melhorias, mas tenho essa explicação até o momento:


procedure TForm1.(SEUCOMPONENTE)MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   ReleaseCapture;
  { Abaixo o código onde move o componente}
  PostMessage(SEUCOMPONENTE.Handle, WM_SYSCOMMAND, $F012, 0);
end;



• ReleaseCapture • : Esta função libera a captura do mouse. ela permite que outros controles e elementos da interface do usuário possam receber eventos do mouse após esta chamada. Essa função é frequentemente usada em conjunto com operações de arrastar e soltar (drag-and-drop) para o controle do mouse quando você soltar um objeto que estava sendo arrastado.


• PostMessage • : Esta função é usada para postar uma mensagem na fila de mensagens do sistema operacional do Windows. A mensagem sendo postada é ''WM_SYSCOMMAND'' com o parâmetro ''$F012''.''WM_SYSCOMMAND'', é uma mensagem do Windows usada para enviar comandos para uma janela e ''$F012'' é um valor específico que representa o comando para mover uma janela. Quando a mensagem ''WM_SYSCOMMAND'' com o comando ''$F012'' é enviada para o identificador de janela (''Handle'') do componente que você passar, o sistema operacional entende isso como uma instrução para mover a janela representada pelo componente que você passa (no meu caso no on mouseDown). O sistema operacional então começa a tratar o movimento da janela, permitindo arrastar o componente pelo formulário.



Considerações: Fiz algumas pesquisas e essa foi a forma que encontrei para mover um componente em Run Time na VCL, diferentemente do FMX, caso alguém souber uma forma mais simples, agradeço se compartilhar a informação.

Melhorias: acredito que de para melhorar a questão de que se você arrasta o componente para fora da tela, ele mão sai completamente, fica só uma pequena borda dela para ser arrastada novamente para dentro, mas acredito que de para limitar as bordas de seu componente para que isso não seja possível.
Guilherme Lima

Guilherme Lima

Curtidas 0

Melhor post

Arthur Heinrich

Arthur Heinrich

06/09/2023

Como você já percebeu, arrastar depende dos eventos MouseDown, MouseUp e MouseMove. O comportamento padrão, destes eventos, é funcionar apenas quando o mouse está diretamente sobre a janela da aplicação. Por isso, quando o mouse sai da janela, ele para de mover o objeto.

No seu evento MouseDown, se você substituir o ReleaseCapture, por Capture, irá instruir o Windows a, mesmo que o mouse saia da janela, os eventos de MouseMove continuem sendo enviados para a janela da aplicação e você continuará movendo os objetos.

Sempre que chamar o evento Capture, precisará liberar esta captura em algum momento, para que a interação com outras aplicações volte a funcionar normalmente. Um bom momento para isso é o evento MouseUp, quando termina o processo de arrastar.
GOSTEI 1
POSTAR