Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-02-2004
Majo Majo is offline
Miembro
 
Registrado: jun 2003
Posts: 43
Poder: 0
Majo Va por buen camino
Cool Guardar en un archivo el vector de componentes de una form

Hola amigos,

Tengo el siguiente problema, espero puedan colaborarme

Tengo cierta cantidad de componentes que se crean en tiempo de ejecución sobre una form. Lo que deseo hacer, es guardar el vector de componentes de la form en un archivo, para luego poder cargarlo en una form diferente.

Entiendo que el vector de componentes es un array dinámico. No se si este hecho produzca un problema al leer el archivo con la siguiente linea

ComponentesPrueba:array of TComponents;
...
FileRead(FileHandle,ComponentesPrueba,SizeOf(ComponentesPrueba));

La lectura me funciona con cualquier variable que no sea del tipo String ó array dinámico.

Si alguien me puede sacar de dudas ó de el error se lo agradecería enormemente

suerte.....
Responder Con Cita
  #2  
Antiguo 14-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Majo
La lectura me funciona con cualquier variable que no sea del tipo String ó array dinámico.
Un String o arreglo dinámico son realmente punteros de manera que SizeOf siempre te dará 4.

De cualquier manera no entiendo cómo es que intentas guardar y leer las componentes ya que cada componente es también un puntero.

Te voy a recomendar que leas este hilo:

http://www.clubdelphi.com/foros/showthread.php?t=1334

de donde creo puedes tomar ideas para hacer lo que quieres. En breve resumen, lo que ahí propongo es un método que usa lo mismo que el IDE de Delphi para guardar las componentes de un formulario durante el diseño y que te evita mantener tú mismo un arreglo de las componentes que se van insertando durante la ejecución.

// Saludos
Responder Con Cita
  #3  
Antiguo 16-02-2004
Majo Majo is offline
Miembro
 
Registrado: jun 2003
Posts: 43
Poder: 0
Majo Va por buen camino
Veo que lo propusiste en este hilo es muy parecido o igual a lo que yo deseo hacer.

Intentaré hacerlo y luego te cuento como me fue,

Gracias Roman por sacarme del error, y perdona mi ignorancia.....


.... Todos los días estamos para aprender
Responder Con Cita
  #4  
Antiguo 16-02-2004
Majo Majo is offline
Miembro
 
Registrado: jun 2003
Posts: 43
Poder: 0
Majo Va por buen camino
Roman....

leï el hilo que dijiste y lo aplique a mi caso, aparentemente funcionaba, pero al examinar cada componente cargado me di cuenta que no cargaba ciertas propiedades y varibles que yo había definido en ese componente y que el usuario cambió en tiempo de ejecución.

Por ejemplo, uno de los componentes es TGenerador el cual tiene una variable publica llamada KVnominal, el usuario modifica este valor en tiempo de ejecución y guarda.... cuando carga el archivo este Valor de KVNominal sigue con el valor por defecto e igual sucede con la mayoría de las variables y propiedades de cada objeto.

No se que pasa, si podes ayudarme, te lo agradezco.....
Responder Con Cita
  #5  
Antiguo 16-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Las únicas propiedades que pueden guardarse son las propiedades publicadas. Intenta pasar las variables que quieres a la secciòn published del formulario.
Responder Con Cita
  #6  
Antiguo 17-02-2004
Majo Majo is offline
Miembro
 
Registrado: jun 2003
Posts: 43
Poder: 0
Majo Va por buen camino
Tengo una propiedad publicada llamada Color, y esta funciona.

....y tengo una propiedad, también publicada , llamada PermisoArrastrar que es de tipo Boolean y esta no funciona, entonces no se que pasa.
Responder Con Cita
  #7  
Antiguo 17-02-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
¿No tendra un Default o Stored?
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #8  
Antiguo 17-02-2004
Majo Majo is offline
Miembro
 
Registrado: jun 2003
Posts: 43
Poder: 0
Majo Va por buen camino
Si tenía un default, cuando se lo quite funcionó.

Ahora el problema es con una propiedad que se estructura así:

type TPointArray=Array of TPoint;
....

private
FMatImage:TPointArray;
procedure SetMatImage(const valor:TPointArray);
....

published
property MatImage:TPointArray Read FMatImage write SetMatImage;
....

Implementation

procedure TElemento.SetMatImage(Valor:TPointArray);
var I:Integer;
begin
SetLength(FMatImage,Length(Valor));
for i:=0 to Length(FMatImage) do
begin
FMatImage[i].X:= valor[i].X;
FMatImage[i].Y:= valor[i].Y;
end;
end;

... el problema que se genera es que esta propiedad se escribe bien durante el proceso de ejecución pero al guardarla en un archivo y recuperándola de nuevo, ya no queda con el valor que se guardó. Lo mismo me sucede con las otras propiedades del tipo array dinámico.....
Responder Con Cita
  #9  
Antiguo 17-02-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por Majo
Si tenía un default, cuando se lo quite funcionó.
Pero tendrías que evaluar si quitarlo o no, posiblemente este bien que no guarde esta propiedad porque precisamente es el valor por default. ¿No?

¿Esas propiedades se están guardando bien en el DFM?
¿Has definido la forma de guardar estos datos? (DefineProperties)

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #10  
Antiguo 17-02-2004
Majo Majo is offline
Miembro
 
