In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Que tipo de objeto es oSender

Foro de Xailer profesional en español
Responder
jvtecheto
Mensajes: 127
Registrado: Jue Dic 19, 2013 1:18 pm

Que tipo de objeto es oSender

Mensaje 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.
jvtecheto
Mensajes: 127
Registrado: Jue Dic 19, 2013 1:18 pm

Re: Que tipo de objeto es oSender

Mensaje 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.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Que tipo de objeto es oSender

Mensaje 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
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5705
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Re: Que tipo de objeto es oSender

Mensaje 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 )
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
jvtecheto
Mensajes: 127
Registrado: Jue Dic 19, 2013 1:18 pm

Re: Que tipo de objeto es oSender

Mensaje por jvtecheto »

Gracias a los 2 por vuestra explicación detallada. :P
Responder