Stringgrid: Zeile löschen im EditingDone event

Rund um die LCL und andere Komponenten
Antworten
SirTwist
Beiträge: 1
Registriert: Mi 25. Mär 2020, 15:59

Stringgrid: Zeile löschen im EditingDone event

Beitrag von SirTwist »

Hallo Leute,

ich möchte dem Anwender die Möglichkeit geben, in einem StringGrid eine Zeile zu löschen, in dem er schlichtweg den Text (z.b. in der ersten Spalte) löscht.

Dazu habe ich im EditingDone-Event eine Abfrage eingebaut, die sg.DeleteRow aufruft, wenn der NewValue = '' ist. Das klappt prinzipiell... aber....
Wenn es sich um die letzte Zeile handelt und AutoAdvance aktiviert ist, bekomme ich nach dem Löschen der Zelle immer eine Range Exception - außer ich verlasse die Zelle mit Cursor-Up nach oben.
Ich weiß wirklich nicht, wie ich diese Exception abfangen soll (nein, ein try-except um das DeleteRow() reicht nicht), bzw. aus meiner Sicht dürfte das gar nicht erst eine Exception geben, sondern die aktive Zeile sollte einfach eins nach oben rutschen. Ich habe auch schon im Event-Handler versucht, sg.Row auf einen kleineren Wert zu setzen, das wird ignoriert.

Hat irgendwer eine Idee, wie man dem Anwender eine komfortable Möglichkeit geben kann, einfach eine Zeile zu löschen?

Schöne Grüße,
Sir Twist

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

Re: Stringgrid: Zeile löschen im EditingDone event

Beitrag von theo »

Manchmal hilft es, so etwas später auszuführen.
z.B. mit Application.QueueAsyncCall
https://wiki.lazarus.freepascal.org/Asynchronous_Calls
https://lazarus-ccr.sourceforge.io/docs ... ccall.html

wp_xyz
Beiträge: 5156
Registriert: Fr 8. Apr 2011, 09:01

Re: Stringgrid: Zeile löschen im EditingDone event

Beitrag von wp_xyz »

Ich kann das nicht nachvollziehen - siehe beigefügten Code:
  • In die Text-Zelle in der letzten Zeile gehen
  • Taste DEL
  • ENTER drücken, oder In die rechts benachbarte Zelle gehen, oder zum Edit oder Button auf dem Formular gehen - in jedem Fall verschwindet die letzte Zeile ohne Fehlermeldung.
Getestet mit Laz-trunk / FPC 3.2.2 (32 bit) bis runter zu Laz 1.4.4 / FPC 2.6.4 - alles funktioniert.

Bitte schreibe genau auf, was du machst.
Dateianhänge
editing_done_delete_row.zip
(2.03 KiB) 57-mal heruntergeladen

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Stringgrid: Zeile löschen im EditingDone event

Beitrag von Winni »

Hi!


Falls die Tipps der Kollegen nicht helfen, gibt es im StringGrid

Code: Alles auswählen

procedure DeleteRow(Index: Integer);
Winni

charlytango
Beiträge: 1063
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Stringgrid: Zeile löschen im EditingDone event

Beitrag von charlytango »

SirTwist hat geschrieben: Do 4. Nov 2021, 16:39 Hat irgendwer eine Idee, wie man dem Anwender eine komfortable Möglichkeit geben kann, einfach eine Zeile zu löschen?
Ich würde jetzt nicht wirklich auf die Idee kommen eine Zeile in einem Grid zu aufgrund des (in diesem Fall leeren) Inhalts zu löschen. Aber das ist möglicherweise nur mein naiver Zugang.
Löschen von Inhalten/Daten ist für mich immer sensibel und wird in meinen GUIs nicht implizit gemacht, denn ich möchte dass der Benutzer weiß was er da gerade tut.

Varianten die ich dem Benutzer z.B. anbiete (manchmal eine, mehrere oder alle - mit Actions geht das hervorragend)
  • Button außerhalb des Grids zum Löschen einer gerade aktiven zeile
  • In die Gridzeile einen Button zum Löschen einbauen
  • Kontextmenü auf Rechtsklick

Antworten