![]() |
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 |
Al parecer, los eventos en Delphi son identificados mediante TTypeKind.tkMethod
Entonces, podes hacer esto:
Salida:
|
Hola.
Otra opción que les servirá también a los que disponen de versiones mas viejitas:
Saludos :) |
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 |
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 |
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 |
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 |
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 :) |
Cita:
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 |
Cita:
Cita:
Cita:
Saludos :) |
Cita:
LineComment Saludos |
Ahora entendí a que te referías, había comprendido otra cosa por jerarquía propia (de ahí mi sorpresa y pregunta)
Saludos :) |
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! :)
|
Resurjamos como el ave Fénix :)
LineComment Saludos |
La franja horaria es GMT +2. Ahora son las 09:37:55. |
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