Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Recuperación información a través de RTTI (https://www.clubdelphi.com/foros/showthread.php?t=90200)

jocaro 25-04-2016 13:31:21

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

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

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

jocaro 26-04-2016 11:54:32

Hola

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

Cita:

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

Cita:

Empezado por jocaro (Mensaje 504693)
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

Cita:

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.

Cita:

Tal vez se refiere a extraerlo del recurso DFM
Es 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.
Cita:

Empezado por jocaro (Mensaje 504734)
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

Cita:

Empezado por ecfisa (Mensaje 504745)
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

Cita:

Empezado por jocaro (Mensaje 504773)
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

¿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

Cita:

Empezado por Al González (Mensaje 505030)
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. ;-)


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 09:04:04.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi