Já existe uma forma, muito divulgada, de se movimentar um form utilizando a mensagem WM_Chittest, só que se vc tiver eventos para um objeto que não tem handle, todos os eventos deste objeto serão desprezados.

Nesta dica , qualquer objeto que tenha os eventos UP, DOWN e MOVE do mouse, será capaz de movimentar o form, não deixando de executar nenhum evento pré-definido.

No exemplo abaixo foi utilizado o componente TLabel:

Listagem 1: Declaração de variável e método

private
{ Private declarations }
MoveForm : Boolean;
public
{ Public declarations }
procedure Movimenta(sender : tObject);

Listagem 2: Método Movimenta

procedure TForm1.Movimenta(sender: tObject);
const
  SC_MOVE = $F012;
begin
  ReleaseCapture;
  (sender as TWinControl).Perform(wm_syscommand,sc_move,0);
end;

Listagem 3: Evento OnMouseDown do label

procedure TForm1.label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
  MoveForm := True;
end;

Listagem 4: Evento OnMouseUp do label

procedure TForm1.label1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
  MoveForm := False;
end;

Listagem 5: Evento OnMouseMove do label

procedure TForm1.label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
  if MoveForm = True then
    Movimenta(self);
end;

Ulisses Brügger
ubrugger@dba.com.br