FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Usando RTTI para devolver lista de eventos
Intentando usar RTTI, no puedo encontrar una forma que me devuelva una lista con todos los eventos que pueda tener una clase.
He mirado las units del propio entorno de Delphi (XE8) y no hay nada que se de forma directa. Lo que he encontrado que dentro de la unit System.RTTI existe la clase TRttiType que contiene los métodos GetMethods, GetFields, GetProperties, GetIndexedProperties entre otros. Mi pregunta ahora es la siguiente. ¿Puede ser que GetMethods devuelva todos los métodos de una clase, incluidos los que se usan para los evntos. Si es asi, como identifico cuales son los de los eventos, cuales son procedimientos, funciones, constructor, etc.? Como dije antes, en la unit correspondiente no he visto nada que me de una idea de como hacer lo que quiero. ¿Acaso tendre que identificar cada uno de ellos por lo que diga delante (procedure, function, constructor, etc)? Si alguien sabe como hacerlo y tiene algún ejemplo que me pueda orientar se los agradecería mucho. Ya saben cualquier cosa que algo no se entienda pueden preguntar y sera aclarado. Saludos, El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno |
#2
|
||||
|
||||
Al parecer, los eventos en Delphi son identificados mediante TTypeKind.tkMethod
Entonces, podes hacer esto:
Salida:
|
#3
|
||||
|
||||
Hola.
Otra opción que les servirá también a los que disponen de versiones mas viejitas:
Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#4
|
|||
|
|||
Primero que nada, gracias por las respuestas. En cuanto pueda vere las dos opciones que me dan, ya que esto me servirá para hacer que el Framework pueda hacer lo mismo en versiones nuevas y mas viejas.
Saludos, El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno |
#5
|
||||
|
||||
Hola Daniel, acabo de probar tu ejemplo en Delphi 2010 y funciona bien
Simplemente no entiendo porque limitas la clase a inspeccionar a que sea heredero de TComponent Segun las pruebas que he hecho, funciona bien si heredamos de TObject:
En este caso imprime tanto el TNotifyEvent como el TCustomEvent. Eso si, fue necesario declarar las propiedades como publicadas |
#6
|
||||
|
||||
Cita:
Tú ejemplo, da un Access Violation en D7 hasta que se activa la directiva. No sé si en D 2010 se active siempre. LnieComment Saludos |
#7
|
||||
|
||||
Ahh buen dato roman, no estaba al tanto de esos detalles
Como elrayo habla de un framework lo primero que se me ocurrió es que quizá exigir pertenecer a la rama de TComponent como algo no deseable; de seguro el ya tiene armada sus jerarquías. Aún así, es bueno saber que con agregar la directiva {M+} funciona bien. Una solución bastante sencilla podría ser incluir ese switch para las clase ancestro del framework |
#8
|
||||
|
||||
Hola.
En Delphi 7 no le veo mucho sentido remontar mas allá de TComponent por que por ejemplo el código: no generará error si envío como argumento un objeto auxiliar: pero tampoco mostrará los eventos OnChange y OnChanging de la clase enviada. En este momento no imagino el caso, pero tal vez exista algún caso para el que convenga declarar el parámetro de tipo TPersistent. Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... Última edición por ecfisa fecha: 03-06-2016 a las 03:25:42. |
#9
|
||||
|
||||
No genera error porque aun cuando pones {$M-}, le pasas una clase que fué compilada con la directiva {$M+} y por tanto generó RTTI, y si pones {$M+} entes de la rutina de todas formas fallará si le pasas un clase compilada con {$M-}. Es decir, el valor de la directiva no cambiará de último momento lo que ya haya sido compilado.
Definitivamente, una rutina como la que escribiste necesita comprobar que ClassInfo no sea nil. Ahora bien, si sólo vas a trabajar con clases de la VCL, ciertamente no tiene caso ir más allá de TComponent, pero no sabemos qué clase de framework esté trabajando y es posible que defina su propia jerarquía de clases independiente de la VCL. LineComment Saludos |
#10
|
||||
|
||||
Cita:
Cita:
Cita:
Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#11
|
||||
|
||||
Cita:
LineComment Saludos |
#12
|
||||
|
||||
Ahora entendí a que te referías, había comprendido otra cosa por jerarquía propia (de ahí mi sorpresa y pregunta)
Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... Última edición por ecfisa fecha: 03-06-2016 a las 07:56:07. |
#13
|
||||
|
||||
Si siguen así, voy a volver a participar como en los viejos tiempos, intentando aportar con tan buen ánimo como ustedes. ¡Qué gusto es leerles!
|
#14
|
||||
|
||||
Resurjamos como el ave Fénix
LineComment Saludos |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
funcion postgres para devolver nombre del mes | banthas | PostgreSQL | 4 | 28-12-2015 23:14:28 |
Llenar una lista desplegable usando ibase | MAXIUM | PHP | 2 | 12-03-2013 17:44:54 |
Monitor de eventos usando una clase | dario61081 | Trucos | 5 | 08-02-2013 17:49:41 |
función date para devolver Nº dia de la semana | lucasarts_18 | PHP | 2 | 27-03-2007 15:27:03 |
problema para devolver 2 valores en una funcion | tiagor64 | OOP | 4 | 06-05-2005 16:38:59 |
|