あるグリッドの列を別のグリッドの列へドロップ&ドロップで設定する処理を作成しましたが、クリックした同時にドラッグをしても、ドラッグ処理がされず
一度、列をクリック選択した後に、もう一度、クリックした同時にドラッグすると
上手く、ドラッグされます。
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;
> クリックイベントで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;
jokさん、いつもありがとうございます。解決できました。
ツイート | ![]() |