![]() |
TNotifyEvent a Cadena?
Hola a todos los compañero del foro.
Estoy realizando un componente - en Delphi 5 - para unas labores de la empresa, pero estoy enredado en un pequeño detalle. Resulta que el componente que estoy creando requiere una lista de Acciones (Nombre, Formulario y Evento) que he creado con en un TCollection.
Este componente tiene como objetivo crear un archivo XML con datos registrados en el, incluyendo las Acciones. Código:
..
Agradezco si alguno pudiese colaborarme. he buscado en foros, referencias y aún no encuentro nada para resolver la situación. |
No se me ocurre como puede hacerse de esa forma, es más, creo que debe hacerse al revés.
TNotifyEvent es en realidad un puntero a un método de otro objeto, a ver si lo aclaro, un "procedure (Sender:TObject) of object", así que, aunque puedas averiguar el nombre, puede que ni te sirva para nada, porque se te complicará todo. Una cosa, es tener una lista de "procedure of objects" y que en "Evento:integer" en realidad guardes el índice de ese array (o lo que sea). Lo más simple:
Obviamente funciones siempre se rellena en el mismo orden, por eso solo guardas el índice, que es un entero. Ni RTTI, ni traducciones, ni registerClass ni nada de nada. Pienso que es lo más simple, pero al no ver el bosque, quizás no sea lo adecuado. Saludos |
Muchas gracias por tu respuesta.
Estoy haciendo pruebas para poder implementar en el componente lo que llegué a conseguir con los datos que me haz pasado.
Hasta ahora, en el programa de pruebas funciona. pero cuando aplico el mismo código en el componente no funciona.
Y en el programa de pruebas tengo
La verdad no se que estoy pasando por alto al implementar en el componente pero no logro obtener el resultado desde la variable del componente pero la variable local lNomEve si muestra el nombre correspondiente "BtnTontoClick". |
Es más... haciendo esta modificación para manejar el TNotifyEvent en lugar del objeto, consigo obtener el nombre a partir del TNotifyEvent (cosa que no me funcionaba en el componente).
Edito: Acabo de ver en Classes.pas que TNotifyEvent = procedure(Sender: TObject) of object... he estado dando vueltas en circulo. |
Bueno... a la final no encontré una forma de obtener el nombre dentro del componente y pues agregué al componente un procedimiento para procesar los nombres de las acciones dentro del formulario. Que ahí si funcionaba el obtener el nombre a partir del TNotifyEvent.
En el componente:
y en el programa de pruebas:
De esta manera, ya tengo el nombre de la acción y la podré llevar al XML como lo he intentado desde la semana pasada. Muchas gracias Lepe por tu colaboración. Me queda la duda porque desde el componente nunca pude obtener el nombre. |
Cita:
Tal vez es un poco tarde, pero te puede servir. Un método, como valor procedimental (cual es el caso de un TNotifyEvent), consiste de dos punteros o direcciones de memoria: Una es la dirección del método en sí (en qué byte de la memoria inicia su código máquina) y otra es la dirección de memoria del objeto con el que ha de ejecutarse dicho método. Para facilitar las cosas, Delphi cuenta con el tipo genérico TMethod: El campo Code es la dirección de memoria del código ejecutable del método y Data es la dirección de la instancia de objeto con la cual ha de ejecutarse. Puedes hacer un molde de tipo con TMethod para obtener alguno de los dos valores. Ahora, observa lo que dice la ayuda de Delphi sobre MethodName: Cita:
La parte que no se cumple está en "of the object", por lo que MethodName te funcionó solamente cuando lo llamaste con el formulario, ya que el manejador de eventos consultado pertenece a la misma clase del formulario. En pocas palabras no es lo mismo llamar a Formulario.MethodName que a Componente.MethodName. Si tienes un valor método, es decir, Code + Data, y Code es un método publicado, tendrás que preguntarle al objeto Data por el nombre de ese método. Solamente la clase (o las clases) a la que pertenece Data podrá darte su nombre. Entonces, para obtener el nombre del método desde el interior del componente es necesario descomponerlo en su Code y Data, preguntándole a Data cuál es el nombre de Code:
Cabe mencionar que MethodName es un método de clase, es decir, ejecutado por la clase a la que pertenece Data, como si la expresión fuera "TForm1.MethodName (ManejadorDeclaradoEnTForm1)". Para finalizar, decir que a partir de Delphi 2010, gracias a la reflexión extendida (nueva RTTI), algunas de estas cosas pueden realizarse con mayor facilidad. Espero no haberme "enrollado" demasiado. Saludos. Al González. :) |
Cita:
|
Cita:
Dejame decirte que ayer cuando ví la respuesta me gustó muchisimo leerla, ya era muy tarde y no hice las pruebas. Pero acabo de hacer la modificación al SetEvento y funciona muy bien. De verdad que gracias no solo por ayudarme a resolver el problema, sino a entender porque sucedia. Cita:
Muchas gracias. |
En estos días, pocas cosas relacionadas con la programación me dan tanto gusto como saber que he escrito algo que le sirve a otras personas. A colegas Delphi que por ser diversas razones pueden acceder a la realización profesional que a otros se nos niega.
Por cierto, aun en Internet somos personas con nombre, apellido y sentimientos. Suelo nombrar a mis amigos como ellos prefieran, de la misma manera en Internet como presencial y telefónicamente. :) Saludos y que bueno que ha servido de algo mi intervención. |
| La franja horaria es GMT +2. Ahora son las 05:48:06. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi