![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Cita:
![]() Pero es que me daba mandra y me entró la curiosidad... Al final estoy viendo que es bastante problabe que tenga que hacer algún recorrido.
__________________
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. |
|
#2
|
||||
|
||||
|
Cita:
Si en verdad se puede volcar un objeto, de forma genérica, a un archivo XML (o uno cualquiera) sin usar RTTI ¿puedo pedir una muestra de tu parte? Porque a menos que el árbol de jerarquía al que se enfrente Neftali sea pequeño y sus clases no tengan demasiada complejidad pues allí si podría imaginarme una alternativa casera, y sin usar RTTI... pero a la larga me sentiría como que estoy haciendo doble (o triple) trabajo. Mi versión casera sería la siguiente: 1) En la clase base de mis clases "persistentes" (si es que la hay) declaro un método Materialize abstracto. 2) Luego en cada clase concreta le doy la implementación adecuada y me pongo como loco, propiedad a propiedad, o atributo por atributo a pasar los datos al archivo. Algo como:
Y si... no hay un gramo de RTTI pero, ¿En serio consideras algo práctico esto? Y Mira que entiendo que podría ser una salida muy fácil y simple (y hasta cierto punto, "económica")... ¡De veras estoy intentandolo llegar al principio KIS! ![]() De poder se puede... pero, hasta donde tengo entendido me parece que esto es justamente lo que quiere evitar Neftali y busca algo que sea más genérico y le haga más directa la cosa. De allí que a que yo diga... "Pos, no queda otra... todo apunta a roma". ![]() Saludos, PD: No se porqué pero si escribo dentro de las etiquetas delphi las < y /> me elimina el texto interno. Seguramente es por una cuestión de seguridad En mi código debiera leerse '<Algo>' y '</Algo>'. Como si estuviera escribiendo un XML a los pelos.Última edición por Delphius fecha: 07-03-2013 a las 15:47:55. |
|
#3
|
||||
|
||||
|
Cita:
Se debe a un problema existente en la interface del editor de mensajes cuando tenes seleccionado "Interfaz Mejorada - Edición con WYSIWYG". También suele descolocar los códigos Delphi en el mensaje cuando haces "Vista previa del Mensaje" antes de publicarlo. Por ese motivo me he acostumbrado a usar el modo "Editor Estándar - Controles de Formato Extra", que aunque un tanto espartano, no presenta ningún problema. Saludos. ![]()
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
#4
|
||||
|
||||
|
Estoy en ello.... En breve espero presentar resultados.
Mi intención es intentar conseguirlo haciendo lo que os comenté; Utilizando los métodos que trae Delphi para volcar componentes en un Stream y recuperarlos. Se puede hacer, como bien habéis dicho volcando a XML (o JSON) haciendo un "parser" (ya sea específico para estas clases o genérico para todas -que viene a ser algo similar al link que me puso David al principio-), pero como también comenté, la gracia está en conseguirlo sin eso. 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. |
|
#5
|
||||||
|
||||||
|
Cita:
Cita:
Cita:
Cita:
Cita:
Cita:
a matizarlo con "me parece que esto es justamente lo que quiere evitar Neftali y busca algo que sea más genérico y le haga más directa la cosa." // Saludos |
|
#6
|
||||
|
||||
|
A ver Roman, yo releo el hilo y lo que estoy entendiendo es que si bien su diseño parece obedecer a algo como:
ClaseA <>--- ClaseB <>--- ClaseC <>--- TPoint El mismo señala que es una aproximación y no una idea de que son únicamente 3 clases. Creo que si vino con la duda es porque el trabajo no es tan directo, y si digo que al final va a llegar a trabajar con RTTI o que los caminos conducen a Roma es porque justamente si la intención es evitar algunas opciones, las que quedan de una u otra llevan a otro camino que igualmente no lleva a una solución tan directa como para hacer el trabajo de un tirón a como le gustaría. Que será trabajoso seguro. Y si te pedí un ejemplo que no fuera RTTI lo decía con buena manera, y yo me imaginaba algo que no fuera algo como lo que "pseudo" propuse. Te juro que quizá me imaginé que tenías (y quizá si lo tienes) algún haz en tu manga que sea NO-RTTI y sin llegar a ese enjendro que he propuesto. De allí que te preguntaba si tienes algo en mente. En mi propuesta es lo más KIS que me vino ... Yo no te lo decía a ti en forma despectiva.¿Hay algo más simple? ¿Que trucos tienes? En verdad quisiera saberlo; que me pica la curiosidad... tu me conoces . Yo no lo decía en mal plan. Es que me asombró que tu digas de que se puede. En serio, yo al leer tus palabras me dije: "¡No jodas! ¿Y sin hacer el mavarracho que me mandé?. Tengo que saberlo"Si yo tuviera que implementar algo como mi propuesta, al llegar a la 4ta clase me volvería loco (más de lo que estoy). Aún para clases con pocos atributos. Es un diseño que llevaría muy posiblemente a metidas de dedos y problemas que vaya a saber cuando se los descubriría... si te digo que hasta confundo filas con columnas de una matriz al implementar algunas funciones algebraicas. ![]() Esto me llevó al planteo de la posibilidad de si se puede contar con alguna forma genérica de llevar esto. Mis pensamientos me decían de que podría concebirse de alguna clase tipo XML-Parser que cuente con la funcionalidad de escribir/leer un XML de forma más cómoda. Algo como:
Pero inmediatamente me dije, segurísimo que ya existe una... creo que hasta tiene un nombre parecido. ¿Por casualidad no hay ya un TXMLParser en la VCL? No tengo Delphi a mano, como para comprobarlo. Y bueno, a pesar de esta clase... mi cabeza me sigue diciendo que aún así no está resuelta la pregunta. ¿Y ahora? Me mando un método y pongo tanto "WriteNode" o "WriteSubNode" como propiedades tenga? Esa solución me lleva a que me estoy complicando, mejor tiro a RTTI y "automatizo". Saludos, |
|
#7
|
||||
|
||||
|
Cita:
¿Código? No. No tengo ni una sóla línea. Pero estoy seguro que lo podría hacer. Claro, no sin antes buscar alguna opción que facilite las cosas, tal cómo hace Neftalí .Y si lo hiciera con XML, desde luego usaría algo hecho para crear/leer archivos xml, no reinventaría la rueda. // Saludos |
|
#8
|
||||
|
||||
|
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. |
|
#9
|
||||
|
||||
|
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. |
|
#10
|
||||
|
||||
|
Cita:
![]() Una pregunta. ¿Por qué conviertes a string? ¿No podrías guardar directamente a disco usando un FileStream? // Saludos |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
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 |
|