FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Cargar/Guardar un objeto de una clase propia
Hace un par de meses que empecé con este bello lenguaje, y me estuve quemando las pestañas de diversas formas pero sin poder solucionar este problema. Por lo que entendí lo que estoy haciendo está bien, pero no lo convenzo al programa, que sigue sin hacer lo que yo quiero
Este es el código que tengo escrito
Para probarlo:
Muchas gracias |
#2
|
||||
|
||||
La variable F, como tal es un puntero, un número de 4 bytes que indica una dirección en memoria. Cuando vos haces
En realidad estas escribiendo un número de 4 bytes (la dirección que tenía en memoria la instancia que creaste en esa corrida en particular). Claro que cuando ejecutes otra vez el programa, aún cuando recuperés la dirección, en la memoria no habrá una instancia válida del objeto. Lo que a vos te hace falta es que tu clase sea auto-persistente, en palabras mas modernas, que sea "serializable". Esto podrías lograrlo dotando de un par de métodos a la clase, por decir: SaveToStream, LoadFromStream, que se encarguen de escribir y leer todas las propiedades de un stream. Otra posibilidad, mas elaborada, es que crees una clase que sirva de ancestro a todas tu jerarquía, y que dicha clase tenga la lógica para escribir/leer las propiedades publicadas en un stream. Deben ser las propiedades publicadas porque es para estas para las que tenes información de tipo en tiempo de corrida (RTTI). Finalmente, podrías derivar tus clases de TComponent (formalmente hablando, que dejen de ser clases y sean componentes), y valerte de los métodos WriteComponent y ReadComponent de un stream. Esto ya implementa, mas o menos, lo que explique antes (valiendose de la clase TWriter y TReader de la VCL). En fin, este es un tema amplio, con lo dicho pretendo, mas que darte una solución, darte las ideas para que encontres una. Hasta luego. Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#3
|
|||
|
|||
Iluminadora respuesta
Muchas gracias jachguate (nunca pensé que iba a tener una respuesta tan buena tan rápido ), entendí mi error... obviamente opté por la opción de heredar de TComponent . Sin embargo esta opción ya la había intentado y tampoco me había sido de utilidad, no la había podido implementar, y ahora volví a intentarlo con pocos resultados. Antes y después de postear vi que había muchos tutoriales sobre distintas maneras de hacer esto, pero me gustaría saber si existe una simple y breve que utilize el writeComponent y el readComponent. Estuve intentando y tampoco entiendo por qué no funciona lo siguiente:
Lector:
Escritor:
(Por si es útil saberlo: el error surge en la parte de lectura, donde me dice que hubo un problema al leer el stream) Otra vez me gustaría saber que estoy haciedno mal... también aceptaría un "no, realmente no hay una forma mucho más simple que la que escribió rounin en http://www.clubdelphi.com/foros/showthread.php?t=25835&highlight=writecomponent" (ya sé que es una forma genérica, pero armar algo más o menos con esa estructura sigue siendo... embrollado). También está la posibilidad de pasar de binnary a texito, de texto a archivo, y viceversa; pero prefería saber que no había otra más simple antes de rendirme por ella. Gracias de nuevo. Última edición por Uoha fecha: 29-09-2006 a las 07:46:40. |
#4
|
||||
|
||||
Si ya tenes componentes, por que no llamar directamente a los métodos WriteComponente y ReadComponent del stream?
A mi me parece mucho mas limpio. Ahora, ayer a partir de la charla, como me quedé algo picado con el tema, busqué un par de referencias y me encontré con la biblioteca RTTI Library, que creo te será de utilidad, con la ventaja que tus clases no tienen por que ser componentes. No la he probado, pero tiene buena pinta y ya tiene procedimientos como SaveObjToIniFile que pueden serte de utilidad. Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#5
|
|||
|
|||
Problema newbie, resuelto
Cita:
Voy a hecharle una ojeada al link. Gracias! |
#6
|
||||
|
||||
pregunta
hola... necesito guardar un objeto en algun tipo de archivo, la respuesta que diste no funciona por que existe una incompatibilidad de tipos Tcopmponent y Tobjeto (que es mi clase)... toca hacer algun tipo de casteo o algo asi?? si es asi como lo hago??
|
#7
|
||||
|
||||
Hola,
En un "TObject" contarás con determinados que estarán también en la clase "TComponent". Porque "TComponent" hereda en última instancia de "TObject". Pero los métodos implementados por "TComponent" no están disponibles en "TObject" y clases derivadas de "TObject" que no hereden de "TComponent", claro. La cuestión es que tal vez podrías heredar tu clase de "TComponent", en lugar de "TObject". De este modo ya podrías utilizar los métodos "LoadComponent" y "WriteComponent". No podrás hacerlo mientras tu clase no herede de "TComponent", a no ser que tú mismo te encarges de implementar métodos similares. |
#8
|
||||
|
||||
PRegunra
hola logre guardar mis objetos que estan almacenados en un array asi:
pero al hacer la funcion de cargar? cual seria el Tobjet?
lo que quiero hacer es leer el archivo y meter estos datos en un array de objetos, debo hacer un for del FS?? como asigno el objeto a mi array para poder acceder a los metodos SET y GET de mi objeto (Tobjeto es mi clase de Objetos, no es igual a TObject) gracias |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Clase, objeto, tipo? | [Gunman] | OOP | 3 | 04-01-2006 17:11:32 |
Como guardar un objeto en un archivo ? | cmurua71 | OOP | 7 | 18-11-2005 22:26:30 |
Cargar Objeto Table | jzk | OOP | 2 | 21-09-2005 13:51:51 |
Guardar y Cargar un reporte por código... | emeceuy | Impresión | 3 | 30-12-2004 13:07:16 |
Controlar eventos de una clase propia | keglevich | OOP | 4 | 15-09-2004 14:58:21 |
|