Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Drag and Drop im TDBGrid (https://www.delphipraxis.net/17223-drag-drop-im-tdbgrid.html)

barnti 1. Mär 2004 14:51


Drag and Drop im TDBGrid
 
Hi,

ich würde gern in meinen TDBGrids 'drag and drop' verwenden, und so neue Datensätze in einer Tabelle anlegen. Leider habe ich mit den folgenden Versuchen keinen Erfolg:

Delphi-Quellcode:
// Drag beginnen
procedure TForm_Main.DBGrid_MasterMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Button =mbleft then DBGrid_Master.BeginDrag(false);
end;

// Drag and Drop akzeptieren?
procedure TForm_Main.DBGrid_DetailDragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  if Source is TDBGrid then
  begin
    accept:= true;

  end;

end;

// Erfolgreicher Drag-and-Drop-Vorgang
procedure TForm_Main.DBGrid_DetailDragDrop(Sender, Source: TObject; X,
  Y: Integer);
begin
  if Source is TDBGrid then
    begin
      showmessage('Dragdrop');
    end;
end;
// Fehlschlag
procedure TForm_Main.DBGrid_DetailEndDrag(Sender, Target: TObject; X,
  Y: Integer);
begin
  if Target= NIL then
  MessageBeep(0);
end;
Leider funktioniert der Vorgang nur, wenn ich den in einem freien Bereich des Grid mit dem D&D beginne. Ich möchte aber auf einem der Datensätze beginnen, so dass dieser der aktuelle Datensatz wird und ich diesen dann beim D&D verwenden kann. Wie kann ich dies realisieren? Kann jemand helfen?

Gruß,

Barnti

HolyCow 2. Mär 2004 21:50

Re: Drag and Drop im TDBGrid
 
Wenn ich mich recht erinnere, verhinderte ein Bug im TDBGrid das erfolgreiche Drag-and-Droppen. Wir haben das mit einer leicht modifizierten Version des TDBGrid gelöst:

Delphi-Quellcode:
unit FDDDBGrid;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids;

type
  TDDDBGrid = class(TDBGrid)
  private
    { Private declarations }
    FOnMouseDown: TMouseEvent;
  protected
    { Protected declarations }
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
  published
    { Published declarations }
    property Row;
    property OnMouseDown read FOnMouseDown write FOnMouseDown;
  end;

procedure Register;

implementation

procedure TDDDBGrid.MouseDown(Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Assigned(FOnMouseDown) then
    FOnMouseDown(Self, Button, Shift, X, Y);
  inherited MouseDown(Button, Shift, X, Y);
end;

procedure Register;
begin
  RegisterComponents('DBGrid', [TDDDBGrid]);
end;

end.

barnti 3. Mär 2004 09:57

Re: Drag and Drop im TDBGrid
 
Hallo HolyCow,

kannst Du Deine Lösung vielleicht ein wenig mit Kommentaren versehen. Ich komme so damit nicht ganz klar! Bitte Erläutere die Vorgehensweise um die Anpassungen vorzunehmen.

Danke vielmals,

Gruß,

Barnti

HolyCow 3. Mär 2004 14:40

Re: Drag and Drop im TDBGrid
 
Zitat:

Zitat von barnti
kannst Du Deine Lösung vielleicht ein wenig mit Kommentaren versehen. Ich

Das ist nicht die Lösung, sondern nur ein Teil der Lösung :-D . Der obige Code ist eine veränderte TDBGrid-Komponente, die ein Problem bei D&D ausräumt. Der Rest geht etwa so wie bei Dir im Programm, beim D&D-Event ist der aktuelle Datensatz im zum DBGrid gehörigen DataSet dann schon gesetzt.

Das TDDDBGrid installieren und statt dem TDBGrid verwenden, dann sollte es klappen.

barnti 3. Mär 2004 14:58

Re: Drag and Drop im TDBGrid
 
Hi,

ich habe den Hinweis auf der Borland-Seite gefunden. Da ich aber einen anderen Workarround gefunden habe belasse ich es dabei. Meine Lösung:

Delphi-Quellcode:
procedure TForm_Main.DBGridColEnter(Sender: TObject);
var mousedown: Smallint;
begin
  if down then // Globale Variable, die bei der Navigation im Grid aus false gesetzt wird
    begin
      DBGrid_Master.BeginDrag(false);
    end;
  down:= true; // Rücksetzen der Variable
end;
Das OnColEnter initiiert den D&D-Vorgang, wenn das OnColEnter durch MouseKlick ausgelöst wurde. Ansonsten wird das Ereignis 'ignoriert'.

Danke für Deine Bemühungen. Es läuft jetzt erstmal. Zwar mit globaler Variable aber das ist die erste. Außerdem gibt es sicherlich noch einen anderen Weg ohne diese Variable. Später...

Gruß,

Barnti

Seven 11. Dez 2007 08:11

Re: Drag and Drop im TDBGrid
 
Hallo,
das Thema ist zwar schon älter, aber ich habe gerade das selbe Problem. Ich habe ein DBGrid und würde gerne die Reihen per Drap'n Drop im selben DBGrid vertauschen und anschließend per SQL speichern. Ist das überhaupt mit den Standardkomponenten machbar?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 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