Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   STringGrid: cargar archivo previamente guardado. (https://www.clubdelphi.com/foros/showthread.php?t=43079)

amadis 01-05-2007 15:03:26

STringGrid: cargar archivo previamente guardado.
 
Como les Va Gente!

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

Código Delphi [-]
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.

Código Delphi [-]
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:

Código Delphi [-]
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

tienes buena memoria
 
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

Código Delphi [-]
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. :)

Código Delphi [-]
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

pues Si es lo mismo
 
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.

:)


La franja horaria es GMT +2. Ahora son las 23:53:32.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi