viernes, 24 de enero de 2020

TStringGrid: borrar filas.

¿Por qué no hay un método (procedimiento o función) para eliminar todas la filas de un StringGrid excepto las fijas? Porque con StringGrid1.RowCount:=1; alcanza, dejando la primera fila únicamente, siendo ésta la fija (los títulos de las columnas), si se tratara de una grilla sin fila fija, entonces sería StringGrid1.RowCount:=0; casi siempre se utiliza la primer fila para los títulos de las columnas, la fila 0 (cero), de esta forma se conservan las propiedades de las columnas.

Otras formas de borrar filas:

DeleteRow(nroFila) donde nroFila es un entero, simplemente borra dicha fila.
Clear: Borra todo, no queda nada.

Borrar ciertas filas en base a una condición.

Lo primero a tener en cuenta es saber que utilizando un for to no vamos a ningún lado, por ejemplo:

for i:=0 to StingGrid1.RowCount-1 do
  if condicion then StringGrid.DeleteRow(i);

nos dará un error en timepo de ejecución; veamos por qué:

Supongamos que tenemos una grilla con 3 filas sin filas fijas, de la 0 a la 2 y sin ninguna condición usamos el método anterior. La propiedad RowCount-1 será 3-1=2 entonces el ciclo for será de 0 a 2, hasta ahí vamos bien.

En la primera iteración:
for i:=0 to StingGrid1.RowCount-1 do //i=0 y RowCount=2 es decir de 0 a 2
  StringGrid.DeleteRow(i); //Borra la fila 0

en la segunda iteración:
for i:=0 to StingGrid1.RowCount-1 do //i=1 y RowCount=1 es decir de 1 a 1
  StringGrid.DeleteRow(i); //Borra la fila 1

en la tercera iteración:
for i:=0 to StingGrid1.RowCount-1 do //i=2 y RowCount=1 es decir de 2 a 1 //---->ERROR<----
  StringGrid.DeleteRow(i); //Borra la fila 0

La forma correcta es mediante for downto. Supongamos una grilla de n filas con la primera de ellas fija la cual no borraremos, entonces:

for i:=StringGrid.RowCount-1 downto 1 do //el ciclo no llega a la fila 0.
  StringGrid.DeleteRow(i);

y con un condicional sería lo mismo pero agregando la condición:

for i:=StringGrid.RowCount-1 downto 1 do //el ciclo no llega a la fila 0.
  if condicion then
    StringGrid.DeleteRow(i);

1 comentario: