Zeilen verschieben in Stringgrid

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
BoraBora
Beiträge: 42
Registriert: So 11. Apr 2021, 16:00
OS, Lazarus, FPC: FPC 3..2.2, L 2.2.0 , Linux Mint, WIN 10&11, Android,
CPU-Target: xxBit

Zeilen verschieben in Stringgrid

Beitrag von BoraBora »

Hallo,

auch nach Suchen hier im Forum und anderswo, finde ich nicht wirklich eine Antwort.
Ist es möglich, das User die Positionen einzelner Zeilen in einem Stringgrid per Maus
oder z.B. STRG+Cursor-Up/Down verschieben können?
Z.B. Nimm die 10te Zeile und verschiebe sie zwischen 2. und 3. Zeile.

Bin für jeden Hinweis dankbar.

BB

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Zeilen verschieben in Stringgrid

Beitrag von h-elsner »

Das würde schon gehen, aber man muss sich die Bedienung für den User genau überlegen, das heisst, er muss sehen, was er macht. Ich habe mir mal nur Gedanken darüber gemacht, wie es mit der Maus aussehen würde. Also STRG gedrückt halten und mit gedrückter Maustaste die Zeile "ziehen". Die zeilen zu ermitteln geht mit OnMouseDown und OnMouseUp. Aber da sieht der Nutzer nichts bzw. er markiert den Bereich über den er zieht. Dieses Markieren müsste man unterdrücken und stattdessen die Zeilen markieren, über die gezogen wird. Das ginge mit OnMouseMove. Da musst du mal etwas herumprobieren.

Dazu benötigen wir noch eine Routine, um die Zeilen umzusortieren.

Ganz einfach mit Maus und ohne Hilfe für den Benutzer wäre das etwa so (das StringGrid heisst hier bei mir sinnigerweise gridTest).

Code: Alles auswählen

procedure TForm1.gridTestMouseDown(Sender: TObject; Button: TMouseButton;     {aktuelle Zeile ermitteln}
  Shift: TShiftState; X, Y: Integer);
var
  aCol, aRow: integer;

begin
  if ssCtrl in Shift then  begin
    gridTest.MouseToCell(x, y, aCol, aRow);
    edit2.text:=Inttostr(arow);
    gridTest.Tag:=aRow;                                                       {ausgewählte Zeile merken}
  end;
end;

procedure TForm1.gridTestMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  aCol, aRow: integer;

begin
  if (ssCtrl in Shift) and (gridTest.Tag>=0) then  begin
    gridTest.MouseToCell(x, y, aCol, aRow);
    MoveRow(gridtest, gridtest.Tag, aRow);
    gridtest.Tag:=-1;
  end;
end;


Das Verschieben bzw bei Bedarf auch Austauschen der Zeilen könnte so gemacht werden.

Code: Alles auswählen

procedure MoveRow(grid: TStringGrid; von, nach: integer; exchange: boolean=false);
var
  memRow: TStringList;
  i: integer;

begin
  if (von>=grid.FixedRows) and (von<grid.RowCount) and
     (nach>=grid.FixedRows) and (nach<grid.RowCount) then begin
    memRow:=TStringList.Create;
    grid.BeginUpdate;
    try
      memRow.Assign(grid.Rows[von]);          {die Zeile "von" zwischenspeichern}
      if exchange then begin                  {nicht verschieben, sondern die beiden Zeilen austauschen}
        grid.Rows[von].Assign(grid.Rows[nach])
      end else begin
        if von<nach then begin                {andere Zeilen nach oben verschieben}
          for i:=von to nach-1 do
            grid.Rows[i].Assign(grid.Rows[i+1]);
        end
        else
        if von>nach then begin                {bzw. nach unten verschieben}
          for i:=von downto nach+1 do
            grid.Rows[i].Assign(grid.Rows[i-1]);
        end;
      end;
      grid.Rows[nach].Assign(memRow);
    finally                                   {gespeicherte Zeile bei "nach" einsetzen}
      memRow.Free;
      grid.EndUpdate;
    end;
  end;
end;
Das alles ist noch unausgegoren und ungetestet. Bestimmt gibt es eine elegantere Lösung, aber so würde ich in etwa vorgehen.

Gruß HE

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Zeilen verschieben in Stringgrid

Beitrag von theo »

Das geht automatisch mit der Option: goRowMoving.
Damit kann man es an der ersten Spalte ziehen.

strgridmove.png
strgridmove.png (11.84 KiB) 761 mal betrachtet

Benutzeravatar
h-elsner
Lazarusforum e. V.
Beiträge: 259
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint21.1, Win10, Lazarus 2.2.4, FPC3.2.2
CPU-Target: X86-64; arm 32bit
Wohnort: Illertissen
Kontaktdaten:

Re: Zeilen verschieben in Stringgrid

Beitrag von h-elsner »

Hab ich's doch gewusst - es geht eleganter... und schöner.
Alles wie (fast) immer :oops:

Benutzeravatar
BoraBora
Beiträge: 42
Registriert: So 11. Apr 2021, 16:00
OS, Lazarus, FPC: FPC 3..2.2, L 2.2.0 , Linux Mint, WIN 10&11, Android,
CPU-Target: xxBit

Re: Zeilen verschieben in Stringgrid

Beitrag von BoraBora »

Vielen Dank an Euch!

goRowMoving hatte ich zwar eingeschaltet- habe jetzt aber gelernt, dass fixedcols nicht Null
sein darf, damit das verschieben funktioniert.

Vielen Dank!

BB

Antworten