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 Stringgrid: Ganze Zeilen mit der Maus verschieben (https://www.delphipraxis.net/120662-stringgrid-ganze-zeilen-mit-der-maus-verschieben.html)

dsjena 14. Sep 2008 22:07


Stringgrid: Ganze Zeilen mit der Maus verschieben
 
Dazu zunächst ein Bild:

http://img216.imageshack.us/img216/1...blage01he1.gif

Es handelt sich um einen Bass.dll-Player, genauer gesagt um eine Sendeablaufsteuerung. Vorher habe ich mit mehreren Listbox-Komponenten gearbeitet, nun möchte ich die Playlist übersichtlicher (und für mich funktioneller) gestalten und habe mich für die Stringgrid-Komponente entschieden. Klappt soweit sehr gut.

Problem: Ich möchte die Zeilen im Ganzen verschiebbar machen. Drag&Drop habe ich mal ausprobiert, aber nur für Zellen hinbekommen. Nach intensiver Suche bin ich leider auch nicht weitergekommen und wende mich nun an Euch, in der Hoffnung, dass die Lösung für den Einen oder Anderen völlig banal erscheint... :)

Gruß, Daniel

toms 14. Sep 2008 23:00

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben
 
Hallo Daniel

Wäre eine ListView nicht geeigneter?

dsjena 14. Sep 2008 23:10

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben
 
Zitat:

Wäre eine ListView nicht geeigneter?
Das ist eine gute Frage... :gruebel: Ich habe noch nie mit ListView gearbeitet, was ist der Unterschied, d.h. was kann die Kompomente, was Stringgrid nicht kann und was bringt sie mir für Vorteile?

Ich hatte zwar nicht vor, nochmal zu wechseln, aber zur Not ginge es, da ich mit der Umstellung auf Stringgrid noch nicht sehr weit bin.

lg

dsjena 17. Sep 2008 21:25

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben
 
Hallo nochmal,
also ich möchte wirklich beim Stringgrid bleiben. Hat denn wirklich niemand eine Idee? :?

Schönen Abend und Danke schonmal für jegliche Tipps,

Daniel

freak4fun 17. Sep 2008 21:28

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben
 
Du hast es mit Drag&Drop für eine Zelle hinbekommen und kannst es nicht auf eine Zeile erweitern? :gruebel:

NickelM 17. Sep 2008 21:38

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben
 
Also ich würde dir wirklick Listview empfehlen, weil es für deine arbeit leichter ist.

Aber okay da ich nichts zu tun habe :mrgreen: werde ich mal beide dinge sagen...

StringGrid als erstes wenn du es für eine Zelle hast musst du nur den Count der Columns abfragen (Col also)

das sieht dan in etwa so aus
Delphi-Quellcode:
var I : Integer;
for I := 0 to Grid.ColCount-1 //-1 wegen index natürlich
begin
Grid.Cell[0,I] //also 0 muss dan deine Zeile sein, die makiert ist.
//dan deine anweisung,
//Cell gibt dan immer von der Zeile und von den ganzen Columns zurück musst sie also nur alle übertragen
end;

dsjena 17. Sep 2008 21:45

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben
 
Danke für die Antwort, ich poste erstmal den bisherigen Code. An welcher Stelle müsste ich deinen Code-Schnipsel anwenden? Bei stringgrid.DragDrop?

Delphi-Quellcode:
procedure Tplayer_gui.playgridDragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  DestCol, DestRow: Integer;
begin
  playgrid.MouseToCell(X, Y, DestCol, DestRow); // convert mouse coord.
  playgrid.Cells[DestCol, DestRow] := playgrid.Cells[SourceCol, SourceRow];
  if (SourceCol <> DestCol) or (SourceRow <> DestRow) then
    playgrid.Cells[SourceCol, SourceRow] := '';
end;

toms 17. Sep 2008 21:57

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben
 
Hallo,

Müsste in etwa so funktionieren:

( Stringgrid1.DragMode := dmManual; )


Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Stringgrid1: TStringGrid;
    procedure Stringgrid1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; 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 FormCreate(Sender: TObject);
  private
    { Private declarations }
    FSourceRow: Integer;
  public
    { Public declarations }
  end;

// Zugriff auf protected MoveRow
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.Stringgrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  SourceCol : Integer;
begin
  // Zeile ermitteln
  (Sender as TStringgrid).MouseToCell(X, Y, SourceCol, FSourceRow);
  if (FSourceRow > 0) then
    (Sender as TStringgrid).BeginDrag(False, 4); // Drag starten
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.Stringgrid1DragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  DestCol, DestRow: Integer;
begin
  // Ziel Zeile ermitteln
  Stringgrid1.MouseToCell(X, Y, DestCol, DestRow);
  if (FSourceRow <> DestRow) then
  begin
     // Zeile FSourceRow nach DestRow verschieben
     TStringGridHack(Source as TStringgrid).MoveRow(FSourceRow, DestRow);
  end;
end;

Sir Rufo 17. Sep 2008 22:01

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben
 
Zitat:

Zitat von dsjena
Delphi-Quellcode:
procedure Tplayer_gui.playgridDragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  DestCol, DestRow: Integer;
begin
  playgrid.MouseToCell(X, Y, DestCol, DestRow); // convert mouse coord.
  playgrid.Cells[DestCol, DestRow] := playgrid.Cells[SourceCol, SourceRow];
  if (SourceCol <> DestCol) or (SourceRow <> DestRow) then
    playgrid.Cells[SourceCol, SourceRow] := '';
end;

Aber da hast Du doch schon alles fertig .... alle Informationen sind da ...

Delphi-Quellcode:
procedure Tplayer_gui.playgridDragDrop(Sender, Source: TObject; X,
  Y: Integer);
var
  DestCol, DestRow: Integer;
begin
  playgrid.MouseToCell(X, Y, DestCol, DestRow); // convert mouse coord.
  for IdxCol := 0 to playgrid.ColCount - 1 do
  begin
    playgrid.Cells[IdxCol, DestRow] := playgrid.Cells[IdxCol, SourceRow];
    if (SourceRow <> DestRow) then
      playgrid.Cells[IdxCol, SourceRow] := '';
  end;
end;
Also anstatt für eine Spalte für alle Spalten ...

cu

Oliver

NickelM 17. Sep 2008 22:08

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben
 
Hm...ganz erlich gesagt blick ich net so wirlich was du machst....

Also ich hab bei einer Anwendung mit Drag und Drop gearbeitet.

Am besten du machst beim ausgehen Grid (also von dem du die daten holst) bei OnMouseDwon Folgendes

Mir ist eingefallen das Grid ne Row hat wo du alle Werte von der Zeile hast
würde in der unit ne var machen (unter Form1 : TForm1 oder so)

Zeile : TStrings;

Delphi-Quellcode:
playgrid.BeginDrag(False);
playgrid.MouseToCell(X, Y, DestCol, DestRow);
Zeile := playgrid.Rows[DestRow]; //du gibt sozusagen die Adresse von der Klasse weiter, weiteres kann ich dir nicht erklären
So bei dem Empfänger bei OnDragOver kommt folgendes:

Delphi-Quellcode:
Accept := True; //mehr nicht
so jetzt zum OnDragDrop:
Delphi-Quellcode:
var SourceCol, SourceRow : Integer;
begin
StringGrid2.MouseToCell(X, Y, SourceCol, SourceRow);
If SourceRow > -1 then
StringGrid2.Rows[SourceRow].Assign(Zeile);
Hab es grad geteste funkt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr.
Seite 1 von 2  1 2      

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