Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Probleme mit Drag & Drop und StringGrid (https://www.delphipraxis.net/138697-probleme-mit-drag-drop-und-stringgrid.html)

Dennis_Wolfram 15. Aug 2009 14:36


Probleme mit Drag & Drop und StringGrid
 
Hallo liebe Delphianer,

ich hab mal wieder ein Gehirnknoten und komme daher mit folgendem Problem zu Euch.

Meine Anwendung besteht aus einem Formular mit 2 StringGrids.
Das sieht dann optisch so aus:

http://9qaqaa.bay.livefilestore.com/...k/DragDrop.jpg

Mein Ziel ist es, mit Hilfe von Drag & Drop, eine ausgewählte ganze Zeile aus dem rechten StringGrid("Belegungshilfe") in den linken StringGrid zu verschieben. (Siehe Abb. – Roter Pfeil!)

Wenn jemand von Euch die Lösung kennt, wäre ich sehr Dankbar.

LG Dennis

juergen 15. Aug 2009 15:11

Re: Probleme mit Drag & Drop und StringGrid
 
Hallo Dennis,

nach kurzem Suchen habe ich direkt nachfolgendens von toms hier gefunden:
Drag&Drop für StringGrid

Dennis_Wolfram 15. Aug 2009 16:21

Re: Probleme mit Drag & Drop und StringGrid
 
Danke für die schnelle Antwort. Ich habes ausprobiert und es funktioniert leider noch nicht so richtg.

Die Zeile kann ich problemlos innerhalb EINES StringGrid verschieben, aber nicht aus dem einem StringGrid(1) in das andere StrinGrid(2) verschieben.

Irgendwie find ich meinen Fehler nicht.

juergen 15. Aug 2009 16:30

Re: Probleme mit Drag & Drop und StringGrid
 
zeig mal bitte deinen bisherigen Code sonst weiß hier keiner wo dein Problem liegen könnte.

Dennis_Wolfram 15. Aug 2009 16:40

Re: Probleme mit Drag & Drop und StringGrid
 
:wall: Ja Sorry wie Hirnlos von mir:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    StringGrid2: TStringGrid;
    procedure StringGrid2MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure StringGrid2DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure StringGrid2DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure StringGrid1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure StringGrid1DragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private-Deklarationen }
    FSourceRow: Integer;
  public
    { Public-Deklarationen }
  end;

type
  TStringGridHack = class(TStringGrid)
  public
    procedure MoveRow(FromIndex, ToIndex: Longint);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TStringGridHack.MoveRow(FromIndex, ToIndex: Integer);
begin
  inherited;
end;

procedure TForm1.StringGrid1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  DestCol, DestRow: Integer;
begin
  StringGrid2.MouseToCell(X, Y, DestCol, DestRow);
  if (FSourceRow <> DestRow) then
  begin
     TStringGridHack(Source as TStringGrid).MoveRow(FSourceRow, DestRow);
  end;
end;

procedure TForm1.StringGrid1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
var
  Col, Row: Integer;
begin
  (Source as TStringGrid).MouseToCell(X, Y, Col, Row);
  Accept := (Sender = Source) and (Row > 0);
end;

procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  SourceCol : Integer;
begin
  (Sender as TStringGrid).MouseToCell(X, Y, SourceCol, FSourceRow);
  if (FSourceRow > 0) then(Sender as TStringGrid).BeginDrag(False, 4);
end;

procedure TForm1.StringGrid2DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  DestCol, DestRow: Integer;
begin
  StringGrid1.MouseToCell(X, Y, DestCol, DestRow);
  if (FSourceRow <> DestRow) then
  begin
     TStringGridHack(Source as TStringgrid).MoveRow(FSourceRow, DestRow);
  end;
end;

procedure TForm1.StringGrid2DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
var
  Col, Row: Integer;
begin
  (Source as TStringGrid).MouseToCell(X, Y, Col, Row);
  Accept := (Sender = Source) and (Row > 0);
end;

procedure TForm1.StringGrid2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  SourceCol : Integer;
begin
  (Sender as TStringGrid).MouseToCell(X, Y, SourceCol, FSourceRow);
  if (FSourceRow > 0) then(Sender as TStringGrid).BeginDrag(False, 4);
end;

end.
VIELEN DANK

Dennis

Dennis_Wolfram 21. Aug 2009 20:59

Re: Probleme mit Drag & Drop und StringGrid
 
Weis keiner einen Rat???

lg Dennis

NickelM 22. Aug 2009 00:26

Re: Probleme mit Drag & Drop und StringGrid
 
Aslo die Zeile mit
Delphi-Quellcode:
Accept := (Sender = Source) and (Row > 0);
Wird dir immer False liefern, weil Sender das Grid ist selbst ist und Source ist das Grid wovon er ds annehmen soll xD
und Accept muss True geben damit es funkt xD
2. Mit MouseToCell geht das net, da es sich nur auf sich selbst bezieht und net auf die anderen
Du musst die erstmal selbst festlegen wenn du DragKind auf dmManual hast, wann er das machen soll, bei dir am besten bei MouseDown

Delphi-Quellcode:
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
StringGrid1.BeginDrag(True);
end;

end.
So damit startest du das Drag and Drop
als nächstes machste bei deinem anderen StringGrid bei DragOver folgendes
Delphi-Quellcode:
procedure TForm1.StringGrid2DragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
If Source is TStringGrid then //Nur StringGirds annehmen
Accept := True;
end;
Nun machste in Drag and Drop folgendas
Delphi-Quellcode:
procedure TForm1.StringGrid2DragDrop(Sender, Source: TObject; X,
  Y: Integer);
var Cell : TPoint;
    Row : Integer;
begin
(Sender as TStringGrid).MouseToCell(X,Y,Cell.X,Cell.Y);
Row := (Source as TStringGrid).Row;
(Sender as TStringGrid).Rows[Cell.Y].Assign((Source as TStringGrid).Rows[Row]);
(Source as TStringGrid).Rows[Row].Clear;
end;

end.

Dennis_Wolfram 22. Aug 2009 04:43

Re: Probleme mit Drag & Drop und StringGrid
 
:hello: 1000 Dank! Es funktioniert.

Danke Dennis

dravigi 19. Jul 2013 14:25

AW: Probleme mit Drag & Drop und StringGrid
 
Hallo,
die Lösung von NickelM funktioniert bei mir soweit, jedoch mit einem Problem.

Mein Quell-Stringgrid hat nur eine Spalte.
Mein Ziel-Stringgrid hat allerdings zwei Spalten.

In Spalte 1 des Ziel-Stringgrids ist eine fortlaufende Nummer, die auch nicht verändert werden soll.

Ziehe ich nun einen Wert auf Stringgrid2 über eine beliebige Spalte 2 von Stringgrid1 wird immer der Wert der ersten Spalte der jeweiligen Zeile überschrieben (also meine fortlaufende Nummer). Der Wert der 2ten Spalte über dem ich mit dem Mauszeiger bin´, ändert sich nicht.

Jumpy 19. Jul 2013 14:42

AW: Probleme mit Drag & Drop und StringGrid
 
Ohne es zu testen, müsstest du dann glaub ich die Zuordnungszeile anpassen:

(Sender as TStringGrid).Cells[1,Cell.Y]=(Source as TStringGrid).Cells[0,Row];


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 Uhr.
Seite 1 von 2  1 2      

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