Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Drag & Drop DBGrid (https://www.delphipraxis.net/179228-drag-drop-dbgrid.html)

Andidreas 21. Feb 2014 09:55

Datenbank: SQLite • Version: ? • Zugriff über: UniDac

Drag & Drop DBGrid
 
Hallo zusammen...

ich hoffe ich hab den richtigen Foren Bereich genommen mit meiner Frage...

Ich möchte über Drag & Drop Daten von einer DBGrid Zelle in eine andere DBGrid Zelle kopieren...
D.h. der User soll im DBGrid_1 auf eine Zelle klicken, und beim Klick auf eine Zelle im DBGrid_2 werden dort die Werte eingefügt/überschrieben...

Der folgende Source funktioniert bei mir bereits:

Delphi-Quellcode:
  type THackDBGrid = class(TDBGrid);


procedure Tmain_form.dbgrid_commissionsCellClick(Column: TColumn);
begin

  If (rdbtn_addtoparcel.Checked) Then
  Begin
    dbgrid_commissions.BeginDrag(True);
  End;

end;


procedure Tmain_form.dbgrid_parcelsDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin

  Accept := Source Is TDBGrid;

end;


procedure Tmain_form.dbgrid_parcelsDragDrop(Sender, Source: TObject; X, Y: Integer);
var
gc : TGridCoord;
s  : String;
begin

  If (rdbtn_addtoparcel.Checked) Then
  Begin
    gc := THackDBGrid(dbgrid_parcels).MouseCoord(X,Y);
    If (gc.X > 0) And (gc.Y > 0) then
    begin
      s := Commissions.FieldByName('Quantity').AsString;

      With THackDBGrid(dbgrid_parcels) Do
      Begin
        DataSource.DataSet.MoveBy (gc.Y - Row);
        DataSource.DataSet.Edit;
        Columns.Items[-1 + gc.X].Field.AsString := s;
      end;
    end;
  End;

end;

procedure Tmain_form.dbgrid_parcelsMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  gc: TGridCoord;
begin

  gc:= dbgrid_parcels.MouseCoord(x, y);

  If (gc.X > 0) And (gc.Y > 0) Then
  Begin
    dbgrid_parcels.DataSource.DataSet.MoveBy(gc.Y - THackDBGrid(dbgrid_parcels).Row);
  End;

end;
Folgendes gefällt mir noch nicht so richtig...
Die OnMouseMove Eigenschaft im Empfangenden dbgrid_parcels wurde überschrieben um herauszufinden in welcher Zelle die Daten eingefügt werden sollen (die Methode habe ich im Internet gefunden)...
Allerdings bewirkt das jetzt auch dass sobald sich die Maus in Bereich des dbgrid_parcels befindet und sich dort auf und ab bewegt die Zeile gewechselt wird... Das sieht man z.B. am Scrollbalken an der Seite...

Wie kann ich das abstellen???

Buddelfish 21. Feb 2014 10:11

AW: Drag & Drop DBGrid
 
Du musst doch nur wissen, ob gerade 'gedragged' wird, oder? Dann führst Du das tracken im OnMouseMove eben nur dann aus.

Andidreas 21. Feb 2014 11:06

AW: Drag & Drop DBGrid
 
Danke für den Tipp...

Ich hab das Zellen ermitteln jetzt auf das OnMouseDown Ereignis abgeändert (war für mich logischer) und prüfe zusätzlich das Dragging:

So gehts jetzt...

Delphi-Quellcode:
procedure Tmain_form.dbgrid_parcelsMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  gc: TGridCoord;
begin

  If (dbgrid_commissions.Dragging) Then
  Begin
    If (ssLeft In Shift) Then
    Begin
      gc:= dbgrid_parcels.MouseCoord(x, y);
      If (gc.X > 0) And (gc.Y > 0) Then
      Begin
        dbgrid_parcels.DataSource.DataSet.MoveBy(gc.Y - THackDBGrid(dbgrid_parcels).Row);
      End;
    End;
  End;

end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz