unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfrmMovingControls = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    ListBox1: TListBox;
    chkSetMovable: TCheckBox;
    procedure chkSetMovableClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMovingControls: TfrmMovingControls;

implementation

{$R *.dfm}

procedure MakeMovable(Handle: HWND);
var
  style: LongInt;
  flags: UINT;
begin
  //Разрешаем перемещение элемента управления
  style := GetWindowLong(Handle, GWL_STYLE);
  style := style or WS_OVERLAPPED or WS_THICKFRAME or WS_CAPTION;
  SetWindowLong(Handle, GWL_STYLE, style);

  style := GetWindowLong(Handle, GWL_EXSTYLE);
  style := style or WS_EX_TOOLWINDOW;
  SetWindowLong(Handle, GWL_EXSTYLE, style);

  //Перерисуем в новом состоянии
  flags := SWP_NOMOVE or SWP_NOSIZE or SWP_DRAWFRAME or SWP_NOZORDER;
  SetWindowPos(Handle,HWND_TOP, 0, 0, 0, 0, flags);
end;

procedure MakeUnmovable(Handle: HWND);
var
  style: LongInt;
  flags: UINT;
begin
  //Запрещаем перемещение элемента управления
  style := GetWindowLong(Handle, GWL_STYLE);
  style := style and not WS_OVERLAPPED and not WS_THICKFRAME
   and not WS_CAPTION;
  SetWindowLong(Handle, GWL_STYLE, style);

  style := GetWindowLong(Handle, GWL_EXSTYLE);
  style := style and not WS_EX_TOOLWINDOW;
  SetWindowLong(Handle, GWL_EXSTYLE, style);

  //Перерисуем в новом состоянии
  flags := SWP_NOMOVE or SWP_NOSIZE or SWP_DRAWFRAME or SWP_NOZORDER;
  SetWindowPos(Handle,HWND_TOP, 0, 0, 0, 0, flags);
end;


procedure TfrmMovingControls.chkSetMovableClick(Sender: TObject);
begin
  if chkSetMovable.Checked then
  begin
    //Разрешаем перемещение элементов управления
    MakeMovable(Memo1.Handle);
    MakeMovable(ListBox1.Handle);
    MakeMovable(Button1.Handle);
  end
  else
  begin
    //Запрещаем перемещение элементов управления
    MakeUnmovable(Memo1.Handle);
    MakeUnmovable(ListBox1.Handle);
    MakeUnmovable(Button1.Handle);
  end;
end;

end.
