Como detectar Click fuera de un objeto

492 views
Skip to first unread message

Ricardo Pina

unread,
Jan 25, 2012, 8:25:12 AM1/25/12
to Grupo VFP
Hola grupo
 
Tengo un objeto dentro de un formulario que creo y hago visible en determinada circunstancia, pero debo salir de el de manera controlada, con teclado no tengo problemas utilizando el evento keypress, pero no puedo identificar cuando se hace click en algun otro control fuera de él,
Se puede identificar de alguna manera como para destruirlo cuando esto ocurra.
El objeto en cuestión es un container con una grilla (no tiene lostfocus y no puedo controlarlo por alli).
 
Saludos
 


--
            

                   Ricardo Pina

Desarrollo y Servicios Informáticos

                  Profesionales
               www.dsip.com.ar

 

 


ZeRoberto

unread,
Jan 25, 2012, 11:01:57 AM1/25/12
to publice...@googlegroups.com
Checa los metodos GotFocus() y LostFocus(), no es necesario saber si
clickeo fuera de tu control, yo tengo algo parecido. Ahora si es una
ventana Activate() y Deactivate().

Suerte

Saludos

El 25/01/12, Ricardo Pina <ric...@gmail.com> escribió:


> Hola grupo
>
> Tengo un objeto dentro de un formulario que creo y hago visible en
> determinada circunstancia, pero debo salir de el de manera controlada, con
> teclado no tengo problemas utilizando el evento keypress, pero no puedo
> identificar cuando se hace click en algun otro control fuera de él,
> Se puede identificar de alguna manera como para destruirlo cuando esto
> ocurra.
> El objeto en cuestión es un container con una grilla (no tiene lostfocus y
> no puedo controlarlo por alli).
>
> Saludos
>
>
>
> --

> * *
>
> * Ricardo Pina*
>
> *Desarrollo y Servicios Informáticos*
>
> * Profesionales
> www.dsip.com.ar*
>
>
> **
>

Ricardo Pina

unread,
Jan 25, 2012, 11:26:30 AM1/25/12
to publice...@googlegroups.com
Hola ZeRoberto
 
Gracias por contestar, el tema es que el control lo agrego con addobject y es un contenedor con una grilla que no tiene lostfocus(), estoy viendo por le lado del valid(). Además, para complicarla un poco la grilla interactua con un textbox asociado del formulario y ahi pasa por el valid() y en ese caso no debo destruirlo.
 
Saludos

Irlandes 1960

unread,
Jan 25, 2012, 12:29:13 PM1/25/12
to publice...@googlegroups.com
Una solución un tanto densa puede ser el gotfocus de los otros objetos, que se activará al hacer clic en ellos, y si existe el contenedor de la grilla, destruirlo.
Ahora, ¿me permitís una digresión? 
Nunca utilice el tema del addobjetc ya que me dificulta el diseño de los forms, al agregar objetos por programación que no puedo ver en tiempo de diseño.
En cambio suelo utilizar la propiedad visible , ocultando o mostrando el objeto según sea necesario, o bien pasar a otra solapa específica (suelo trabajar mucho con pageframe como objeto contenedor con tabs = .f. que me ha resultado muy práctico) 
Me gustaría conocer tu opinión.

Ricardo Pina

unread,
Jan 25, 2012, 1:24:27 PM1/25/12
to publice...@googlegroups.com
Hola Irlandes
 
Este control lo utilizo en varios formularios y quisiera buscar una solución general como para reutilizar ya que lo tengo guardado como una clase.
Cumple una función de busqueda incremental y esta asociada a los text de las columnas de otras grillas de los formularios.
En el caso de objetos que no tienen que ver con el resto del formulario y reutilizables me parece más coherente instanciarlos bajo demanda y no tenerlos como no visibles, ya que si tengo que hacerle algún cambio solo toco la clase y no tengo que revisar cada instancia que tenga en los formularios por si no la heredan.
Generalmente los objetos o controles que agrego de esta manera son no visuales, y no traen problemas ( o por lo menos estos problemas ).
En cuanto a los pageframes yo tambien los utilizo con tabs=.f. en lso abm y muestro la primer page vacia cuando no hay datos y en edicion muestro las demas pages con los controles de cada formulario.
 
Saludos y gracias

Irlandes 1960