Registrado: jun 2003
Posts: 43
Poder: 0
Majo Va por buen camino
Haber si me hago entender bien...

Lo del Default era de una propiedad de tipo Boolean que comenté anteriormente. Ésta última es otra propiedad y es del tipo array dinamico, creo que es por eso que me crea conflicto.

La forma de guardar es con writeComponent(TForm1)... estoy guardando todos los objetos que están sobre la form1. Lo que pasa es que los objetos me los guarda a medias... entre otras las propiedades del tipo array dinámico no se almacenan correctamente.
Responder Con Cita
  #11  
Antiguo 17-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
El problema es que con este método no puedes manejar este tipo de componentes; los arreglos no pueden ser propiedades publicadas.

// Saludos
Responder Con Cita
  #12  
Antiguo 17-02-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por roman
El problema es que con este método no puedes manejar este tipo de componentes; los arreglos no pueden ser propiedades publicadas.
Yo diría que no pueden ser fácilmente propiedades publicadas, pero si defines un editor de propiedades y la forma de guardar y leer esta propiedad del DFM (DefineProperties), puedes hacerlo.
Igualmente te recomiendo evaluar, si en lugar de un array te conviene tener una colección o similar.


Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #13  
Antiguo 17-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por delphi.com.ar
Yo diría que no pueden ser fácilmente propiedades publicadas
Corrígeme si me equivoco, y muy bien puede ser así. ¿Qué la frase correcta no sería:

"Las propiedades no publicadas no pueden ser fácilmente guardadas en el dfm."

Es decir, me parece que de cualquier forma estas propiedades no podrán aparecer en la sección published y por ende no pueden ser almacenadas con este mecanismo facilmente, a menos que se proceda como indicas.

// Saludos
Responder Con Cita
  #14  
Antiguo 17-02-2004
Majo Majo is offline
Miembro
 
Registrado: jun 2003
Posts: 43
Poder: 0
Majo Va por buen camino
Cuando declaré la propiedad así
property MatImage:Array of TPoint read FMatImage write SetMatImage;salió un error
pero cuando la declaro así

Type TPointArray=Array of TPoint;
property MatImage:TPointArray read FMatImage write SetMatImage;
no sale error al compilar.

Sino sale error porque no se puede hacer.

Mi gran problema es que no es la única propiedad de tipo array dinamico que necesito manejar, hay otras que incluso son del tipo "array of variant", que me permite manejar números complejos.


Entonces la pregunta es
¿Como almaceno componentes con propiedades del tipo array dinamicos en
el disco duro para luego cargarlos con los cambios que el usuario haya hecho?
Responder Con Cita
  #15  
Antiguo 17-02-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por roman
"Las propiedades no publicadas no pueden ser fácilmente guardadas en el dfm."

Es decir, me parece que de cualquier forma estas propiedades no podrán aparecer en la sección published y por ende no pueden ser almacenadas con este mecanismo facilmente, a menos que se proceda como indicas.
Exacto!.. Creo que la compliqué en mi mensaje ¿No?
Les recomindo ver el código del TStringGrid como ejemplo.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.

Última edición por delphi.com.ar fecha: 17-02-2004 a las 17:54:30.
Responder Con Cita
  #16  
Antiguo 17-02-2004
Majo Majo is offline
Miembro
 
Registrado: jun 2003
Posts: 43
Poder: 0
Majo Va por buen camino
¿donde esta el código del TStringGrid?. ¿Está en la carpeta Fuentes de Borland o acá en el club delphi?
Responder Con Cita
  #17  
Antiguo 17-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por delphi.com.ar
Les recomindo ver el código del TStringGrid como ejemplo.
Ok. Ya lo hice. ReadData y WriteData se encargan de guardar y leer las cadenas usando al Writer y al Reader y, en efecto, estaba equivocado.

Sólo una pregunta: ¿es necesario usar DefineProperties o ésto sólo es necesario si la propiedad no está publicada?

// Saludos
Responder Con Cita
  #18  
Antiguo 17-02-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
En la unit Grids, de los fuentes de Delphi. Si pegas TStringGrid en un form, vas a la declaración del mismo, y haces Ctrl+Click sobre el nombre de la clase, el IDE te llevará a la definición de la clase.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #19  
Antiguo 17-02-2004
Majo Majo is offline
Miembro
 
Registrado: jun 2003
Posts: 43
Poder: 0
Majo Va por buen camino
Hola amigos,

Ya descubrí porque no guarda ciertas propiedades del objeto,

Resulta que cuando el objeto se está cargando de un archivo del disco duro,
inmediatamente se ejecuta el metodo Create de dicho objeto, y es allí donde yo asigno ciertas propiedades por defecto, lo que quiere decir que así se hayan guardado éstas propiedades, igual se van a sobreescribir con los valores por defecto. Y no solo se ejecuta el método create, también se ejecuta los procedimientos de escritura de las propiedades.


Si alguien puede sacarme del apuro se lo agradecería enormemente, que hago para que esto no suceda?


Gracias...
Responder Con Cita
  #20  
Antiguo 17-02-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cuando se crea el componente, en el cosntructor se cargan las porpiedades por defecto, pero inmediatamente despues, se tienen que asignar los valores que tenías guardados en el archivo.
¿Porqué no nos muestras el código que estas utilizando?
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 16:41:55.


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
Copyright 1996-2007 Club Delphi