Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-01-2008
Migmam2 Migmam2 is offline
Miembro
 
Registrado: jul 2006
Posts: 18
Poder: 0
Migmam2 Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 10-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 10-01-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Migmam2 Ver Mensaje
Tengo creado un componente que utiliza un TreeView y me gustaría publicar el evento OnChange del TreeView en mi componente...
¿Tu componente hereda de un TreeView? ¿Tu componente tiene encapsulado dentro un TreeView?

Es que no me queda claro...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 10-01-2008
Migmam2 Migmam2 is offline
Miembro
 
Registrado: jul 2006
Posts: 18
Poder: 0
Migmam2 Va por buen camino
El componente no hereda de un TreeView sino de TPanel y efectivamente está encapsulado. De ahí el problema, que no puede ser seleccionado directamente.
Responder Con Cita
  #5  
Antiguo 10-01-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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...
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 10-01-2008
Migmam2 Migmam2 is offline
Miembro
 
Registrado: jul 2006
Posts: 18
Poder: 0
Migmam2 Va por buen camino
Gracias por la respuestai. Creo que te he entendido. Voy a probarlo. Si viera o viese que no, vuelvo a escribir.

Saludos.
Responder Con Cita
  #7  
Antiguo 11-01-2008
Migmam2 Migmam2 is offline
Miembro
 
Registrado: jul 2006
Posts: 18
Poder: 0
Migmam2 Va por buen camino
No me funciona. He generado lo siguiente:

Código:
published

property onChangeTreeNode: TTVChangedEvent read FOnChange write FOnChange;
y en la creación del componente:

Código:
FTreeViewSymbol.OnChange := onChangeTreeNode;
El evento si me aparece publicado en el componente, pero no salta.

¿ qué estoy haciendo mal ?

Gracias.
Responder Con Cita
  #8  
Antiguo 11-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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).

Código Delphi [-]
published

property onChangeTreeNode: TTVChangedEvent read FOnChange write SetOnChange;

implementation


procedure TMicomponente.SetOnChange(Value: TTVChangedEvent);
begin
  if Value <> FOnchange then
  begin
    FTreeViewSymbol.OnChange := Value;  
    FOnChange := Value;
  end;
end;

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #9  
Antiguo 11-01-2008
Migmam2 Migmam2 is offline
Miembro
 
Registrado: jul 2006
Posts: 18
Poder: 0
Migmam2 Va por buen camino
Hola Lepe.
Siguiendo tu ejemplo me da el error de Not enough actual parameters.

Saludos.
Responder Con Cita
  #10  
Antiguo 11-01-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Vas bien, la idea es esa, pero no debes apuntar entre los dos eventos directamente, necesitas un procedimiento.


Código Delphi [-]
// La propiedad
property onChangeTreeNode: TTVChangedEvent read FOnChange write FOnChange;

// necesitas un procedimiento con los mismos parametros que el evento.
procedure MyOnChange(Value: TTVChangedEvent);

.....
// Cuando haces la asignación asignas el evento original a tu procedimiento
FTreeViewSymbol.OnChange := MyOnChange;

// Y en el procedimiento creado haces saltar tu nuevo evento...
procedure TMicomponente.MyOnChange(Value: TTVChangedEvent);
begin
  // llega aquí cuando salta el del componente original...

  // Tenemos el nuestro asignado?
  if Assigned(FOnChange) then begin
    // Hacemos "saltar" el nuestro
    Self.FOnChange(Value);  
  end;
end;


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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #11  
Antiguo 11-01-2008
Migmam2 Migmam2 is offline
Miembro
 
Registrado: jul 2006
Posts: 18
Poder: 0
Migmam2 Va por buen camino
Hola Neftali,

Al hacer esta asignación:

Código:
FTreeViewSymbol.OnChange := MyOnChangeTreeView;
me daba error de tipos incompatibles ¿? TObject y TTVChangedEvent.

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);
begin
  if Assigned(FOnChange) then begin
    Self.FOnChange(Sender,Node);
  end;
end;
Ahora bien, me gustaría saber (si no es mucho pedir ) por qué no se puede hacer la asignación directamente, es decir:

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.
Responder Con Cita
  #12  
Antiguo 11-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #13  
Antiguo 11-01-2008
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Migmam2 Ver Mensaje
Ahora bien, me gustaría saber (si no es mucho pedir ) por qué no se puede hacer la asignación directamente, es decir:

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 ?

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.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #14  
Antiguo 11-01-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por Migmam2
Si no entiendo yo mal FOnChange contiene una referencia al procedimiento creado por el usuario final del componente, siendo el mismo tipo de evento
Hasta aquí todo correcto.

Cita:
Empezado por Migmam2
y asignandolo al OnChange del TreeViewSymbol estamos pasando esa misma referencia al evento del TreeView. ¿ no ?
No. En la asignación:

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:
Código Delphi [-]
  if Assigned(NombreEvento) then
     NombreEvento(parámetros)

Como esas 2 líneas faltaban en nuestro código, nunca se ejecutaba el evento, dicho de otra forma, "el evento no saltaba".

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #15  
Antiguo 11-01-2008
Migmam2 Migmam2 is offline
Miembro
 
Registrado: jul 2006
Posts: 18
Poder: 0
Migmam2 Va por buen camino
Me ha quedado clarito clarito. Con semejantes maestros era de esperar

Muchas gracias a los dos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Publicar Web realizada en Intraweb K-ba Delphi para la web 2 27-06-2018 19:16:52
publicar pagina web desde pc Yoli PHP 1 23-09-2007 02:17:09
publicar en pdf santiago14 Varios 2 03-03-2007 14:54:07
¿Cómo publicar DBGridColumns? DarKraZY OOP 9 23-02-2007 18:13:48
Publicar aplicacion .aspx JuanErasmo .NET 2 03-11-2006 14:23:04


La franja horaria es GMT +2. Ahora son las 06:13:17.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi