Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

[SOLUCIONADO]  Control personalizado con foco pero no se puede escribir en el
#1

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.
    ¡Gracias!
#2

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

No podemos regresar
[-] Los siguientes 1 usuarios dice gracias a Shordi por este post:
  • gambafeliz
    ¡Gracias!
#3

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.
    ¡Gracias!
#4

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á.

No podemos regresar
    ¡Gracias!
#5

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.
    ¡Gracias!
#6

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.

No podemos regresar
    ¡Gracias!
#7

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
    ¡Gracias!
#8

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

No podemos regresar
    ¡Gracias!
#9

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...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. ????
    ¡Gracias!
#10

(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...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

No podemos regresar
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)