Página 1 de 1

Que tipo de objeto es oSender

Publicado: Jue Oct 08, 2015 8:18 pm
por jvtecheto
Buenas tardes:

En un evento por ejemplo de un Boton (TButton), en el evento Onclick se pasa el parámetro oSender que es el botón que a generado el evento, pero.. ¿Qué tipo de objeto es oSender?
ya que si intentamos cambiar el nombre del botón , por ejemplo con oSender:cText:= "Otro nombre" no funciona lo que significa que no es TButton. y ¿Cómo se haria un Typecast del tipo de objeto para poder poder trabajar con el, o sea convertirlo en un TButton ?.

Saludos.

Jose Vte.

Re: Que tipo de objeto es oSender

Publicado: Jue Oct 08, 2015 10:08 pm
por jvtecheto
Hola:

Me contesto un poco a mi mismo (Espero que no me este volviendo loco :D )

esto me funciona bien...

IF oSender == ::oButton2
::oButton2:cText:="Ficha2"
ENDIF

¿Es correcto trabajar asi o hay otra manera?

Pero sigo teniendo la duda ¿De que tipo es oSender?, ¿existe una manera directa de conocer si es un Button, TEdit, etc.?
¿Cómo se hace un cambio de un tipo de objeto, que sea compatible, claro?, por ejemplo convertir un FlatBtn en un Button.

Buenas noches.

Jose Vte.

Re: Que tipo de objeto es oSender

Publicado: Vie Oct 09, 2015 10:28 am
por ignacio
Buenos días,

oSender hace referencia al control que dispara el evento. Por ejemplo en un evento OnClick el objeto oSender puede ser un botón, pero también una imagen, un label, etc. Observe como en Xailer es posible establecer el mismo gestor de eventos para varios controles, incluso de distinta clase.

Para saber el tipo de control que es utilice el método IsKindOf( cClass ) que no sólo le indica si es de una determinada clase, sino incluso, si hereda de ella. Por ejemplo:

oButton:IsKindOf( "TControl" ) .AND. olabel:IsKindOf( "TControl" ) --> .T.
IF oSender == ::oButton2
::oButton2:cText:="Ficha2"
ENDIF
Este tipo de comprobaciones son validas únicamente utilizando el operador == e indican que ambas variables APUNTAN al mismo objeto, es decir, son realmente lo mismo. Observe que las comparaciones != no funcionan, por lo que deberá usar !( obj1 == obj2 ).

Saludos

Re: Que tipo de objeto es oSender

Publicado: Vie Oct 09, 2015 10:32 am
por jfgimenez
oSender siempre es el objeto que dispara el evento. Si has tenido que comprobar si oSender es un determinado control, seguramente es porque estarás llamando a ese método desde otro sitio, y no se está pasando oSender. Puedes comprobar quién ha llamado al método poniendo un breakpoint y mirando la pila de llamadas. O llamando a la función DebugStack( [nLevels] ), que mostrará en la ventana del debugger la pila de llamadas. También puedes comprobar el tipo de objeto que es oSender consultando su propiedad Classname (p.ej. LogDebug( oSender:Classname ) )

Por otro lado, no hay que hacer ningún casting. El casting es necesario en lenguajes "tipados" como Pascal o C, pero xBase no es tipado, y por lo tanto puedes usar directamente el objeto. En todo caso, si este evento está asignado a distintos objetos, entonces sí que puedes comprobar cual de ellos lo ha disparado usando una comparación como la que has puesto (IF oSender == ::oButton2). En este caso, debes tener en cuenta que para comparar dos objetos, el único operador que se puede utilizar es == (igual exacto). Si quieres comprobar si es distinto no puedes usar != ni <>, sino que tienes que seguir usando el igual exacto y negar la expresión. P.ej.: IF !( oSender == ::oButton2 )

Re: Que tipo de objeto es oSender

Publicado: Sab Oct 10, 2015 9:37 am
por jvtecheto
Gracias a los 2 por vuestra explicación detallada. :P