unread,
Jan 25, 2012, 6:01:48 PM1/25/12
to publice...@googlegroups.com
A ver si te cierra este camino, que no se me ocurre otro
1) en la clase del formulario del cual derivan todos agregas una propiedad, por ejemplo "destruyalo" en principio vacía.
2) cuando instancias la clase que crea ese objeto que luego queres destruir, cargas su nombre en thisform.destruyalo = 'contenedor'
3) en las clases de las cuales derivan todos los otros objetos que estan en el formulario, agregas en el gotfocus la destrucción del objeto que tengas cargado en la propiedad thisform.destruyalo, o nada si esta sigue vacía.
De esta manera cuando clickeas sobre cualquier objeto del formulario que no este dentro de ese contenedor, el mismo se destruye, sin necesidad de escribir nada, ya que todo se hereda de las clases 
Obviamente, si llegas a incluir código en un evento gotfocus, te tenes que acordar de incluir la clausula dodefault() 
Otra digresión: ¿alguna vez te paso que no herede código de una clase? En mi experiencia eso nunca pasa. Y si agrego nuevas propiedades, nuevos métodos, o nuevo código en métodos ya existentes, al recompilar la aplicación se hereda sin hacer nada.
En todo caso cuando NO quiero que lo haga, es cuando tengo que poner algo en ese método, por lo menos un asterisco.
Gracias por tus comentarios, y espero que el enfoque te sirva.

Ricardo Pina

unread,
Jan 25, 2012, 8:05:51 PM1/25/12
to publice...@googlegroups.com
Hola
 
Estoy siguiendo la alternativa del lostfocus del contenedor que en el que esta la grilla, cuando salgo de la grilla, tambien ejecuta el lostfocus del contenedor, ahi estoy viendo si la salida es "licita" interctuando con el textbox o debo destruirlo, voy a probar de utilizar un tipo de flag como bien dices.
En cuanto a tu digresión, solamente me ha pasado por torpeza mía, al olvidar algún dodefault(), es más factible cambiar alguna propiedad teniendo instanciado el control  pudiendo alterar el comportamiento de algún metodo en forma no deseada.
 
Gracias por tu interes

ZeRoberto

unread,
Jan 26, 2012, 8:21:12 PM1/26/12
to publice...@googlegroups.com
Claro que si lo containers tienen LostFocus y GotFocus, revisa bien derrepento no te fijaste bien. Y si por X motivo no lo tiene entonces ponlo un boton en modo Invisible.
 
Saludos

Daniel Sánchez

unread,
Jan 27, 2012, 2:30:26 AM1/27/12
to publice...@googlegroups.com
Has pensado poner tu textbox y tu grid dentro de un contenedor lo que significa que al salir del enfoque de dicho contenedor destruyes, ocultas el objeto contenedor matando dos pájaros de un tiro, el textbox y el grid.

Saludos

--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047
Trujillo - Perú

Ricardo Pina

unread,
Jan 27, 2012, 8:36:00 AM1/27/12
to publice...@googlegroups.com
Hola ZeRoberto
 
Si, por ahi lo manejé, en el lostfocus() del container veo si esta saliendo "bien" o lo tengo que destruir.

2012/1/26 ZeRoberto <zero...@gmail.com>

Claro que si lo containers tienen LostFocus y GotFocus, revisa bien derrepento no te fijaste bien. Y si por X motivo no lo tiene entonces ponlo un boton en modo Invisible.
 
Saludos

Ricardo Pina

unread,
Jan 27, 2012, 8:43:03 AM1/27/12
to publice...@googlegroups.com
Hola Daniel
 
El Textbox es el de una columna de una grilla y utilizo el control este para realizar busqueda incremental.
Lo instancio en cada celda de la columna asociada con el keypress.
 
Saludos

ZeRoberto

unread,
Jan 27, 2012, 11:28:37 AM1/27/12
to publice...@googlegroups.com
Te recomiendo que no lo destruya sino ocultalo evitas estar creando cada rato.
 
Saludos

Ricardo Pina

unread,
Jan 27, 2012, 6:31:20 PM1/27/12
to publice...@googlegroups.com
Hola
 
Que inconveniente puede ocacionar instanciarlo y destruirlo cada vez que lo utilizo?
Lo utilizo en varias columnas y con distintos cursores en cada una y se lo asigno en el Init().
No veo demoras en la ejecución y me aseguro el origen de datos al instanciarlo.
 
Saludos 

Daniel Sánchez

unread,
Jan 28, 2012, 1:51:21 PM1/28/12
to publice...@googlegroups.com
Si adjuntaras una imagen de lo que quieres o tratas de lograr nos
darias una mejor idea de tu caso.

Ricardo Pina

unread,
Jan 28, 2012, 2:03:38 PM1/28/12
to publice...@googlegroups.com
Hola
 
Gracias Daniel por tu interes.
Ya pude solucionarlo utilizando el lostfocus() del contenedor de la grilla.
Cuando realizo un click fuera de la grilla se ejecuta el lostfocus() del contenedor y es ahi que determino se destruir el objeto o no.
 
Saludos
Reply all
Reply to author
Forward
0 new messages