PDA

Ver la Versión Completa : Evento en componente dentro de frame


Kafu
29-05-2003, 20:11:33
Hola, foro.
Tengo un problema que no logro entender.
Me he creado un componente que tiene tiene una propiedad de tipo evento (un tipo de evento creado por mí) y que lo que hace es capturar el doble click de una de sus propiedades, que es un grid, y en ese doble click dispara el evento en funcion de ciertas condiciones.
El caso es que si pongo el componente en un form funciona sin problemas, pero cuando esta en un frame no se dispara el evento, porque en teoría no está asignado el manejador.
He visto que otro tipo de evento sí que es disparado aunque su manejador este en el frame y no en el form contenedor, así que supongo que hay algún problema a la hora de cargar el form y se pierde ese manejador que está en el frame.
Supongo que alguien puede haberse encontrado con un problema similar, agradecería alguna idea que me ayudara a descartar errores típicos. Un saludo y gracias por adelantado,








F.T.G.

delphi.com.ar
29-05-2003, 21:39:34
Te cuento que uso Frames habitualmente, y nunca he tenido un problema de este tipo, lo que se me ocurre que pueda estar pasando es que en el código del frame tengas el código del evento que quieras ejecutar, y cuando pegas este frame en un Form, sobrescribes este evento sin hacer un inherited, por lo tanto no se vuelve a llamar al evento. ¿Es posible algo así?
Otra posibilidad es que el evento del frame heredado sea nil, por lo tanto no se llamará al del frame.


Saludos!

Kafu
30-05-2003, 10:48:20
Lo primero muchas gracias por contestar.
No sobreescrio el manejador del evento. He probado sobreescribirlo y me realiza sólo el código que pongo en este manejador, aunque ponga inherited.
En cuanto a lo de que el manejador del frame heredado sea nil, eso es exactamente lo que pasa. Pero ahí está el problema, yo lo he implementado en el frame.
Es como si al cargar el frame repetara todos los eventos que tiene salvo este. Por esto pienso que como es un evento creado por mí, algo se me escapa en su definicion. El error es cuando lo llamo desde el componente:

if assigned(falsuceder) then
begin
falsuceder(self);
end;

Si el componente está directamente en el form, o bien la implementación del manejador de ese evento, cuando llega a ese punto assigned devuelve true.
Pero cuando está dentro de un frame me dice que no está asignado. Es como si al cargar el formulario y arrastrar consigo las propiedades de sus frames, resetara el valor de ésta.
No se me ocurre cómo puedo solucionarlo, voy a seguir mirando y si no puedo implementaré el evento en el form contenedor, que tampoco es tan grave. Un saludo,











F.T.G.

delphi.com.ar
30-05-2003, 17:36:25
Porqué no nos muestras como has definido el evento...
:D Supongo que no le habrás puesto un stored False... ¿No?

Kafu
30-05-2003, 17:58:36
Supongo que no le habrás puesto un stored False... ¿No?

No, ya había pensado en eso.
Si fuera un problema de almacenaje el frame perdería la referencia cada vez que lo abriera, pues no se guardaría en el dfm. No es el caso. Tengo el manejador de evento vivito y coleando en el frame. Además en un form funciona correctamente.

Pero efectívamente creo que por ahí van los tiros.
En algún momento cuando el formulario carga las propiedades del frame ésta se la pasa por el forro. El problema es que no sé por qué. Pero que está almacenada en el dfm del frame es seguro.
Gracias de nuevo, si tienes alguna otra idea me ayudarás mucho.
Un saludo,

delphi.com.ar
30-05-2003, 18:08:08
Posteado originalmente por delphi.com.ar
Porqué no nos muestras como has definido el evento...


Me refería a que postees la definición de tu evento, o si no te molesta el código de todo el TFrame...
¿Cuál es el nombre de tu evento? No será una palabra reservada o algún evento con trato un tanto "particular"

Kafu
30-05-2003, 18:41:38
type
tEventoMalvado = procedure (sender: tobject; auxiliar: integer) of object;
tComponenteMalvado = class(tcomponent)
private
FEventoMalvado: tEventoMalvado;
protected
{ Protected declarations }
public
{ Public declarations }
published
property AlOcurrir : tEventoMalvado read FEventomalvadowrite SetEventoMalvado;
{ Published declarations }
end;


Te había entendido. No puedo publicar el código del frame. Temas de contrato. Esto sería algo análogo al componente que está en el frame.
En principio no veo ninguna causa por la que esto pueda estar mal. Miro el dfm del frame y está asignada la propiedad, no en el del form pero eso no debería influir, porque si pones un manejador para un onclick en un frame tampoco se almacena en el dfm del form pero luego sí se ejecuta. No sé qué puede ocurrir, sinceramente, creo que tiene que ver con la lectura de componentes del formulario pero no sé como depurar hasta ese punto. Un saludo,










F.T.G.

delphi.com.ar
30-05-2003, 18:47:02
¿Qué haces en el procedure SetEventoMalvado?

FEventomalvado := Value;

¿Este es el nombre real del evento?

Kafu
30-05-2003, 18:59:12
¿Qué haces en el procedure SetEventoMalvado?

FEventomalvado := Value;



Hago eso simplemente. No me atrevería a que al asignar el manejador de evento se tocaran otras propiedades. Demasiado inestable.

El evento no se llama así, aunque estoy pensando en rebautizarlo. De todas formas está garantizado que no es palabra clave ni coincide con otro método, propiedad ni variable en el código.

Realmente no hay nada de particular en el código. Creo que desistiré e implementaré el manejador en el formulario que contiene el frame.

Un saludo y gracias,









F.T.G.

Kafu
02-06-2003, 18:19:27
Comentarte que se ha solucionado. Había unas propiedades en el frame que antes de crear el componente se encargaban de su funcionalidad. Sospecho que puedan haber tenido algo que ver. De todos modos estoy peleando con los frames con desigual fortuna, y aún no puedo asegurar 100% la razón por la cual el formulario que contenía el frame no cargaba la asignación del manejador de evento, ni por qué ahora si lo hace. Un saludo,