Comunidad Gambas-es
[SOLUCIONADO] Control personalizado con foco pero no se puede escribir en el - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forumdisplay.php?fid=3)
+--- Foro: General (https://gambas-es.org/forumdisplay.php?fid=4)
+--- Tema: [SOLUCIONADO] Control personalizado con foco pero no se puede escribir en el (/showthread.php?tid=557)



Control personalizado con foco pero no se puede escribir en el - gambafeliz - 28-08-2021

Hola

Hace tiempo hice un control personalizado basado en un TextBox. Yo por código hago un SetFocus y le levanto desde el control personalizado con Raise el GotFocus este no da la posibilidad de escribir en el. Cuando clicko por ejemplo en el, si puedo escribir. Y esto mismo lo hago sin usar SetFocus, pero llego al control desde la tecla Tab o con el ratón, entonces todo va bien, osea, se puede escribir.

Por lo tanto:

1. Cuando accedo a el con la tecla Tab, si puedo escribir.
2. Cuando accedo con Click, si puedo escribir.
3. Cuando por código accedo con SetFocus, no me deja escribir, aunque si pregunto por código con HasFocus si tiene el foco, me devuelve, True.

Alguien por favor le suena que puedo hacer para resolver este contratiempo. Gracias.

Nota: No deseo poner el código, perdón, pero prefiero ser directo.

==== Solución ====================================================

Como es un componente o un Control esté esta hecho de muchos mas controles cuando le solicitas a esté control que te presente sus Children este presenta en mi caso 1 y es su formulario que contiene todos los controles, lo curioso es que cuando recorro todas las propiedades una de las propiedades son los controles que están en el interior de formulario y gracias a esto lo he hecho es nombrar al control TextBox que me interesa y le nombro el evento SetFocus y listo ahora cuando hago SetFocus es por fin visible para el usuario el prompt y por lo tanto es posible escribir.


RE: Control personalizado con foco pero no se puede escribir en el - Shordi - 28-08-2021

Sin el código poco te podemos decir. Lo único que se me ocurre es que no esté en primer plano y tenga delante un panel o algo así no visible pero que impida el acceso...
Ya te digo, sin código...


Saludos


RE: Control personalizado con foco pero no se puede escribir en el - gambafeliz - 28-08-2021

Era el control que hicimos junto que tenia textbox, Imagebutton, y label, pero ojo si funciona solo que no funciona cuando hago por código el setfocus hacia el. Y lo único que quería era como una lluvia de ideas, opiniones para que yo mire. Pienso que es como si el form que lo contiene recibe el foco y no el Textbox pero estoy intentando ver que pasa y no lo veo.

Gracias de todas formas.


RE: Control personalizado con foco pero no se puede escribir en el - Shordi - 28-08-2021

Por lo que cuentas el que recibe el foco es el contenedor del texbox. Establece en su evento gotfocus que se lo pase al texbox y funcionará.


RE: Control personalizado con foco pero no se puede escribir en el - gambafeliz - 28-08-2021

En el componente pongo:
GAMBAS
  1. Public Sub _new()
  2.  
  3. $texto = New _TextTips(Me) 'Creamos la instancia del formulario
  4. $obs = New Observer($texto.txt) As "obsComponente" ''Observo el componente que quiera o el formulario
  5.  
  6. Print $texto.Parent
  7.  
  8.  
  9. Public Sub obsComponente_GotFocus()
  10.  
  11. Raise GotFocus() '' Levanto el evento para el componente o formulario <---- Aquí entra al hacer setfocus por código desde el exterior.
  12.  



Entonces por que no se ve el prompt en la caja TextBox del componente, """ No lo veo, el por que ????

Otra cosa como puedo depurar el código desde el .SetFocus de mi formulario FMain al interior de mi componente, es que yo le pongo un punto pero no entra dentro del componente para seguir el código, es que no es posible hacerlo?

Como te dije cuando hago .SetFocus .HasFocus me dice True, es posible que tenga que levantar en alguna parte que desconozco la caja del textbox??

Otra cosas este TextBox esta diseñado así: en el raiz esta Panel1 y dentro hay un HBox1 y dentro HBox2 y dentro el TextBox

Te suena algo por que sigo sin ver nada. Ojo lo curioso es que si Clicko todo normal o si recibe el TAB también todo normal.


RE: Control personalizado con foco pero no se puede escribir en el - Shordi - 29-08-2021

Veo aquí algunas cosas raras:
(28-08-2021, 21:07)gambafeliz escribió:  En el componente pongo:

Public Sub _new()

$texto = New _TextTips(Me) 'Creamos la instancia del formulario
$obs = New Observer($texto.txt) As "obsComponente" 'Observo el componente que quiera o el formulario
Un observer observa controles. no cadenas de texto por tanto debería ser New Observer($Texto) as "obsComponente" símplemente

Print $texto.Parent

End

Public Sub obsComponente_GotFocus()

Raise GotFocus() '' Levanto el evento para el componente o formulario <---- Aquí entra al hacer setfocus por código desde el exterior.
No veo necesario levantar el evento. Aquí simplemente
$texto.textbox1.setfocus()
y debería funcionar

End

Entonces por que no se ve el prompt en la caja TextBox del componente, """ No lo veo, el por que ???? Porque lo tiene el componente en sí, pero no lo pasa al $texto.

Otra cosa como puedo depurar el código desde el .SetFocus de mi formulario FMain al interior de mi componente, es que yo le pongo un punto pero no entra dentro del componente para seguir el código, es que no es posible hacerlo?

Como te dije cuando hago .SetFocus .HasFocus me dice True, es posible que tenga que levantar en alguna parte que desconozco la caja del textbox?? La que te indico más arriba

Otra cosas este TextBox esta diseñado así: en el raiz esta Panel1 y dentro hay un HBox1 y dentro HBox2 y dentro el TextBox

Te suena algo por que sigo sin ver nada. Ojo lo curioso es que si Clicko todo normal o si recibe el TAB también todo normal. Click es un evento que se hace sobre el textbox directamente y Tab mueve el foco sólo a los controles que lo pueden mantener (textobox, textArea, combobox, etc.) por eso el foco pasa al textbox.

Haz esos cambios que te digo y ya me cuentas.

Saludos.

Por otro lado, si el objetivo del componente es mostrar un textbox con un texto predeterminado cuando esté vacío, a partir de la version 3.16.2 eso viene de serie en muchos controles, el textbox entre ellos, en una propiedad llamada "PlaceHolder". Lo mismo puedes simplificar o perfeccionar tu código con eso.


Saludos.


RE: Control personalizado con foco pero no se puede escribir en el - gambafeliz - 29-08-2021

Gracias Shordi si seguimos tu anterior comentario y comento de arriba hacia abajo, numerando cada azul tuyo, te cuento:

1. txt es el nombre para referirme a TextBox1, por lo tanto esta bien y no tengo que cambiar nada. Además sigo tus instrucciones ya que lo hicimos juntos.
2. Raise también esta bien, ya que se refiere a txt nuevamente, o lo que es lo mismo es un evento de txt. Además son instrucciones tuya de mi control.
3. Estoy deacuerdo.
4. Ni idea oiga.
5. Si estoy deacuerdo.

En fin ya esta solucionado, aunque creo que esta solucionado de forma fullera ya que lo que hago es esto: MiControlPersonalizado.txt.SetFocus desde el código externo que tiene en el FMain el control personalizado.

Pero no veo otra solución, me falta mucho que aprender, pero gracias a personas como tu, algún día incluso podré decir que se programar en Gambas, Smile


RE: Control personalizado con foco pero no se puede escribir en el - Shordi - 29-08-2021

Cita:Además sigo tus instrucciones ya que lo hicimos juntos.
No recuerdo... ¿No tienes un enlace a dónde lo hicimos?


RE: Control personalizado con foco pero no se puede escribir en el - gambafeliz - 30-08-2021

Shordi por un lado tienes razón pero por otro creo que no. Ya que aunque es un hilo del foro antiguo yo creo y solo creo que tu y yo seguimos tu explicación por otros medios. Pero mi memoria no me permite discutir contigo sobre cosas que tu sabes tan bien y no yo.

Como suele ocurrir conmigo tu seguro que tienes mas razón que yo.

Este es el enlace nuestro:
https://foro.gambas-es.org/viewtopic.php?f=4&t=7718&highlight=componente

Voy a probar otra cosa, por que al ver este enlace observo que tu me enseñas algo que yo con mi solución actual infrinjo de tus explicaciones magistrales.

Por otra parte quiero decirte que en el enlace vigilamos un Form y yo solo manejo un TextBox1 que lo contiene el Form.

Gracias como siempre.

Nota:

Mira lo curioso es que en el formulario externo que lo llama con este código si funciona:

GAMBAS
  1. For Each c As Object In ControlPersonal.Children
  2. c.txt.SetFocus ' txt es TextBox1 en el control personal



Es que cuando uno pone ControlPersonal.SetFocus va al control pero no tengo ni idea a donde aunque ponga puntos de interrupción por eso no doy con la solución normal donde el control tras pasar .SetFocus desde el Exterior el asume el prompt en la caja de texto. ????


RE: Control personalizado con foco pero no se puede escribir en el - Shordi - 30-08-2021

(30-08-2021, 09:56)gambafeliz escribió:  Shordi por un lado tienes razón pero por otro creo que no. Ya que aunque es un hilo del foro antiguo yo creo y solo creo que tu y yo seguimos tu explicación por otros medios. Pero mi memoria no me permite discutir contigo sobre cosas que tu sabes tan bien y no yo.

Como suele ocurrir conmigo tu seguro que tienes mas razón que yo.

Este es el enlace nuestro:
https://foro.gambas-es.org/viewtopic.php?f=4&t=7718&highlight=componente

Voy a probar otra cosa, por que al ver este enlace observo que tu me enseñas algo que yo con mi solución actual infrinjo de tus explicaciones magistrales.

Por otra parte quiero decirte que en el enlace vigilamos un Form y yo solo manejo un TextBox1 que lo contiene el Form.

Gracias como siempre.

Nota:

Mira lo curioso es que en el formulario externo que lo llama con este código si funciona:

GAMBAS
  1. For Each c As Object In ControlPersonal.Children
  2. c.txt.SetFocus ' txt es TextBox1 en el control personal



Es que cuando uno pone ControlPersonal.SetFocus va al control pero no tengo ni idea a donde aunque ponga puntos de interrupción por eso no doy con la solución normal donde el control tras pasar .SetFocus desde el Exterior el asume el prompt en la caja de texto. ????
En lugar de esto:
GAMBAS
  1. Public Sub obsComponente_GotFocus()
  2.  
  3. Raise GotFocus() '' Levanto el evento para el componente o formulario <---- Aquí entra al hacer setfocus por código desde el exterior.


Prueba esto:
GAMBAS
  1. Public Sub obsComponente_GotFocus()
  2.  
  3. $texto.txt.setfocus()
  4.  



Otra cosa a probar es añadir ésto al _New() del componente



GAMBAS
  1. ....
  2. ....
  3.  
  4. Public Sub _new()
  5.  
  6.     $texto = New _TextTips(Me) 'Creamos la instancia del formulario
  7.     $obs = New Observer(_textbox) As "elForm" 'creamos el observador del formulario que detectará los eventos que éste levante
  8.     Me.Proxy = $texto   'Con esto el componente hereda los eventos de teclado y ratón del control $texto. Ignoro si se aplica a setfocus y gotfocus, pero por probar no pierdes nada
  9.     
  10. .....





Y por último, me siento tonto buscando corregir los defectos de un código que no he visto y que no quieres mostrar. Sube el código si quieres ayuda.

Saludos