procedure TDBDragGrid.MouseDown(
Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FGC:=MouseCoord(X,Y);
if (FGC.X>0) and (FGC.Y>0) then begin
BeginDrag(false);
end;
inherited MouseDown(Button, Shift, X, Y);
FSource:=SelectedField.Value;
end;
A drag and drop művelethez két további esemény kezelésére lesz szükségünk. Mindkét eseményhez létezik egy-egy eljárás az ős osztályban, így szintén ezek felülírásával érhetjük el célunkat legegyszerűbben. Ez a két eljárás a DragOver és a DragDrop.
procedure TDBDragGrid.DragOver(Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
var
gc: TGridCoord;
begin
gc:=MouseCoord(X,Y);
Accept:=((Source=Self) and (gc.X>0) and (gc.Y>0));
end;
A másik eljárásunk a DragDrop. Ez akkor kerül meghívásra, amikor a drag and drop művelet során a felhasználó elengedte az egér gombját akkor, amikor a DragOver eljárásban az Accept változó igaz értéket kapott. Ebben az esetben vizsgáljuk szintén a MouseCoord-al, hogy melyik cella felett lett befejezve a drag and drop művelet. Ha ez megvan, akkor kiszámítjuk, hogy hány sor van a drag and drop művelet megkezdése és befejezése között, majd az adattáblát a MoveBy eljárással ennyi rekorddal elmozgatjuk. Ha ez megtörtént, akkor már csak be kell írnunk a kiválasztott cellába a művelet megkezdésekor az FSource változóba eltárolt értéket.
procedure TDBDragGrid.DragDrop(Source: TObject; X, Y: Integer);
var
gc: TGridCoord;
begin
gc:=MouseCoord(X,Y);
if (gc.X>0) and (gc.Y>0) then begin
DataSource.DataSet.MoveBy(gc.Y-FGC.Y);
DataSource.DataSet.Edit;
Fields[gc.X-1].Value:=FSource;
end;
end;