![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
|
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:
.. <acciones> <accion nombre="Aceptar" evento="AceptarClick" /> <accion nombre="Cancelar" evento="CancelarClick" /> </acciones> ..
Agradezco si alguno pudiese colaborarme. he buscado en foros, referencias y aún no encuentro nada para resolver la situación.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com |
|
#2
|
||||
|
||||
|
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
|
#3
|
||||
|
||||
|
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".
__________________
Buena caza y buen remar... http://mivaler.blogspot.com |
|
#4
|
||||
|
||||
|
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.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com |
|
#5
|
||||
|
||||
|
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.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com |
|
#6
|
||||
|
||||
|
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. ![]() |
|
#7
|
||||
|
||||
|
Cita:
![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
|
#8
|
||||
|
||||
Muy chevere que lo llamen a uno por su nombre de pila en la internet ... Y no un rollo como este era el que necesitaba. Además que queda como referencia para muchas otras personas que puedan tener la misma duda.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.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com |
|
#9
|
||||
|
||||
|
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. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| String a Cadena de Bytes a cadena Hexadecimal | ruedabeat2003 | Varios | 2 | 11-01-2012 02:04:06 |
| Convertir cadena aleatoria en cadena de N caracteres | DANY | OOP | 3 | 12-03-2009 20:49:21 |
| Funcion para borrar la cadena que aparesca repetida dentro de otra cadena | flystar | Varios | 1 | 02-07-2007 23:51:10 |
| Funcion para buscar cadena dentro de otra cadena y el numero de veces | flystar | Varios | 3 | 02-07-2007 22:48:08 |
| Buscar cadena dentro de otra cadena | doverzhoff | Varios | 4 | 27-01-2004 05:27:15 |
|