コンポーネントをマウスで移動させる
フォームに配置したコンポーネントは,そのままではマウスで移動させることはできませんが,以下の方法で移動させることができるようになります。
ここでは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;
「←この部分を削除」の一行を削除するとパネルは横方向にだけ移動するようになります。