https://foro.gambas-es.org/viewtopic.php?f=1&t=769
-----------------------------------
aristicol
Sabado, 17 Julio 2010, 17:10

Como Saber Que Objeto Tiene El Enfoque
-----------------------------------
Hola compañeros, me gustaría saber si existe una función que me permita saber que objeto tiene el enfoque.


Si alguno conoce, le agradezco de antemano.


-----------------------------------
fabianfv
Sabado, 17 Julio 2010, 17:22

Re: Como Saber Que Objeto Tiene El Enfoque
-----------------------------------
[strike]No, no existe una función que haga eso[/strike]. Ver el mensaje de ahtonio, más abajo.

Se me ocurre que durante el evento GotFocus de un control podrías establecer su propiedad Tag a True y durante el evento LostFocus a False. Así para saber si un control tiene el enfoque sólo deberías mirar el valor de su propiedad Tag (seguramente sería necesario iterar la colección Controls para ello).

Pero es altamente probable que si expones claramente el problema podamos encontrar una solución más eficiente.


-----------------------------------
Invitado
Sabado, 17 Julio 2010, 18:11

Re: Como Saber Que Objeto Tiene El Enfoque
-----------------------------------
Lo que se me ocurre es declarar una variable global de clase, y cuando un control pierda o recupere el foco, la variable sea igual a este control. Me explico:

[code linenumbers=false syntax=gambas]Private foco As Variant 'Declaramos la variable

Public Sub cualquiera_gotfocus()
foco = cualquiera
End

Public Sub listbox1_gotfocus()
foco = listbox1
End[/code]

Claro que es sólo un ejemplo, puedes hacer otras cosas.

Espero haber ayudado, saludos!


-----------------------------------
fabianfv
Domingo, 18 Julio 2010, 01:54

Re: Como Saber Que Objeto Tiene El Enfoque
-----------------------------------
Tomando la mejora de Ayortano, le haría un par de modificaciones al código:
[code linenumbers=false syntax=gambas]
PRIVATE ControlWithFocus AS Object

Public Sub Control_GotFocus()
  ControlWithFocus = Null
End

Public Sub Control_GotFocus()
  ControlWithFocus = LAST
End
[/code]

