PDA

Ver la Versión Completa : Recuperación información a través de RTTI


jocaro
25-04-2016, 13:31:21
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

Al González
25-04-2016, 17:17:59
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?

AgustinOrtu
25-04-2016, 20:25:44
Se puede recuperar informacion tanto de una clase como de un objeto creado

Aca hay un ejemplo (http://docwiki.embarcadero.com/CodeExamples/en/Rtti.TRttiType_(Delphi))

Estrictamente hablando, se obtiene la informacion de la clase (o el tipo), por ejemplo una propiedad (http://docwiki.embarcadero.com/Libraries/en/System.Rtti.TRttiProperty) o un metodo (http://docwiki.embarcadero.com/Libraries/en/System.Rtti.TRttiMethod)

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

jocaro
26-04-2016, 11:54:32
Hola

Ante todo gracias a ambos, ahora me queda mas claro.

Para la segunda cuestión, la solución dependerá del caso concreto. ¿Qué tienes en mente al respecto de la clonación?Intento explicar la consulta que hice, aunque después de vuestras aclaraciones creo que no es posible lo que prentendo.

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

AgustinOrtu
26-04-2016, 16:09:10
Si que se puede obtener el valor de las propiedades usando RTTI


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 boton con Visible a False y con un manejador en el evento OnClick es un boton instanciado

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

Al González
27-04-2016, 07:11:29
Tal vez se refiere a extraerlo del recurso DFM. :)

jocaro
27-04-2016, 08:26:35
A que te referis con "definido pero todavia no instanciado"?Definido en el código fuente de la aplicación. No instanciado en la ejecución de la aplicación, en el momento en que queremos recuperarlo a través de RTTI.

Tal vez se refiere a extraerlo del recurso DFMEs algo que he estado mirando, TReader y TWriter, pero en este caso me refiero a la información que contenga el ejecutable y que pueda ser recuperada con RTTI

ecfisa
27-04-2016, 18:59:08
Hola jocaro.
Definido en el código fuente de la aplicación. No instanciado en la ejecución de la aplicación, en el momento en que queremos recuperarlo a través de RTTI.

No me queda claro a partir de que y que información deseas obtener...

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 :)

AgustinOrtu
27-04-2016, 19:48:23
Creo que se refiere a los componentes que se colocan en tiempo de diseño

roman
27-04-2016, 19:58:04
no se puede obtener información de algo que no existe.

Esto me recuerda una atinada frase de nuestro compañero dec: "Lo que no se puede, no se puede, y, además, es imposible". :)

LineComment Saludos

jocaro
28-04-2016, 08:44:31
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

roman
28-04-2016, 17:33:08
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

jocaro
29-04-2016, 09:06:35
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 ejemplo

Un saludo

jocaro
05-05-2016, 14:55:10
Ejemplo: Un pequeño gestor de información con dos formsEl 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, etcConsulta: 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

¿Aclara este ejemplo la idea qP:-) de lo que quiero lograr?
Gracias y un saludo

Al González
08-05-2016, 03:06:33
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. ;-)

jocaro
10-05-2016, 08:18:00
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 (http://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. ;-)


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