−トップへ−

コンポーネントをマウスで移動させる

 フォームに配置したコンポーネントは,そのままではマウスで移動させることはできませんが,以下の方法で移動させることができるようになります。
 ここではPanlコンポーネントを使っていますが,Imageコンポ−ネントなど,mousedown,mousemoveなどのイベントハンドラを備えているコンポーネントなら,動かすことができます。
 (私の自作ソフトの「箱入り娘」はそれぞれのピースを Panelコンポーネントで作ってあります。)
 まず,フォームにpanelコンポーネントを配置します。そして,
   MouseDown
   MouseMove
   MouseUp
 の,3つのイベントハンドラを作成します。
 そして,以下のようにコードを記述します。

 private
  { Private 宣言 }
  panelx,panely:integer; //マウスが押されたときの,パネルの位置を記録するための変数
  mousedown:boolean; //マウスが押されたどうかを記録
 public
  { Public 宣言 }
 end;
 
 var
  Form1: TForm1;
 
 implementation
 
 {$R *.dfm}
 
//マウスのボタンが押されたとき
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 mousedown:=true; //マウスが押されたことを記録
 panelx:=x; //パネルのx座標を,panelxに保存する
 panely:=y; //パネルのy座標を,panelyに保存する
end;

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if mousedown=true then //マウスが押されていれば以下のプログラムを実行する
 begin
  Panel1.left:=Panel1.left+x-panelx; //ここでパネルの位置を移動させる
  Panel1.top:=Panel1.top+y-panely;
 end;
end;

procedure TForm1.PnlMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 mousedown:=false; //マウスボタンが放たれたことを記録する
end;

 上のプログラムコードでは,マウスが押されたかどうか記録するために「mousedown」(名前は何でも良いのですが…)という変数を使っていますが,これを使わないと,マウスがパネルの上を通過しただけでとんでもないところに移動してしまいます。
 
 このパネルを横方向にだけ動かしたいという場合は

procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if mousedown=true then
 begin
  Panel1.left:= Panel1.left+x-panelx;
  Panel1.top:= Panel1.top+y-panely; //←この部分を削除
  end;
end;

 「←この部分を削除」の一行を削除するとパネルは横方向にだけ移動するようになります。

−トップへ−