動的に生成した複数のコンポーネントをドラックドロップするには

解決


Delphi  2010-12-05 20:03:19  No: 39666

いつもお世話になっています。

お遊びでカードゲームを作っています。

複数のImageコンポーネントを動的に生成し、
カードに見立てます。

ここまでは良いのですが、
これをドラックドロップで自由に移動できるようにしたのです。

しかし、名前を動的に命名している為、
動かすコンポーネントの名前を取得し、
移動させる方法が判りません。

どなたかお知恵を拝借いただけないでしょうか?

以下コードです。

コンポーネント生成
var
  Form1: TForm1;
  Imagel:TImage;

procedure TForm1.Button2Click(Sender: TObject);
var
  i,i1,i2:integer;
  s:string;
begin
  i := 0;
  while 6 > i do begin
    Imagel := TImage.Create(self);
    with Imagel do begin
      i1 := 10; i2 := 10 + i * 80;
      parent := ScrollBox1; //親コンポーネントを設定
      setBounds(i1,i2,50,70); //位置と大きさを設定
      s := listbox3.Items[i];
      listbox3.Items.Delete(i);
      if s[1] = 'h' then begin
        Imagel.Canvas.Brush.Color := clWhite;
        Imagel.canvas.Pen.Mode := pmcopy;
        Imagel.canvas.Rectangle(0,0,50,70);
        Imagel.canvas.Font.Color := clblack;
        Imagel.canvas.Font.Size := 14;
        Imagel.canvas.TextOut(20,25, s[2]);
      end else begin
        Imagel.Canvas.Brush.Color := clblack;
        Imagel.canvas.Pen.Mode := pmcopy;
        Imagel.canvas.Rectangle(0,0,50,70);
        Imagel.canvas.Font.Color := clWhite;
        Imagel.canvas.Font.Size := 14;
        Imagel.canvas.TextOut(20,25, s[2]);
      end;
      name := 'card' + s;
    end;
    i := i + 1;
  end;
end;

コンポーネントドラックドロップ移動
(方法が判らず、サンプルの状態から全く手をつけていません)
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Image1.BeginDrag(False);
end;

procedure TForm1.ScrollBox1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
var
  P: TPoint;
begin
  GetCursorPos(P);
  Image1.Left := P.x - left - Image1.Width -5;
  Image1.Top := P.y - top - Image1.Height -5;
end;


Delphi大好き  2010-12-05 20:06:46  No: 39667

名前ミスりました;;


au  2010-12-06 17:56:15  No: 39668

Imageの生成時にイベントを設定
Imagel.OnMouseDown := Image1MouseDown;

OnMouseDown の中は
(Sender As TImage).BeginDraw(False);

ScrollBoxのDragOverイベントはドラッグされてるのがImageなら受け入れるように処理
if Source is TImage then
  Accept := True;

後は、ScrollBoxのDragDropイベントでドロップ処理をする
  (Source as TImage).Left := X;
  (Source as TImage).Top := Y;

超手抜きだとこんな感じでドラッグドロップの移動は出来ると思います。
ドラッグ中にイメージを表示するとかは、TDragObjectを継承してなんかしたら出来るんじゃ無いかと思いますが良く知りません。


Delphi大好き  2010-12-06 19:37:01  No: 39669

auさんありがとうございます、
動きました^^!!

それではありがとうございましたm(__)m。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加