FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#21
|
||||
|
||||
Buenas a todos.
Pues ya están las pruebas realizadas y la verdad con bastante buen resultado (al menos para lo que yo pretendía). La explicación más extensa (con todo el código incluido y el ejemplo) la he añadido a una entrada en mi blob(Persistencia de una estructura de clases), donde está explicada con todos los detalles. De todas formas, ya que aquí salió la pregunta es lógico que explique los resultados. La conclusión en pocas palabras es: ¡¡¡QUE SI SE PUEDE!!! Como ya comenté se trataba de intentar guardar y restaurar el contenido de una estructura de clases en memoria sin tener que programar nada sobre las propias clases, para realizar este Backup/restore. La solución que intentaba probar, era la de utilizar los métodos que Delphi usa para guardar el contenido de un formulario en disco (en formato del DFM). La clave está en la utilización de las clases TCollection y TCollectionItem para las clases basadas en listas (que era lo que más dificultad se me antojaba que tendría). Tal y como comento en la entrada del blog, he tenido que modificar algo la definición de las clases (manteniendo la misma estructura) para conseguir que el proceso funcionara.
Os adjunto cómo ha quedado la definición definitiva de las clases.
Utilizando un par de procedimientos extraídos de la propia ayuda de embarcadero, que los muestra como código de ejemplo de la clase TMemoryStream, me ha bastado para realizar las dos accciones (Guardar y Restaurar).
Con los cambios en las clases y un par de líneas como estas:
Y para restaurar el contenido basta con esta:
Con estas líneas he conseguido generar con unos cuantos datos de ejemplo, un árbol como este:
Nada desdeñable, para haberlo hecho sin ninguna línea de código en las clases. LA CONCLUSIÓN: Bueno, a parte de que me daba "mandra" generar la implementación (no era esa la verdadera razón de no hacerlo) pues he satisfecho la curiosidad de ver que se podían realizar esta operaciones sin ninguna línea de código extra en las clases. También es importante conocer que el hecho de añadir nuevas propiedades a las clases (si se hace correctamente) implica que el procedimiento sigue funcionando sin ningún cambio, lo que hace que sea un método totalmente flexible. Otra cuestión a discutir sería si vale la pena la modificación de las clases o la sobrecarga que aporta a estas, el hecho de cambiar la estructura, pero como digo, eso es otro tema a discutir. Un saludo.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#22
|
||||
|
||||
Enhorabuena, Germán.
Cita:
Y creo que aumenta un poco el gran valor de esta solución que nos compartes, si añadimos que ya desde Delphi 7 (o quizá desde versiones anteriores) es posible implementarlo. Un saludo. |
#23
|
||||
|
||||
Cita:
Una pregunta. ¿Por qué conviertes a string? ¿No podrías guardar directamente a disco usando un FileStream? // Saludos |
#24
|
||||
|
||||
Cita:
En concreto esta está realizada en Delphi 6.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#25
|
||||
|
||||
Cita:
Una vez testeado y comprobado, se puede eliminar ese paso a la hora de guardar a disco (salgo que interese que la salida sea "visible" imagino).
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#26
|
||||
|
||||
El pasarlo a string deja, además, abierta la puerta para guardar estas serializaciones en una base de datos.
// Saludos |
#27
|
||||
|
||||
Sin demérito de lo ya expuesto, me permito una sosa observación.
Noto que declaras varios parámetros String sin usar Const, y es probable que algunos de ellos no sean modificados dentro de la rutina, o pasados por referencia desde ahí. Seguramente ya lo sabías, pero no está de más recordar que eso le genera cierta carga adicional al programa, muy ligera, pero al fin instrucciones de más que pueden ser evitadas con solo declarar dichos parámetros como constantes. Básicamente, si no lo hacemos así, el compilador añade instrucciones máquina para incrementar los contadores de referencias de las cadenas de caracteres. Veo incluso que la función StringToComponentProc que tomaste de muestra, al igual que su original StringToComponent que está en la ayuda de Delphi, también declara el parámetro Value sin usar Const, siendo que éste no es modificado ni pasado por referencia dentro de ella. Es algo muy raro de ver en otros métodos o rutinas de Borland / Embarcadero, como los que conforman la VCL, por ejemplo. Saludos. |
#28
|
||||
|
||||
Gracias por la observación, Al.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
POO - Guardar en disco objetos en tiempo de ejecución | hectoralejandro | OOP | 2 | 26-01-2012 23:23:16 |
Guardar un correo electronio en disco con MAPI | adebonis | API de Windows | 7 | 17-08-2007 23:47:01 |
saber si una unidad de disco es una memoria flash o memory stick | compaqdavid | Varios | 1 | 06-12-2006 14:07:10 |
Guardar estructura en tabla | JAV | Conexión con bases de datos | 7 | 19-04-2005 04:30:35 |
Capturar el evento de guardar en disco | magm2000 | Impresión | 1 | 29-07-2004 16:14:47 |
|