![]() |
Recuperación información a través de RTTI
Hola
Leyendo sobre RTTI me surge alguna duda que quiero plantear (realmente creo que no he entendido claramente el concepto y pido disculpas si la consulta no tiene sentido). Para conseguir a través de RTTI información sobre un determinado objeto (tipo, propiedades, etc) ¿es necesario que el objeto esté creado?, o la información se toma de la contenida en el propio ejecutable. Si RTTI toma la información del ejecutable ¿RTTI podría suministrar la información necesaria para crear una copia de un objeto?. Si es así alguno de vosotros me puede pasar un pequeño ejemplo de recuperación mediante RTTI de las caracteristicas de un objeto simple para su clonacion (si no es demasiado complicado lo que pido). Gracias por vuestro tiempo y atención. Un saludo |
La respuesta a la primera duda es: se toma de la información contenida en el programa ejecutable.
Para la segunda cuestión, la solución dependerá del caso concreto. ¿Qué tienes en mente al respecto de la clonación? |
Se puede recuperar informacion tanto de una clase como de un objeto creado
Aca hay un ejemplo Estrictamente hablando, se obtiene la informacion de la clase (o el tipo), por ejemplo una propiedad o un metodo Luego, se puede usar dicha propiedad o metodo y ejecutarlo sobre una instancia en particular para obtener el valor de la propiedad, ejecutar el metodo, etc |
Hola
Ante todo gracias a ambos, ahora me queda mas claro. Cita:
Con RTTI se puede conseguir la información de un tipo determinado (por ejemplo TButtons). Mi consulta es sobre la posibilidad de conseguir, a través de RTTI, la información de los valores de las propiedades, de los métodos llamados, etc. en un botón determinado, que esté definido en la aplicación, pero todavía no esté instanciado (por ejemplo un botón que tenga la propiedad visible definida a falso y que el evento onclick llame a un determinado método) Un saludo |
Si que se puede obtener el valor de las propiedades usando RTTI
Cita:
A que te referis con "definido pero todavia no instanciado"? Lo mas cercano que se me ocurre a eso es una variable TButton a la cual aun no llamaste a su constructor |
Tal vez se refiere a extraerlo del recurso DFM. :)
|
Cita:
Cita:
|
Hola jocaro.
Cita:
Mediante RTTI, se puede obtener información sobre un objeto existente en tiempo de ejecución. De allí creo que viene la pregunta de Agustín, ya que si aún no existe una instancia de clase u objeto, no tiene sentido tratar de obtener información hacerca de él. Si bién es cierto que la clase define el estado interno y la implementación de un objeto, no es posible obtener información a partir una instancia de clase inexistente. Resumiendo, no se puede obtener información de algo que no existe. ¿ Podrías dar un ejemplo concreto de algún objeto e información que quieras obtener ? Saludos :) |
Creo que se refiere a los componentes que se colocan en tiempo de diseño
|
Cita:
LineComment Saludos |
Hola
Después de las primeras explicaciones de Al y Agustin, creo haber entendido la filosofía de RTTI y, como ya os decía anteriormente creo que lo que planteaba no era posible De todos modos como parece que no ha quedado clara mi consulta, la intento explicar con mas detalle por si este tema sirve de ayuda para otro interesado en el futuro. La situación sería la siguiente: En tiempo de ejecución puedes conseguir información de tipos a través de RTTI (Buttons, Treeview, Forms, etc. ). Cuando se está creando la aplicación puedes introducir la creación de un objeto bien en el código o en el .frm de la unidad y, cuando ejecutemos la aplicación, dicho objeto se creará al crear el form en el que está o cuando el programador decida crear la instancia; mi consulta era si podiamos conocer la información de las propiedades y métodos que tiene definidos ese futuro objeto, antes de que sea creado (pero sus propiedades y métodos están definidos en el código de la aplicación), a través de la información que se puede acceder a través de RTTI, o bien esa información antes de crear el objeto no puede ser accedida por RTTI o simplemente no existe. Es decir "Lo que no se puede, no se puede, y, además, es imposible". :) Muchas gracias por vuestro tiempo y el interés en ayudarme. Un saludo |
Pero ya te han comentado que esa información se encuentra almacenada en el DFM, y el DFM se almacena como recurso en el ejecutable así que, en principio, sí puedes obtenerla. Lo que no queda clarao -sigue sin quedar claro- es qué es lo que quieres hacer. Sé que te has esforzado en explicarlo, pero, siceramente, no te entiendo. Creo que lo mejor sería que expusieras un caso de uso específico para saber qué es lo que quieres lograr.
LineComment Saludos |
Ejemplo: Un pequeño gestor de información con dos forms
El form 1 tiene una funcion principal (recoger los datos necesarios para abrir una base de datos y llamar al form 2) y un menú con varias utilidades (usadas de vez en cuando) El form 2 tiene como función gestionar notas que almacena en una tabla de la base de datos. Para ello utiliza un treeview, un dbrichedit (contendidos en el DFM de la Unit), etc., con los cuales presentar dichas notas, editarlas, borrarlas, etc Consulta: Una de las utilidades del form 1 hace un tratamiento de la tabla que guarda las notas. Para ello necesitaría un dbrichedit prácticamente igual al del form 2 (en el momento de ejecutar la utilidad, el form 2 no está creado y por lo tanto el dbrichedit tampoco) ¿En este caso se puede recuperar del ejecutable (RTTI, DFM...) la información de las propiedades y eventos del dbrichedit del form 2 y utilizarlos para crear un objeto dbrichedit en el form 1? Si es así agradecería un pequeño ejemploUn saludo |
Cita:
Gracias y un saludo |
Para algo así podrías intentar con los marcos (frames). Son como formularios pequeños que contienen uno o más componentes establecidos con el diseñador de Delphi. En tiempo de ejecución puedes re-crear cualquiera de esos marcos e insertarlo en un formulario. Así haces en Delphi un sólo diseño y almacenamiento del DBRichEdit, que luego, al ejecutarse el programa, lo cargas e introduces en el formulario donde lo requieras, tantos DBRichEdits como necesites, incluso trabajando simultáneamente.
De hecho, sin ir tan lejos, puedes insertar los frames desde tiempo de diseño: diseñas un sólo marco y lo insertas en varios formularios antes de compilar. Busca "TFrame" en Google, añadiendo la opción site:www.clubdelphi.com (encontrarás más de mil resultados). Aunque te aconsejo que posteriormente revises a fondo el diseño de esa aplicación. ;-) |
Cita:
Hola Miraré esta opción en cuanto pueda. No la conocía y parece interesante para resolver la situación que planteaba. Mis referencias anteriores a un ejemplo donde se utilizara RTTI o la información del DFM en ejecución para crear un DBRichEdit son, sobre todo, para aprender y ahondar en las posibilidades y prestaciones que ofrecen y la forma de accederlas. Gracias de nuevo por tu ayuda y un saludo |
La franja horaria es GMT +2. Ahora son las 23:25:01. |
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