Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2014-02

Se puede guardar objetos en una tabla sqlite?

4 messages · 2 people ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Martin Gomez
to Maxi

2014-02-19 5:55 GMT-03:00 Maxi <maximiliano.duarte en gmail.com>:

Show quoted text 6 lines
Intento hacer que se guarden ciertos objetos que estan dentro de un scrollbox, para despues recrearlos al leer el registro. Necesito guardar todo, posiciomn y propiedades de ese momento incluso unos datos que voy a agregar como un record. Alguna idea?

?En teor�a podr�as "serializar" ?los objetos con fpjsonrtti del paquete fcl-json y guardarlos como texto, pero nunca lo he intentado.

Tambi�n acabo de encontrar que en Lazarus a eso se le llama "streaming" y est� en la wiki http://wiki.lazarus.freepascal.org/Streaming_components :)

Try not to become a man of success but rather to become a man of value. *Albert Einstein* ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140219/7c13dc36/attachment.html>

Reply by email

Maxi
to Martin Gomez

El 19 de febrero de 2014, 14:43, Martin Gomez <mmgomez en gmail.com> escribi�:

Show quoted text 22 lines
2014-02-19 5:55 GMT-03:00 Maxi <maximiliano.duarte en gmail.com>: > Intento hacer que se guarden ciertos objetos que estan dentro de un scrollbox, para despues recrearlos al leer el registro. > Necesito guardar todo, posiciomn y propiedades de ese momento incluso unos datos que voy a agregar como un record. > Alguna idea? En teor�a podr�as "serializar" los objetos con fpjsonrtti del paquete fcl-json y guardarlos como texto, pero nunca lo he intentado. Tambi�n acabo de encontrar que en Lazarus a eso se le llama "streaming" y est� en la wiki http://wiki.lazarus.freepascal.org/Streaming_components :) -- Try not to become a man of success but rather to become a man of value. Albert Einstein _______________________________________________ Lazarus-es mailing list Lazarus-es en lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es

Gracias Martin.
Tengo un par de ejemplos, pero no logro recorrer los objetos dentro de un panel o un scrollbox. como que scrollbox.componentcount siempre devuelve 0.

Tambien encontr� este ejemplo que los transforma a texto, pero tengo que saber que objeto voy a crear al leer el archivo.

http://www.i-griegavcl.com/componentes.html
----------------------------------------------------------------------

Con las siguientes funciones y procedimientos vamos a poder guardar/recrear la definici�n (valor de propiedades, objetos) de un componente concreto y asign�rselo al mismo objeto o a otro de la misma clase.

Las funciones y procedimientos que necesitaremos para hacer esto tendr�n que permitirnos :

Pasar de la definici�n binaria del componente a la texto. El paso contrario, de la definici�n textual a la binaria. Grabar la definici�n textual en un fichero (la textual porque as� podremos editarla, si queremos, con un editor de texto). Leer la definici�n textual desde un fichero.

Las funciones y procedimientos entonces ser�n los siguientes :

function ComponentToString(Component: TComponent): string

Esta funci�n transformar� un componente en un string, o sea la definici�n de las propiedades y objetos de un componente a una cadena de caracteres.

function ComponentToString(Component: TComponent): string;
var
   BinStream:TMemoryStream; // Stream de memoria
   StrStream: TStringStream; // Stream de cadena
   s: string;
begin
   BinStream := TMemoryStream.Create;
   try
      StrStream := TStringStream.Create(s);
      Try
         // Inicia la escritura del componente en el stream de memoria
         // con representaci�n binaria
         BinStream.WriteComponent(Component);
         // Coloca el puntero al principio del stream
         BinStream.Seek(0, soFromBeginning);
         // Transforma el objeto de binario a texto
         ObjectBinaryToText(BinStream, StrStream);
         // Coloca el puntero al principio del stream
         StrStream.Seek(0, soFromBeginning);
         // Devuelve el componente en una cadena
         Result:= StrStream.DataString;
      finally
         StrStream.Free;
      end;
   finally
      BinStream.Free
   end;
end;

El siguiente procedimiento har� lo contrario, es decir, transformar una cadena en un componente. Logicamente la cadena debe contener la definici�n correcta de un componente.

procedure StringToComponent(Component: TComponent;Value: string);
procedure StringToComponent(Component: TComponent;Value: string);
var
   StrStream:TStringStream;
   BinStream: TMemoryStream;
Begin
   // Crea el stream de cadena partiendo del valor pasado al procedimiento
   // que ser� la cadena que contiene la definici�n del componente
   StrStream := TStringStream.Create(Value);
   Try
      BinStream := TMemoryStream.Create;
      Try
         // Transforma el objeto de texto a binario
         ObjectTextToBinary(StrStream, BinStream);
         // Coloca el puntero al principio del stream
         BinStream.Seek(0, soFromBeginning);
         // Crea el componente partiendo de objeto binario de memoria
         BinStream.ReadComponent(component);
      Finally
         BinStream.Free;
      end;
   finally
      StrStream.Free;
   End;
end;

El siguiente procedimiento graba la definici�n de un componente (propiedades y/u objetos que le pertenezcan) en un fichero que se le pasa como par�metro.

Procedure SaveComponent(Component:
TComponent;filename:tfilename;obsave:boolean=true);
D�nde : Component : Componente cuya definici�n queremos grabar
Filename : Ruta completa del fichero en el que grabaremos la
definici�n del componente
Obsave : Se graban tambi�n los objetos que le pertenezcan(true) o no(false)
Procedure SaveComponent(Component: TComponent;filename:tfilename;
obsave:boolean=true);
var
   S:tstringlist;
   i,i1,i2:integer;
begin
   s:=tstringlist.Create;
   // Transformamos el componente en su definici�n textual
   s.Add(ComponentToString(Component));
   // Si no queremos grabar las definiciones de los objetos de los
cuales es padre
   if not obsave then
   begin
      s.SaveToFile(filename);
      s.LoadFromFile(filename);
      i:=1;
      // En las definiciones de los objetos, primero est�n las propiedades del
      // objeto y despu�s el resto de objetos que le pertenecen, por lo que
      // borramos todas las l�neas a partir de que encontremos la
palabra ?OBJECT?
      // menos la �ltima l�nea que contendr� el finalizador (end).
      while (pos('OBJECT',uppercase(s.Strings[i]))=0) and (i<s.Count-1) do
         i:=i+1;
         if pos('OBJECT',uppercase(s.Strings[i]))>0 then
         begin
            i2:=(s.Count-3)-i;
            for i1:=0 to i2 do s.Delete(i);
         end;
      end;
   s.SaveToFile(filename);
   s.Free
end;

El siguiente procedimiento leer� desde un fichero la definici�n y se la asignar� a un componente.

Procedure LoadComponent(Component:TComponent;filename:tfilename);
Procedure LoadComponent(Component:TComponent;filename:tfilename);
var
   S:tstringlist;
   i:integer;
   cad:string;
begin
   cad:='';
   s:=tstringlist.Create;
   // Carga la definici�n
   s.LoadFromFile(filename);
   // Sustituye el nombre del objeto (se le puede asignar a cualquier objeto
   // de la misma clase o que siendo de distinta clase tenga las
mismas propiedades
   s.Insert(1,'object '+component.Name+': '+component.ClassName);
   for i:=1 to s.Count-1 do
      cad:=cad+s.Strings[i]+#10;
      try
         // recrea el objeto
         StringToComponent(component,cad);
      finally
         s.Free
      end;
end;
El que pregunta aprende, y el que contesta aprende a responder. No a la obsolecencia programada: http://www.rtve.es/noticias/20110104/productos-consumo-duran-cada-vez-menos/392498.shtml Linux User #495070 http://domonetic.com/blog

Reply by email

Martin Gomez
to Maxi

2014-02-19 15:10 GMT-03:00 Maxi <maximiliano.duarte en gmail.com>:

Tengo un par de ejemplos, pero no logro recorrer los objetos dentro de un panel o un scrollbox. como que scrollbox.componentcount siempre devuelve 0.

Creo que para componentes "hijos" tenes que usar ControlCount?? y leer la propiedad Controls[]

Tambien encontr� este ejemplo que los transforma a texto, pero tengo que saber que objeto voy a crear al leer el archivo.

?Podes crear un Objeto TObject, leerlo y luego preguntar "if Objeto *is*TmiClase" y asignarlo a una instancia de TmiClase?. Necesitar�as un if para cada tipo de componente que grabes a disco, pero es mejor que nada.

Try not to become a man of success but rather to become a man of value. *Albert Einstein* ------------ pr�xima parte ------------ Se ha borrado un adjunto en formato HTML... URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus-es/attachments/20140219/c50cfe67/attachment.html>

Reply by email