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
Zeilen verschieben in Stringgrid
- h-elsner
- Lazarusforum e. V.
- Beiträge: 282
- 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
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).
Das Verschieben bzw bei Bedarf auch Austauschen der Zeilen könnte so gemacht werden.
Das alles ist noch unausgegoren und ungetestet. Bestimmt gibt es eine elegantere Lösung, aber so würde ich in etwa vorgehen.
Gruß HE
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;
Gruß HE
Re: Zeilen verschieben in Stringgrid
Das geht automatisch mit der Option: goRowMoving.
Damit kann man es an der ersten Spalte ziehen.
Damit kann man es an der ersten Spalte ziehen.
- h-elsner
- Lazarusforum e. V.
- Beiträge: 282
- 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
Hab ich's doch gewusst - es geht eleganter... und schöner.
Alles wie (fast) immer
Alles wie (fast) immer

- BoraBora
- Beiträge: 50
- 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
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
goRowMoving hatte ich zwar eingeschaltet- habe jetzt aber gelernt, dass fixedcols nicht Null
sein darf, damit das verschieben funktioniert.
Vielen Dank!
BB