Principales respuestas
ToolTip sobre objeto Deshabilitado

Pregunta
-
Buenas tardes a todos.... mi consulta en esta ocasión, es sobre como poner un ToolTip sobre un objeto que lo tengo deshabilitado... es un botón que se deshabilita porque no hay conexión a Internet... pero yo quiero enviarle un mensaje al usuario indicando el porque esta deshabilitado el botón... lo quiero hacer cuando el usuario pase el mouse sobre el objeto (Mouseover)... pero este no esta disponible si el objeto no esta habilitado...
Alguna sugerencia ???
Gracias por su ayuda...
Respuestas
-
Estoy de acuerdo con lo de que la solución (si es que se le puede llamar solución) es burda, porque, de hecho, no es la solución a lo que planteas.
Estuve revisando y sí existe una forma de hacerlo. Suponiendo que tu botón se llama "Button1" y el control de tips "ToolTip1", el código te queda así:
Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs) 'Requerido MyBase.OnMouseMove(e) 'Si el cursor está sobre el botón If Me.GetChildAtPoint(e.Location) Is Button1 Then 'Si el tip no está visible, lo muestro If String.IsNullOrEmpty(ToolTip1.GetToolTip(Me)) Then ToolTip1.SetToolTip(Me, ToolTip1.GetToolTip(Button1)) ToolTip1.Show(ToolTip1.GetToolTip(Me), Me, e.Location, 5000) End If ElseIf Not String.IsNullOrEmpty(ToolTip1.GetToolTip(Me)) Then 'Si el tip está visible 'Oculto tip ToolTip1.SetToolTip(Me, String.Empty) ToolTip1.Hide(Me) End If End Sub
Lo que hago aquí es usar la función compartida GetChildAtPoint de la clase Control, que me devuelve el control ubicado en las coordenadas indicadas en el primer parámetro. Como ves, esto lo hago dentro del evento MouseMove del formulario; de ese modo, puedo verificar si el cursor está sobre el botón inactivo, y en caso afirmativo, muestro el tip. Al mismo tiempo, cuando el cursor sale de sobre el botón, oculto el tip.
Cabe mencionar que probé hacer esto en el evento MouseHover del formulario, pero por alguna razón, no funcionó. A veces mostraba el tip, y otras veces no. Por eso decidí dejarlo en MouseMove.
Por favor, prueba el código y dinos que tal te va. Es mi más sincero deseo que puedas deshacerte lo más pronto posible de ese falso botón desactivado, y trabajar como debe ser. :D
Un saludo.
Me lo contaron y lo olvidé; lo vi y lo entendí; lo hice y lo aprendí
Confucio- Marcado como respuesta wichortiz miércoles, 5 de junio de 2013 18:38
-
Disculpa la demora. No tengo internet en casa.
Pues ciertamente me faltó ese detalle. Para corregirlo, valida que el botón esté inactivo también. Modifícalo así:
'Si el botón está inactivo y el cursor está sobre él If Not Button1.Enabled _ AndAlso Me.GetChildAtPoint(e.Location) Is Button1 Then ... ElseIf ... ... End If
Así validas que el botón esté inactivo para mostrar el tip. En caso contrario, no se muestra.
Omití el resto del código para que te quedara claro cuál es la modificación. De resto todo queda igual.
Saludos.
Me lo contaron y lo olvidé; lo vi y lo entendí; lo hice y lo aprendí
Confucio- Editado Jeison Friedman viernes, 7 de junio de 2013 18:11
- Marcado como respuesta wichortiz sábado, 8 de junio de 2013 16:26
Todas las respuestas
-
hola
el tema es que el concepto de enabled=false tambien anula todos los eventos del control
quizas deberias buscar algun otro estado como ser readonly
o sea desde codigo le quitas el evento, lo desatachas
y luego le cambias el color al boton para indicar que esta anulado, le puede cambiar el color de la fuente tambien
pero no usas la propeidad enabled para nada, asi simularias un deshabilitado de forma manual sin anular por completo los eventos
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina- Propuesto como respuesta Sergio Parra miércoles, 29 de mayo de 2013 6:46
-
Muchas gracias Leandro por tu amable respuesta..... lastimosamente no he podido aplicarla, ya que la propiedad "readonly" no existe para el boton, por lo tanto no tengo idea de como "desatacharlo"... y es que la verdad no estoy muy diestro en la programacion a ese nivel. Si me pudieras dar una idea de como proceder te estaria agradecido...
Esperando tu respuesta.
-
Bueno... les escribo para contarles una solucion temporal que encontre para el problema planteado ya que en ninguna parte he podido encontrar una solucion favorable....
Lo que hice, sencillamente fue crear dos botones, uno para "habilitado" y el otro para "Deshabilitado", cambiando el color de fondo para este ultimo.... al abrir el formulario, verifico la conexion a internet y dependiendo de lo que resulte, hago visible uno que otro boton.... un poco burda la solucion pero al fin y al cabo, para el usuario es indiferente como se soluciona, si no como se lo presentas.... (El boton deshabilitado no tiene codigo, por lo que aunque se presione, no va a hacer nada)...
Gracias Leandro por tu tiempo y si se te ocurre otra solucion con gusto la estare aplicando...
-
Estoy de acuerdo con lo de que la solución (si es que se le puede llamar solución) es burda, porque, de hecho, no es la solución a lo que planteas.
Estuve revisando y sí existe una forma de hacerlo. Suponiendo que tu botón se llama "Button1" y el control de tips "ToolTip1", el código te queda así:
Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs) 'Requerido MyBase.OnMouseMove(e) 'Si el cursor está sobre el botón If Me.GetChildAtPoint(e.Location) Is Button1 Then 'Si el tip no está visible, lo muestro If String.IsNullOrEmpty(ToolTip1.GetToolTip(Me)) Then ToolTip1.SetToolTip(Me, ToolTip1.GetToolTip(Button1)) ToolTip1.Show(ToolTip1.GetToolTip(Me), Me, e.Location, 5000) End If ElseIf Not String.IsNullOrEmpty(ToolTip1.GetToolTip(Me)) Then 'Si el tip está visible 'Oculto tip ToolTip1.SetToolTip(Me, String.Empty) ToolTip1.Hide(Me) End If End Sub
Lo que hago aquí es usar la función compartida GetChildAtPoint de la clase Control, que me devuelve el control ubicado en las coordenadas indicadas en el primer parámetro. Como ves, esto lo hago dentro del evento MouseMove del formulario; de ese modo, puedo verificar si el cursor está sobre el botón inactivo, y en caso afirmativo, muestro el tip. Al mismo tiempo, cuando el cursor sale de sobre el botón, oculto el tip.
Cabe mencionar que probé hacer esto en el evento MouseHover del formulario, pero por alguna razón, no funcionó. A veces mostraba el tip, y otras veces no. Por eso decidí dejarlo en MouseMove.
Por favor, prueba el código y dinos que tal te va. Es mi más sincero deseo que puedas deshacerte lo más pronto posible de ese falso botón desactivado, y trabajar como debe ser. :D
Un saludo.
Me lo contaron y lo olvidé; lo vi y lo entendí; lo hice y lo aprendí
Confucio- Marcado como respuesta wichortiz miércoles, 5 de junio de 2013 18:38
-
Gracias ENORMES Jason !!!!!.... una solucion bastante creativa en realidad y muy efectiva, te agradezco mucho tu respuesta que ha sido la verdadera solucion a mi inconveniente.... me trabaja perfectamente con un pequeño cambio.... la parte:
MyBase.OnMouseMove(e)
La cambie por:
Handles MyBase.MouseMove
Ya que me daba unos erroes de desbordamiento y no me recuerdo exactamente los otros.... pero con ese cambio trabaja como queria (por supuesto, le cambie el nombre al boton)....
Solo me queda una "pequeña" duda... y es que cuando el boton esta habilitado (hay conexion a Internet), la primera vez que paso el Mouse sobre el boton, me presenta el mensaje del Tooltip, luego ya no..... a que se debera ???....
De nuevo muchas gracias y me complace que gente tan capaz como tu y Leandro se molesten en ayudarnos a nosotros los mortales, jajajajajajaja
Saludos.
-
Disculpa la demora. No tengo internet en casa.
Pues ciertamente me faltó ese detalle. Para corregirlo, valida que el botón esté inactivo también. Modifícalo así:
'Si el botón está inactivo y el cursor está sobre él If Not Button1.Enabled _ AndAlso Me.GetChildAtPoint(e.Location) Is Button1 Then ... ElseIf ... ... End If
Así validas que el botón esté inactivo para mostrar el tip. En caso contrario, no se muestra.
Omití el resto del código para que te quedara claro cuál es la modificación. De resto todo queda igual.
Saludos.
Me lo contaron y lo olvidé; lo vi y lo entendí; lo hice y lo aprendí
Confucio- Editado Jeison Friedman viernes, 7 de junio de 2013 18:11
- Marcado como respuesta wichortiz sábado, 8 de junio de 2013 16:26
-