¿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);
Mostrando entradas con la etiqueta StringGrid. Mostrar todas las entradas
Mostrando entradas con la etiqueta StringGrid. Mostrar todas las entradas
viernes, 24 de enero de 2020
sábado, 2 de septiembre de 2017
Cargar un archivo CSV en un StringGrid
Una vez puesto en el Form un componentes TStringGrid y un TButton y haber ajustado un par de propiedades desde el inspector de objetos, solo es necesario escribir una línea de código.
StringGrid1.LoadFromCSVFile('archivo.csv',' ',False,0,True);
Para este caso quité tanto la columna como la fila fija, la cantidad de columnas viene por default en 5 y el tamaño de las celdas lo fijé en 80, nada más. El archivo que carga contiene 50.000 filas y pesa 1,5 MB. Lo carga en aproximadamente 5 segundos.
El procedimiento LoadFromCSVFile:
procedure LoadFromCSVFile (
AFilename: string;
ADelimiter: Char=',';
UseTitles: boolean=true;
FromLine: Integer=0;
SkipEmptyLines: Boolean=true);
Como podemos observar, varios parámetros, al ya tener un valor asignado, son opcionales.
AFilename: el nombre del archivo, si no está en el mismo directorio que el programa, debe especificarse la ruta completa.
ADelimiter: el delimitador o separador de campos, al ser del tipo Char admite un solo caracter.
UseTitles: Si es True entonces respetará la primera fila como títulos de los campos comenzando la carga de datos en la siguiente, o sea, no la importa, caso contrario comenzará por la fila 0 (cero). Esto se refiere al archivo, es decir, si la primera fila del archivo son los títulos de las columnas.
FromLine: desde qué línea comienza la importación del archivo CSV.
SkipEmptyLines: si es True, entonces si encuentra una línea vacia, la ignora, de lo contrario, la cargará en blanco.
Código completo del ejemplo:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
StringGrid1: TStringGrid;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.LoadFromCSVFile('archivo.csv',' ',False,0,True);
end;
end.
Código fuente para descargar: CSV a StringGrid.7z
StringGrid1.LoadFromCSVFile('archivo.csv',' ',False,0,True);
Para este caso quité tanto la columna como la fila fija, la cantidad de columnas viene por default en 5 y el tamaño de las celdas lo fijé en 80, nada más. El archivo que carga contiene 50.000 filas y pesa 1,5 MB. Lo carga en aproximadamente 5 segundos.
El procedimiento LoadFromCSVFile:
procedure LoadFromCSVFile (
AFilename: string;
ADelimiter: Char=',';
UseTitles: boolean=true;
FromLine: Integer=0;
SkipEmptyLines: Boolean=true);
Como podemos observar, varios parámetros, al ya tener un valor asignado, son opcionales.
AFilename: el nombre del archivo, si no está en el mismo directorio que el programa, debe especificarse la ruta completa.
ADelimiter: el delimitador o separador de campos, al ser del tipo Char admite un solo caracter.
UseTitles: Si es True entonces respetará la primera fila como títulos de los campos comenzando la carga de datos en la siguiente, o sea, no la importa, caso contrario comenzará por la fila 0 (cero). Esto se refiere al archivo, es decir, si la primera fila del archivo son los títulos de las columnas.
FromLine: desde qué línea comienza la importación del archivo CSV.
SkipEmptyLines: si es True, entonces si encuentra una línea vacia, la ignora, de lo contrario, la cargará en blanco.
Código completo del ejemplo:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
StringGrid1: TStringGrid;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.LoadFromCSVFile('archivo.csv',' ',False,0,True);
end;
end.
Código fuente para descargar: CSV a StringGrid.7z
Suscribirse a:
Entradas (Atom)