![]() |
Problemas al guardar componentes con TStream!!
Hola!
Estoy desarrollando una aplicación en la que creo componentes en forma dinámica, y al cerrar el form los guardo en un archivo de texto para volver a recuperarlos en el momento en que vuelva a ejecutar la aplicación. Esto lo logro con una función que saqué de la ayuda de delphi con una pequeña modificación:
Ahora bien, funciona todo correctamente mientras guarde un componente que no tiene subcomponentes, por ejemplo, un TButton. El problema surge cuando intento recuperar un componente con subcomponentes, es decir un componente de mi creación, derivado de TCustomPanel, que tiene un TImage, un TStaticText y un TPopupMenu; el error que surge es: "class TImage not found". Estas funciones las encontré en el ejemplo de la ayuda del método WriteComponent del componente TStream. Se que en otro hilo del foro se describió otra forma de realizar esto, pero mi pequeño cerebrito fué incapaz de procesar esa información ya habiendo empezado con este método :( . Espero haber sido lo suficientemente claro. Agradezco a todo aquel que aporte alguna pista. |
Cita:
Si esta embebido, queda en tu componente implementar los métodos y propiedades para leer y guardar los datos de sus objetos, pero si no te funciona WriteComponent / ReadComponent, tampoco tendría que funcionar cuando carga / lee el dfm el propio IDE de Delphi o tu aplicación compilada. Saludos! |
Ante todo gracias por responder.
Los componentes que están dentro del componente (el TImage, el TStaticText, etc) los creo en el medo AfterConstruction de mi componente:
En cuanto al dfm, si, el IDE lo lee sin problemas. Un dato más: a las funciones para guardar y leer las llamo desde los eventos OnClose y OnCreate del form respectivamente, aunque también probé de llamarlas mediante un botón y tampoco funcionó. Además, el metodo write funciona, pero el Read es el que da el error. :confused: Saludos. |
Procedures Stream.WriteComponent and ReadComponent are
purposed for deal mainly with Root components (Form, DataModule, ...). Somewhen I was experimenting with components and wrote procedures for read/write non-root components from stream:
PS: When Reader reads a component from stream, initially it reads the Class Name of the component. Then (if the component has not been created before reading) Reader tries to find the Class Reference by Class Name. First, it searches the class in the RTTI-table of Root component. If there is any component of the same class in the Root, then success. Second, the Reader searches the class in the registered classes. If the class have been registered by RegisterClass (RegisterClasses), then success. Third, the Reader let user to resolve the Class Name to the Class Reference by himself (it calls OnFindComponentClass event handler). If all this attempts have failed, the Reader raise EClassNotFound "class <Class Name> not found". Use RegisterClasses to solve it. |
Thanks! Rounin. I think that your solution will help me. Very good explanation. Thanks again!
Saludos |
Saludos
Rounin, Sabes escribir en español?, Lo digo porque en este foro la gran mayoría hablamos(o escribimos) en español. Entonces los forista que consulten este hilo y tenga pocos conocimiento del ingles estarán despistado. Ante todo, Es muy grata y muy buena tu ayuda (hasta a mi me has ayudado:D). Espero seguir viendote por aqui;) |
Saludos,
Estoy estudiando español, (yo periodicamente voy en comisiones de servicio a España) pero mi nivel de español no es bastante alto, y lo escribir en español todavía es dificil para mi. Lo siento. :( |
Saludos
Cita:
Cita:
|
Saludos,
pienso que en tu caso necesita incluir flag csSubcomponent en tus subcomponentes: Código:
TDigitalDisplay = class(TCustomPanel) Porque no en Create? |
Cita:
Los subcomponentes los creo en el metodo AfterConstruction porque en el constructor Create el componente aun no está creado y no puedo asignarle la variable Self a la propiedad Parent del subcomponente, ni tampoco pasarlo como Owner en la creación del subcomponente. O almenos eso entendí. Saludos y éxitos con el español. |
Puedes hacer eso en Create después inherited.
En este lugar el componente esta creado totalmente. (sólo las propiedades no ya esta cargado de DFM y la ventana no ya esta creado). |
Cita:
Gracias de nuevo. Y con respecto a: Cita:
Saludos |
La franja horaria es GMT +2. Ahora son las 12:25:08. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi