TStringgrid : DeleteRow

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

TStringgrid : DeleteRow

Beitrag von malabarista »

Ich habe ein TStringgrid mit 6 Spalten und mehreren Zeilen (=mehr als zwei).
Über die Zahl in der 6.Spalte wird die Reihenfolge der Anzeige der einzelnen Zeilen gesteuert: es ist die Positionsangabe.

Wenn beim Editieren einer Zelle in der 6.Spalte eine 0 eingegeben wird, wird diese Zeile mittels DeleteRow gelöscht.

Wenn dies die letzte Zeile in diesem TStringgrid ist, wird anschliessend aber nur noch die ehemals (=vor dem Löschen) vorletzte Zeile angezeigt.
Die anderen Zeilen fehlen in der Anzeige.
Konkretes Beispiel: ich habe vier Zeilen und gebe in der letzten die 0 ein. Anschliessend wird nur die Zeile 3 angezeigt, obwohl die Zeilen 1 und 2 noch vorhanden sind.

Ein interner Testausdruck zeigt aber, dass die anderen Zeilen vorhanden sind und auch der rowCount korrekt ist.
Nur die Anzeige stimmt nicht.

Wenn ich dagegen eine andere Zeile als die letzte auf diese Art lösche, ist die Anzeige immer korrekt.

Code: Alles auswählen

 
procedure TFrezpos.onedit_fertig(Sender: TObject);
 
var
  col,row:integer;
  i:integer;
  y:integer;
 
begin
  col:=liste.Col;
  row:=liste.Row;
  y:=row;
  if col=5 then
     begin
     i:=int_einlesen(liste.cells[5,y]);
     if i=0 then
        begin
        test_ausdruck('rowcount =',liste.rowcount);
        liste.deleterow(y);
        test_ausdruck('rowcount =',liste.rowcount);
        end;
     liste.SortColRow(true, 5);
     end;
end;                                 
 


Interner Testausdruck:
rowcount =4
rowcount =3

Oder darf man innerhalb des OnEditDone die betreffende Zeile nicht löschen ?

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

Re: TStringgrid : DeleteRow

Beitrag von wp_xyz »

Vielleicht fehlt nur ein liste.Invalidate, um das komplette Grid neu auszugeben. Ansonsten wäre ein Demoprojekt gut, um das konkret nachvollziehen zu können.

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: TStringgrid : DeleteRow

Beitrag von malabarista »

So, jetzt habe ich ein Demoprojekt gemacht, bei dem dieser Effekt auftritt.

Wichtig scheint dabei die Anzahl der Spalten zu sein: mit 4 Spalten verhält sich das Grid korrekt, mit 6 Spalten nicht mehr.

Demoprojekt starten und dann die Zelle mit der 4 anklicken, eine 0 eingeben und dann ENTER.
Anschliessend wird nur noch eine Zeile angezeigt.
Warum ?
Dateianhänge
testgrid.zip
(124.59 KiB) 75-mal heruntergeladen

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

Re: TStringgrid : DeleteRow

Beitrag von wp_xyz »

Mit Lazarus Trunk verhält sich das Demo-Projekt normal: Wenn ich in der Zelle mit der "4" eine "0" eingegeben habe, verschwindet diese Zeile, und es bleiben drei Zeilen übrig. Lazarus 1.6.4 und 1.6.2 verhalten sich anders, aber auch anders als von dir beschrieben: Nach der Eingabe der "0" wird die Zeile gelöscht, aber die 1.Zeile ist nun doppelt, so dass die Anzahl der Zeilen konstant bleibt. In die erste Zeile kann man nicht mehr klicken. Seltsam...

Welche Lazarus-Version hast du? Probier mal Trunk (oder warte ein paar Wochen, dann kommt der RC1 von Version 1.9, der den Fix enthalten sollte). Welches Betriebssystem (ich: Windows)?

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: TStringgrid : DeleteRow

Beitrag von malabarista »

Ich habe:
Linux Mint 18.1, 64bit L1.6.2-1 FPC 3.0.0

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

Re: TStringgrid : DeleteRow

Beitrag von wp_xyz »

Leider habe ich auf der Linux-Mint-VM keinen aktuellen Trunk. Meine Version zeigt das Verhalten von 1.6.2/1.6.4 von Windows: Die Zeile wird gelöscht, aber es erscheint eine zusätzliche, nicht selektierbare Zeile ganz oben, so dass die Anzahl der Zeilen offenbar konstant bleibt.

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: TStringgrid : DeleteRow

Beitrag von malabarista »

Nach meiner Auffassung ist es ein Anzeigeproblem.

Denn ich habe mal alle Zellen nach dem deleterow in eine Datei ausgedruckt: die sind alle korrekt da.
Aber die Anzeige ist ziemlich daneben.

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: TStringgrid : DeleteRow

Beitrag von malabarista »

Ist dieses Problem inzwischen gefixt ?

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

Re: TStringgrid : DeleteRow

Beitrag von theo »

malabarista hat geschrieben:Ist dieses Problem inzwischen gefixt ?


Bei mir funktioniert es.

Lazarus 1.9.0 r55514M FPC 3.0.2 x86_64-linux-gtk2
OpenSuse Leap 42.2
gtk2-devel 2.24.31-12.1

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

Re: TStringgrid : DeleteRow

Beitrag von wp_xyz »

Mit dem aktuellen Trunk scheint das Problem auf Linux Mint behoben zu sein. Ob der fix in der kommenden Version 1.8 enthalten ist, kann ich nicht sagen - kannst du mit dem RC3 aber einfach selbst ausprobieren.

Antworten