Donde "Control" podría ser cualquier control (TextBox, ListBox, etc) o bien un grupo de controles (el valor de la propiedad Group de varios controles.


-----------------------------------
jguardon
Domingo, 18 Julio 2010, 02:16

Re: Como Saber Que Objeto Tiene El Enfoque
-----------------------------------
Buena aproximación, fabián, pero me temo que LAST devolverá la referencia al último objeto que haya generado un evento, incluidos los objetos generados por el programador, tales como sockets, files, etc.

Así que bajo mi punto de vista, esto puede acarrear problemas...

http://gambasdoc.org/help/lang/last?es


Saludos


-----------------------------------
fabianfv
Lunes, 19 Julio 2010, 17:32

Re: Como Saber Que Objeto Tiene El Enfoque
-----------------------------------
[quote]
me temo que LAST devolverá la referencia al último objeto que haya generado un evento, incluidos los objetos generados por el programador, tales como sockets, files, etc.

Así que bajo mi punto de vista, esto puede acarrear problemas... 
[/quote]

Pero estamos hablando del uso de LAST dentro de manejadores de evento, por lo que un manejador de eventos para un control o grupo de controles sólo se ejecutará cuando ese control o alguno de los controles agrupados hayan generado el evento, y en consecuencia dentro de ese manejador de eventos LAST únicamente puede devolver una referencia al control al que está asociado o, en el caso de tratarse de un grupo de controles, a uno de los controles agrupados.

Amplío el ejemplo:

[code linenumbers=false syntax=gambas]
PRIVATE ControlWithFocus AS Object
PRIVATE txtNombre AS TextBox

PUBLIC SUB txtNombre_GotFocus()
  ControlWithFocus = LAST
End

'En este caso se trata de controles agrupados (su propiedad Group tiene el mismo valor: Group=DatosPersona)

PUBLIC SUB DatosPersona_GotFocus()
  ControlWithFocus = LAST
End
[/code]


-----------------------------------
jguardon
Lunes, 19 Julio 2010, 17:50

Re: Como Saber Que Objeto Tiene El Enfoque
-----------------------------------
Comprendo. Es evidente lo que dices, no había pensado mucho en ello. Otra cuestión es si es necesario comprobar la pérdida de foco, ya que si un control lo pierde es porque otro lo recibe (aunque sea el propio formulario o un contenedor). Entonces creo que bastaría con el manejador _GotFocus(). 

De todos modos ahora mismo no se me ocurre ninguna razón para que sea necesario conocer qué control tiene el foco... :roll: 

Quizás aristicol nos pueda aclarar su finalidad.

Saludos


-----------------------------------
fabianfv
Lunes, 19 Julio 2010, 18:18

Re: Como Saber Que Objeto Tiene El Enfoque
-----------------------------------
Es cierto, el manejador del evento GotFocus es todo lo que se necesita. Modifico los ejemplos para reflejar esto.


-----------------------------------
ahtonio
Jueves, 22 Julio 2010, 13:08

Re: Como Saber Que Objeto Tiene El Enfoque
-----------------------------------
Hola. Si lo unico que necesitas es saber el control activo, mira la documentacion de Gambas2, el objeto Application tiene una propiedad activecontrol que devuelve una referencia al control activo:

Application (gb.qt)
Global information about application. 

Symbols
This class reimplements Application in gb. Static properties   
[color=blue]Args  Daemon  Dir  Env  Handle  Id  Name  Path  Return  Title  Version     [/color]
--------------------------------------------------------------------------------
This class is static.

--------------------------------------------------------------------------------
Static properties   
[color=red]ActiveControl[/color] [color=blue] ActiveWindow  Busy  Embedder  Font  MainWindow  Theme  ToolTip   [/color]  

de este modo, siempre puedes

Public sub mi_proc()
   DIM hctl AS Control
   hctl = Application.ActiveControl
   DEBUG hctl.Name           ' Mostrar el nombre del control por consola en tiempo de diseño
...
   'Operaciones con el control activo
...
End





Espero haber sido de ayuda.


-----------------------------------
fabianfv
Jueves, 22 Julio 2010, 17:27

Re: Como Saber Que Objeto Tiene El Enfoque
-----------------------------------
Gracias ahtonio, a mí me sirve de mucho porque no recordaba en absoluto que la clase Appication tuviera esa propiedad.

Saludos.


-----------------------------------
Ronny
Viernes, 20 May 2011, 20:09

Re: Como Saber Que Objeto Tiene El Enfoque
-----------------------------------
En efecto,  la implementación  para saber el nombre de cualquier control activo  se  haria asi de simple:


 
 a los controles que quieras  conocer su nombre, encierralos en un grupo 

imagina que el grupo se llama a

PUBLIC SUB a_GotFocus()

variable o control texto= Application.ActiveControl.name

END
listo


-----------------------------------
soplo
Viernes, 20 May 2011, 21:22

Re: Como Saber Que Objeto Tiene El Enfoque
-----------------------------------
¿Y no acabas antes si pones LAST?

[code linenumbers=false syntax=gambas]print LAST.name[/code]

 :mryellow:


-----------------------------------
Ronny
Viernes, 20 May 2011, 21:37

Re: Como Saber Que Objeto Tiene El Enfoque
-----------------------------------
Bueno

como dice nuestro amigo soplo

last.name devuelve el nombre del objeto que..... generó el último evento no que estaba activo..

si quiero saber  esta información desde otro objeto como un buttom. se me enreda el papagallo (como dicen en venezuela) ya que el evento click lo generará el buttom y lo pasará a LAST.  bueno es una  limitante que veo.


