Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Gran lío con el stringlist y el TstringList (https://www.clubdelphi.com/foros/showthread.php?t=55621)

sac 22-04-2008 15:11:49

Gran lío con el stringlist y el TstringList
 
Hola gente, tengo un problema que debería ser sencillo de resolver.
estoy trabajando por primera vez con un stringgrid. :eek:
Me dijeron que tengo que usar la clase TstringList que es donde se puede usar el loadfromfile y el savetofile ya que el stringgrid no cuenta con esas opciones.
Ahora ¿como hago para abrir desde el Tstringgrid hacia el Stringgrid y guardar desde el Stringgrid al Tstringlist todo con la extension txt? :confused: porque yo quiero hacer un XXX.savetofile(savedialog1.filename) o un XXX.loadfromfile(opendialog1.filename) pero no abre ni guarda nada de lo que hago en el stringlist. (XXX sería el Tstringgrid que cree y declaré en el private).

Ojala puedan ayudarme.

poliburro 22-04-2008 16:20:31

Cita:

Empezado por sac (Mensaje 281687)

Me dijeron que tengo que usar la clase TstringList que es donde se puede usar el loadfromfile y el savetofile ya que el stringgrid no cuenta con esas

Pero por supuesto que las tiene incorporadas, aunque el enfoque es más orientado a un arreglo multidimencional.

Un stringgrid posee los miembros Columns y rows que son de tipo TStringGrid.
Cada Rows implemente por consecuenta el método LoadFromFile y SaveToFile.

Saludos,

Caro 22-04-2008 17:06:00

Hola sac, tienes que recorrer todo tu StringGrid e ir almacenando lo que tienes de alguna forma.

Ejemplo:

Código Delphi [-]
var
 i,j      :Integer;
 Linea  : String;
 slFile  : TStringList;
begin
 slFile := TStringList.Create;
 for i:=0 to StringGrid1.RowCount-1 DO
  begin
   Linea:='';
   for j:=0 to StringGrid1.ColCount-1 DO
    begin
     Linea:=Linea+' '+StringGrid1.Cells[i,j];
    end;
    slFile.Add(Linea);
  end;
 slFile.SaveToFile('C:\Archivo.txt');

tu lo mejoras.

Saluditos

juanelo 22-04-2008 17:09:20

Creo que si lo que quieres es salvar en un archivo de texto y luego recuperarlo en un dbgrid, una buena alternativa y mucho menos liada es hacerlo mediante un ClientDataSet. Este tiene metodos para salvar como XML y para cargar desde XML.

Neftali [Germán.Estévez] 22-04-2008 17:54:21

En mi página web, en la sección de ejemplos, también tienes uno titulado: "Color y alineación en celdas de un StringGrid"; A parte de lo que comenta el título, tiene el código para leer datos de un fichero de disco; Está con código fuente, así que puedes descargarlo, verlo y probarlo con detalle.

sac 22-04-2008 19:34:04

1,2,3, probando, probando
 
Gracias a todos por sus respuestas. Estoy probando con algunas sugerencias que me dieron. Cuando encuentre la respuesta correcta les aviso desde ya gracias de nuevo.

poliburro 22-04-2008 20:13:19

Cita:

Empezado por juanelo (Mensaje 281732)
Creo que si lo que quieres es salvar en un archivo de texto y luego recuperarlo en un dbgrid, una buena alternativa y mucho menos liada es hacerlo mediante un ClientDataSet. Este tiene metodos para salvar como XML y para cargar desde XML.


Esa opción si me gusta, Pero con ADO, por que si mal no recuerdo con el ClientDataSet debes cargar el Xtd o me equivoco?

juanelo 22-04-2008 20:22:00

Cita:

Empezado por poliburro (Mensaje 281808)
Esa opción si me gusta, Pero con ADO, por que si mal no recuerdo con el ClientDataSet debes cargar el Xtd o me equivoco?

No, el ClientDataSet es indpendiente de la base de datos que uses (de hecho puede ser inclusive XML la fuente de datos). Para usarlo como "contenedor" de datos basta crearle los campos al ClientDataSet y posteriormente en tiempo de ejecucion (se puede en tiempo de diseño) se crea con CreateDataSet, y ya de ahí lo tenemos como un dataset con toda su funcionalidad (insert, delete, update, etc ..). Pero si los datos los obtienes de una fuente de datos como un BD, entonces para eso está el DataSetProvider que es el encargado de "resolver" de donde vienen los datos (y tambien a donde se graban), en pocas palabras, es un capa que te independiza de la fuente de los datos.

poliburro 22-04-2008 20:30:47

Cita:

Empezado por juanelo (Mensaje 281809)
No, el ClientDataSet es indpendiente de la base de datos que uses (de hecho puede ser inclusive XML la fuente de datos). Para usarlo como "contenedor" de datos basta crearle los campos al ClientDataSet y posteriormente en tiempo de ejecucion (se puede en tiempo de diseño) se crea con CreateDataSet, y ya de ahí lo tenemos como un dataset con toda su funcionalidad (insert, delete, update, etc ..). Pero si los datos los obtienes de una fuente de datos como un BD, entonces para eso está el DataSetProvider que es el encargado de "resolver" de donde vienen los datos (y tambien a donde se graban), en pocas palabras, es un capa que te independiza de la fuente de los datos.


Igual que ADO. :P, puedes cargar Xml como un Dataset sin estar conectado necesariamente a una base de datos.

juanelo 22-04-2008 20:57:31

Cita:

Empezado por poliburro (Mensaje 281812)
Igual que ADO. :P, puedes cargar Xml como un Dataset sin estar conectado necesariamente a una base de datos.

La verdad es que nunca he usado ADO asi que si tu dices que se puede, pues magnifico, otra alternativa.;)

