![]() |
Stringgrid: Ganze Zeilen mit der Maus verschieben
Dazu zunächst ein Bild:
![]() 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 |
Re: Stringgrid: Ganze Zeilen mit der Maus verschieben
Hallo Daniel
Wäre eine ListView nicht geeigneter? |
Re: Stringgrid: Ganze Zeilen mit der Maus verschieben
Zitat:
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 |
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 |
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:
|
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; |
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; |
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; |
Re: Stringgrid: Ganze Zeilen mit der Maus verschieben
Zitat:
Delphi-Quellcode:
Also anstatt für eine Spalte für alle Spalten ...
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; cu Oliver |
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:
So bei dem Empfänger bei OnDragOver kommt folgendes:
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
Delphi-Quellcode:
so jetzt zum OnDragDrop:
Accept := True; //mehr nicht
Delphi-Quellcode:
Hab es grad geteste funkt.
var SourceCol, SourceRow : Integer;
begin StringGrid2.MouseToCell(X, Y, SourceCol, SourceRow); If SourceRow > -1 then StringGrid2.Rows[SourceRow].Assign(Zeile); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr. |
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