PDA

Ver la Versión Completa : STringGrid: cargar archivo previamente guardado.


amadis
01-05-2007, 15:03:26
Como les Va Gente!

Quisiera saber de que manera se puede leer un archivo creado con este procedimiento que encontré en el foro


procedure Guardar(Archivo: String; Grid: TStringGrid);
var
i: integer;
begin
with TStringList.Create do
try
for i:= 0 to Grid.RowCount - 1 do
Add(Grid.Rows[i].CommaText);
SaveToFile(Archivo);
finally
Free;
end;
end;


Encontre esta forma de leer archivos, a la cual el cambie el SEPARADOR por COMA, pero no respeta las columnas ni filas.


procedure TForm1.Button1Click(Sender: TObject);
Const
Separador = ' '; //Este es el caracter que utilizamos de separador;
Var
Fichero : TStrings;
Sig : Integer;
Pos : Integer;
Copy_Ini : Integer;
Copy_Fin : Integer;
Longitud : Integer;
cTemp : String;
I, J, K : Integer;
////////////////////
Function pos_str(Cad : String; Car: Char; Ini : Integer) : Integer;
var
Cnt :Integer;
Longitud :Integer;
begin
Result := 0;
Longitud := Length(cad);
Cnt := Ini;
repeat
Inc(Cnt);
//Controlamos el separador y saltos de línea
if (Cad[Cnt]=Car) or (Cad[Cnt]=#10) or (Cad[Cnt]=#13) then
begin
Result := Cnt -Ini;
break;
end;
until (Cnt > longitud) ;
end;
///////////////////////
begin
Fichero := TStringList.Create;
Fichero.LoadFromFile('Unit1.pas'); // Fichero a procesar
Longitud:=Length(Fichero.Text);
cTemp := Fichero.Text;
Fichero.Clear;
Pos:=0;

repeat
Sig := Pos_Str(cTemp,Separador,Pos);
if (sig=0) then break;
Inc(pos,sig);
copy_ini:=(pos-sig)+1;
copy_fin:=sig-1;
Fichero.Add(Trim(copy(cTemp,copy_ini,copy_fin)) );
until (sig=0);
//Acomodamos el StringGrid a la longitud del fichero, dependiendo del número de columnas.
StringGrid1.RowCount := (Fichero.Count -1) div StringGrid1.ColCount -1;
//Efectuamos el relleno del StringGrid

K := 0;
with StringGrid1 do
for I := 0 to ColCount - 1 do
for J:= 0 to RowCount - 1 do
begin
Cells[I,J] := Fichero[K];
inc(K);
end;

Fichero.Free;
end;
:confused:

luisgutierrezb
01-05-2007, 17:50:30
Pues creo que puede ser algo asi como:


procedure Abrir(Archivo: String; Grid: TStringGrid);
var
i: integer;
begin
with TStringList.Create do
try
LoadFromFile(Archivo);
Grid.RowCount := Count;
for i:= 0 to Count - 1 do
Grid.Rows[i].CommaText := Strings[i];
finally
Free;
end;
end;



lo hice de memoria asi que puede fallar algo, pero la idea espero que si se comprenda

amadis
01-05-2007, 18:19:28
No pensé que fuera tan simple.
ANtes había intentado algo así pero teniendo en cuenta las columnas y me pardía.

Lo que escribiste funciona bien pero el problema es que no se cuantas FILAS tengo en el archivo.(y la STringGrid la inicio vacía)

Entonces agregé un TSTRINGLIST que cargo con el archivo CSV, cuento las filas que tiene y la guardo en una variable.
Para luego incrementar la STRINGGRID al numero de filas que tiene el archivo.

Aquí está el codigo que permite cargar un CSV a un grid sin saber cuantas lineas tenemos en el archivo


var
i, filas: integer;
Fichero : TStrings;
begin
abrirfile.Execute;
Fichero := TStringList.Create;
Fichero.LoadFromFile(abrirfile.FileName); // Fichero a procesar
filas:= Fichero.Count;
Fichero.Free;
with TStringList.Create do
try
LoadFromFile(abrirfile.FileName);
STgrid.RowCount := filas;
for i:= 0 to Count-1 do
STgrid.Rows[i].CommaText := Strings[i];
finally
Free;
end;

dec
01-05-2007, 19:05:47
Hola,

¿Y esto no valdría igual? Pregunto. :)


var
i: integer;
begin
with TStringList.Create do
try
LoadFromFile(abrirfile.FileName);
STgrid.RowCount := Count;
for i:= 0 to Count-1 do
STgrid.Rows[i].CommaText := Strings[i];
finally
Free;
end;

amadis
01-05-2007, 23:52:30
No se que habría puesto antes que sólo me cargaba una fila del Grid.
Pensé que ese COUNT que inicialmente lo habia puesto tal como sugeria LuisGutierrezB era el count de rows de mi GRID (que estaba vacío)
Entonces creé un nuevo Stringlist para obtener el count.

Seguramente estaría mal generado el archivo con el que probaba o bien NO SE porque no me funcionó las veces que lo probé antes de cometer esa REDUNDANCIA.

:)