poliburro 22-04-2008 21:01:50

Cita:

Empezado por juanelo (Mensaje 281818)
La verdad es que nunca he usado ADO asi que si tu dices que se puede, pues magnifico, otra alternativa.;)


De hecho no solo puedes cargar Xml como Datasets sin conexión, sino que puedes ir más allá, puedes mantener un Dataset devuelto por la base de datos aún despúes de haber cerrado la conexión (Permitiendote ahorrar recursos). Te permite además obtener más de un Dataset a la vez.

Una chulada ADO pues :P.

juanelo 22-04-2008 23:52:43

Cita:

Empezado por poliburro (Mensaje 281820)
De hecho no solo puedes cargar Xml como Datasets sin conexión, sino que puedes ir más allá, puedes mantener un Dataset devuelto por la base de datos aún despúes de haber cerrado la conexión (Permitiendote ahorrar recursos). Te permite además obtener más de un Dataset a la vez.

Una chulada ADO pues :P.

Se me hace que ADO le copió a MIDAS :D, además de poder hacer eso que mencionas, los ClientDataSet manejan tipos de campo "especiales" como los agregados, que pueden ser usados para llevar la sumatoria (por ejemplo) de determinada columna, y se van actualizando automaticamente, de hecho pueden ser usados por niveles, es decir, puedes manterner las sumatorias de todos los registros de manera categorizada. Esto sin contar por supuesto con el imprecindible ApplyUpdates, que aplica cambios a la base de datos de manera "atomica". Puedes mantener relaciones mestro detalle y pueden ademas tener campos de tipo DataSet, es decir, dataset anidados. Espectacular.:p

poliburro 23-04-2008 03:40:01

Cita:

Empezado por juanelo (Mensaje 281848)
Se me hace que ADO le copió a MIDAS :D, además de poder hacer eso que mencionas, los ClientDataSet manejan tipos de campo "especiales" como los agregados, que pueden ser usados para llevar la sumatoria (por ejemplo) de determinada columna, y se van actualizando automaticamente, de hecho pueden ser usados por niveles, es decir, puedes manterner las sumatorias de todos los registros de manera categorizada. Esto sin contar por supuesto con el imprecindible ApplyUpdates, que aplica cambios a la base de datos de manera "atomica". Puedes mantener relaciones mestro detalle y pueden ademas tener campos de tipo DataSet, es decir, dataset anidados. Espectacular.:p

jajaja Quién le copió a quien? jajajajja

Exactamente eso puede hacer ADO, Ejemplo, La base de datos te devuelve un Dataset, Lo mantienenes en memoria despúes de cerrar la conexión agregas valores o realizas modificaciones y puedes entonces replicar las operacipones contra la base de datos estableciendo nuevamente la conexión.

Los campos calculados, por supuesto que los soporta ADO, los campos de tipo DAtaset por igual, aunque pierden sentido al poder manejar múltiples datasets sin necesidad de que sean campos. Sino instancias de ADo datasets.

A que origenes puedes conectar ADO?, pues imagina, va desde un csv hasta un Db2 corriendo en AS/400 (Ahora ISeries), pasando por muchos motores como Oracle, Mysql, MsSql, DataFlex, Access, Dbase, FoxPro, PostGress, Interbase, Etc, Incluyendo archivos de tipo Xml, Xls, xlsx.

En fin, cuando de establecer conexión con motores de bases de datos se trata, yo me quedo con ADO. (Para arquitecturas de más de dos capas, pues, dependerá de la tecnología a usar (SOAP, COM, DCOM, COM+, ETC). No me cierro a midas :P)

juanelo 23-04-2008 05:25:06

Cita:

Empezado por poliburro (Mensaje 281884)
jajaja Quién le copió a quien? jajajajja

Exactamente eso puede hacer ADO, Ejemplo, La base de datos te devuelve un Dataset, Lo mantienenes en memoria despúes de cerrar la conexión agregas valores o realizas modificaciones y puedes entonces replicar las operacipones contra la base de datos estableciendo nuevamente la conexión.

Los campos calculados, por supuesto que los soporta ADO, los campos de tipo DAtaset por igual, aunque pierden sentido al poder manejar múltiples datasets sin necesidad de que sean campos. Sino instancias de ADo datasets.

A que origenes puedes conectar ADO?, pues imagina, va desde un csv hasta un Db2 corriendo en AS/400 (Ahora ISeries), pasando por muchos motores como Oracle, Mysql, MsSql, DataFlex, Access, Dbase, FoxPro, PostGress, Interbase, Etc, Incluyendo archivos de tipo Xml, Xls, xlsx.

En fin, cuando de establecer conexión con motores de bases de datos se trata, yo me quedo con ADO. (Para arquitecturas de más de dos capas, pues, dependerá de la tecnología a usar (SOAP, COM, DCOM, COM+, ETC). No me cierro a midas :P)

No te habrás equivocado y estarás usando MIDAS? ... :p:D


La franja horaria es GMT +2. Ahora son las 21:35:16.

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