コンポーネントの移動

解決


きのこ  2003-05-27 18:46:07  No: 3614  IP: [192.*.*.*]

みなさんこんにちわ。
初めて投稿します。宜しくお願いします。
早速質問なのですが、今回コンポーネントの移動をさせたいのですが
コンポ1つなら移動ができるのですが、複数選択させて
移動させたいのです(デザイン時にできるような事)。
説明が悪いかもしれませんが宜しくお願い致します。

編集    削除
たかみちえ  URL  2003-05-28 04:40:53  No: 3615  IP: [192.*.*.*]

基本操作としてのことでしょうか?
Shiftキーを押しながらで、複数選択できますけど。(コンテナ間をまたいでは無理)

編集    削除
きのこ  2003-05-28 07:06:58  No: 3616  IP: [192.*.*.*]

たかみちえさん返信ありがとうございます。
基本操作じゃなく実行時なんです。
プログラムでやりたいのです。
すみません説明が悪かったですね。

編集    削除
にしの  2003-05-28 07:16:16  No: 3617  IP: [192.*.*.*]

単純に、それぞれのコンポーネントの「現在の位置」を基準として、

with component1 do
begin
  Left := Left + x;
  Top := Top + y;
end;
with component2 do
begin
  Left := Left + x;
  Top := Top + y;
end;
with component3 do
begin
  Left := Left + x;
  Top := Top + y;
end;
・・・
としていけばよいかと。

デザインと同じように、マウスダウン・マウス移動・マウスアップで移動するなら、
1.MouseDown時にマウス位置を保存。移動したいコンポーネントの位置を保存。マウスが押した状態を記憶(IsMouseDown:=True)
2.MouseMove時、IsMouseDown=Trueなら、保存してある位置と現在のマウス位置の差を、移動したいコンポーネントの「保存してある位置」に加える。
3.MouseUp時にマウスを放した状態を記憶(IsMouseDown=False)。コンポーネントの位置を固定。
です。

編集    削除
きのこ  2003-05-28 18:16:42  No: 3618  IP: [192.*.*.*]

にしのさん返答ありがとうございます。
もう少し教えて下さい。

1.デザインと同じようにドラッグ&ドロップで各コンポーネントを
囲み選択はどうすればいいですか?
2.その範囲に入っているコンポーネント(複数)の認識をどう
取ればいいのですか?
3.最後に保存してあるマウス位置と現在のマウス位置の差を選択された
各コンポーネントに加えればいいんですよね。

たくさん質問してすみませんが宜しくお願い致します。

編集    削除
にしの  2003-05-28 20:56:22  No: 3619  IP: [192.*.*.*]

1.
MouseDownでSetCaptureします。SetCaptureすると、そのウィンドウハンドルの領域外でも、マウスイベント(移動など)を取得できます。
MouseUpで、ReleaseCaptureすることを忘れずに。

これで、マウスの開始と終了がとれますよね。
選択の枠は、キャプチャ中にデスクトップに対して描画します。
xorで、前の枠を元に戻し、新しい枠を同じくxorで書くだけです。

2.
1つであれば、FindVCLWindowなどの関数で取得できます。
複数の場合は、ChildComponentを調べていった方が簡単だと思います。
選択領域[x1, y1]-[x2, y2]であり、全コンポーネント数がnのとき、(abs((x2-x1)*(y2-y1)) < n)であれば、選択範囲を探した方が早いかもしれません。
# あまりないですよね。

3.
そういうことです。
コンポーネントの位置を保存せずに、前回のマウス位置と現在のマウス位置との差を足せば、ほぼ同じことができます。
ただし、移動のキャンセルができませんよ。
# 最初の位置を保存していないため

編集    削除
きのこ  2003-05-28 23:06:59  No: 3620  IP: [192.*.*.*]

にしのさんこんにちわ。返信ありがとうございます。
すみませんが教えてください。

>xorで、前の枠を元に戻し、新しい枠を同じくxorで書くだけです
枠をxorで書くことができるのですか?

>複数の場合は、ChildComponentを調べていった方が簡単だと思います
ChildComponentは関数ですか?

度々すみませんが宜しくお願い致します。
もしよろしければサンプル的なものがあればうれしいです。

編集    削除
にしの  2003-05-29 01:30:35  No: 3621  IP: [192.*.*.*]

枠はDrawFocusRectを使うとXORで描画されます。
つまり、同じ位置に同じサイズで2度描画すれば、元に戻ります。

Componentsプロパティでした。
自分自身の持つコンポーネントは、Components[0]から、Components[ComponentCount-1]までです。もちろん、Components[0].Components[0]....と続きますので、再帰的に処理してください。

編集    削除
きのこ  2003-05-30 21:02:09  No: 3622  IP: [192.*.*.*]

こんにちわ。うまくいきました。
にしのさん色々ありがとうございました。

編集    削除