グリッド間のドラッグ&ドロップ

解決


リュウ  2004-10-08 07:16:30  No: 11329

あるグリッドの列を別のグリッドの列へドロップ&ドロップで設定する処理を作成しましたが、クリックした同時にドラッグをしても、ドラッグ処理がされず
一度、列をクリック選択した後に、もう一度、クリックした同時にドラッグすると
上手く、ドラッグされます。
2度クリック処理をさせず、一回のクリックでドラッグしドロップさせたいです。
以下のやり方でやっています。
グリッドをクリックした時に、DragModeを制御しドラッグの動作をさせています。
デザイン時にDragModeをdmAutomaticに設定すると1行目の1列目しか選択
できない状態になるのでそれを回避する為に行っています。
クリックイベントでDragModeを切り替えるやり方は良くないでしょうか?

procedure TFrmA.StringGrid1DragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  Accept := true;
end;

procedure TFrmA.StringGrid1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
 acol,arow:integer;
begin
  StringGrid1.mousetocell(x, y, acol, arow);
  if (acol < 0) or (arow < 0) then  // scroll barや最後の行より下のところにdropしたときは何もしない
  begin
    StringGrid1.DragCursor := crNoDrop;
    exit;
  end;
  if (Sender = StringGrid1) then    //  drag開始時のcellの内容をdropしたcellにcopy
  begin
    StringGrid1.mousetocell(x, y, acol, arow);
    StringGrid1.cells[acol, arow] := StrGrdYoso4.cells[StrGrdYoso4.Col, StrGrdYoso4.Row];
    StringGrid1.repaint;
  end;

  StrGrdYoso4.DragMode:=dmManual;

end;

procedure TFrmA.StrGrdYoso4Click(Sender: TObject);
begin
  StrGrdYoso4.DragMode:=dmAutomatic;
end;


jok  2004-10-08 09:32:50  No: 11330

> クリックイベントでDragModeを切り替えるやり方は良くないでしょうか?

はい、DragMode は dmManual のままにしておき、BeginDrag() と EndDrag() を
使います。BeginDrag() は OnMouseDown にするといいです。

procedure TForm1.StringGrid1DragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  if Source = StrGrdYoso4 then Accept := true;
end;

procedure TForm1.StringGrid1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
 acol,arow:integer;
begin
  if Source <> StrGrdYoso4 then exit;
  StrGrdYoso4.EndDrag(true);
  StringGrid1.mousetocell(x, y, acol, arow);
  if (acol < 0) or (arow < 0) then  // scroll barや最後の行より下のところにdropしたときは何もしない
  begin
    StringGrid1.DragCursor := crNoDrop;
    exit;
  end;
  if (Sender = StringGrid1) then    //  drag開始時のcellの内容をdropしたcellにcopy
  begin
    StringGrid1.mousetocell(x, y, acol, arow);
    StringGrid1.cells[acol, arow] := StrGrdYoso4.cells[StrGrdYoso4.Col, StrGrdYoso4.Row];
    StringGrid1.repaint;
  end;
end;

procedure TForm1.StrGrdYoso4MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  StrGrdYoso4.BeginDrag(false,2);
end;


リュウ  2004-10-08 20:46:46  No: 11331

jokさん、いつもありがとうございます。解決できました。


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

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






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