AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Stringgrid: Ganze Zeilen mit der Maus verschieben
Thema durchsuchen
Ansicht
Themen-Optionen

Stringgrid: Ganze Zeilen mit der Maus verschieben

Ein Thema von dsjena · begonnen am 14. Sep 2008 · letzter Beitrag vom 17. Sep 2008
Antwort Antwort
Seite 1 von 2  1 2      
dsjena

Registriert seit: 13. Dez 2007
7 Beiträge
 
Delphi 7 Personal
 
#1

Stringgrid: Ganze Zeilen mit der Maus verschieben

  Alt 14. Sep 2008, 22:07
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
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben

  Alt 14. Sep 2008, 23:00
Hallo Daniel

Wäre eine ListView nicht geeigneter?
Thomas
  Mit Zitat antworten Zitat
dsjena

Registriert seit: 13. Dez 2007
7 Beiträge
 
Delphi 7 Personal
 
#3

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben

  Alt 14. Sep 2008, 23:10
Zitat:
Wäre eine ListView nicht geeigneter?
Das ist eine gute Frage... 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
  Mit Zitat antworten Zitat
dsjena

Registriert seit: 13. Dez 2007
7 Beiträge
 
Delphi 7 Personal
 
#4

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben

  Alt 17. Sep 2008, 21:25
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
  Mit Zitat antworten Zitat
Benutzerbild von freak4fun
freak4fun

Registriert seit: 22. Sep 2004
Ort: Hannover
1.807 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben

  Alt 17. Sep 2008, 21:28
Du hast es mit Drag&Drop für eine Zelle hinbekommen und kannst es nicht auf eine Zeile erweitern?
Christian
IT: Schließen Sie bitte das Fenster. User: Die Tür auch?
i++; // zaehler i um 1 erhoehen
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben

  Alt 17. Sep 2008, 21:38
Also ich würde dir wirklick Listview empfehlen, weil es für deine arbeit leichter ist.

Aber okay da ich nichts zu tun habe 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;
Nickel
  Mit Zitat antworten Zitat
dsjena

Registriert seit: 13. Dez 2007
7 Beiträge
 
Delphi 7 Personal
 
#7

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben

  Alt 17. Sep 2008, 21:45
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;
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#8

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben

  Alt 17. Sep 2008, 21:57
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;
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben

  Alt 17. Sep 2008, 22:01
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Stringgrid: Ganze Zeilen mit der Maus verschieben

  Alt 17. Sep 2008, 22:08
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:

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.
Nickel
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:39 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