![]() |
Publicar un evento
Hola a todos.
Tengo creado un componente que utiliza un TreeView y me gustaría publicar el evento OnChange del TreeView en mi componente de tal forma que aparezca en la lista de eventos del inspector del objeto. ¿Cómo puedo hacerlo? Gracias por vuestra ayuda. |
Si ese Treeview lo has puesto en tiempo de diseño en tu Componente, no tienes que hacer nada.
Cuando pegues tu componente en un Form, podrás seleccionar el Treeview y asignar su evento OnChange. Saludos |
Cita:
Es que no me queda claro... |
El componente no hereda de un TreeView sino de TPanel y efectivamente está encapsulado. De ahí el problema, que no puede ser seleccionado directamente.
|
Ok. Crea dentro de tu componente lo que se llama una "propiedad puente".
Crea en tu componente una propiedad published del mismo tipo que el evento que quieres capturar. Internamente captura el evento del componente TreeView y cuando "salte" el del TreeView, haz "saltar" el que has creado tú en tu componente. No se si me expliqué decentemente...:o:o:o |
Gracias por la respuestai. Creo que te he entendido. Voy a probarlo. Si viera o viese que no, vuelvo a escribir.
Saludos. |
No me funciona. He generado lo siguiente:
Código:
published Código:
FTreeViewSymbol.OnChange := onChangeTreeNode; ¿ qué estoy haciendo mal ? Gracias. |
la creación de tu componente ¿cuando ocurre?, cuando lo pegas por primera vez en tu form, y en ese momento, OnChangeTreeNode es nil (todavía no se le ha asignado ningún valor).
Saludos |
Hola Lepe.
Siguiendo tu ejemplo me da el error de Not enough actual parameters. Saludos. |
Vas bien, la idea es esa, pero no debes apuntar entre los dos eventos directamente, necesitas un procedimiento.
Te lo he puesto de memoria, así que tal vez haya algun error, pero creo la idea se entiende. Prueba y si no te aclaras dilo e intentaré ser más concreto. Un saludo. |
Hola Neftali,
Al hacer esta asignación: Código:
FTreeViewSymbol.OnChange := MyOnChangeTreeView; Lo que he hecho es cambiar el parámetro de MyOnChangeTreeView y la llamada al FOnChange y funciona perfectamente Código:
procedure TMiComponente.MyOnChangeTreeView(Sender: TObject; Node: TTreeNode); FTreeViewSymbol.OnChange := FOnChange; Si no entiendo yo mal FOnChange contiene una referencia al procedimiento creado por el usuario final del componente, siendo el mismo tipo de evento y asignandolo al OnChange del TreeViewSymbol estamos pasando esa misma referencia al evento del TreeView. ¿ no ? Gracias por tu ayuda. Gracias también a Lepe. |
Siempre he creado los eventos de la forma que tu propones Neftali, pero en este caso, ya que es un "puente", como tú bien has dicho, pensé: "se podrá obviar ese procedimiento intermedio ¿no?"
Perdón, acabo de ver el por qué no se puede obviar ese procedimiento. La verdad, estaba cuestionando la forma de trabajar Delphi, e incluso "quería ir un poco más lejos" perdiendo de vista el horizonte :o Saludos |
Cita:
El problema es que en el momento de asignarlo FOnChange no vale nada (nil). Si esa asignación la haces en ejecución, cuando ya ha sido asignada la rutina del evento entonces funciona perfectamente, pero al hacerla en el OnCreate asigna una valor nil. Si esa asignación la colocaras en un método que la hiciera una vez que el procedimiento del evento ya ha sido asignado (yo lo he probado en el método Invalidate) funcionaría perfectamente, pero personalmente no creo que sea el lugar correcto para ponerlo. |
Cita:
Cita:
FTreeViewSymbol.OnChange := FOnChange; estamos inutilizando el código que hay escrito en el TreeView.Onchange, y sustituyendolo por el código que ha escrito el usuario de nuestro componente. Pero ni el Treeview, ni nosotros, mandamos ejecutar ese código. Como sabemos, la única forma de ejecutar un evento es mediante:
Como esas 2 líneas faltaban en nuestro código, nunca se ejecutaba el evento, dicho de otra forma, "el evento no saltaba". Saludos |
Me ha quedado clarito clarito. Con semejantes maestros era de esperar :)
Muchas gracias a los dos. |
La franja horaria es GMT +2. Ahora son las 18:28:40. |
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