Página 1 de 1

Cambiar texto en input

Publicado: 12 Nov 2011, 00:24
por avechuche
Tengo una duda, necesito cambiar el texto de un input cuando este input tenga el focus.

Osea, tengo un input con texto "Esperando ..." y que cuando ese input tenga el foco, se borre "Esperando ..." dejando el input en blanco para escribir. Ahora si escribo algo que quede tal cual, pero si no escribo nada, y saco el foco de ese input, quiero que vuelva la palabra "Esperando ...". Alguna sugerencia? Gracias!!!

Re: Cambiar texto en input

Publicado: 12 Nov 2011, 06:09
por chekok
hace un tiempo tuve el mismo problema y encontre la solucion, en cuanto vuelva a casa te subo el code (estoy de viaje de negocios y no llevo conmigo mi pc ni me acuerdo de memoria de todo el code), te contesto desde el movil. El lunes o martes proximo te lo subo. Un saludo.

Re: Cambiar texto en input

Publicado: 12 Nov 2011, 09:57
por avechuche
Perfecto, a esperar. Muchas Gracias!

Re: Cambiar texto en input

Publicado: 12 Nov 2011, 18:01
por Jonny
¿Es un imput creado con las funciones GUI de autoit?.

Si es así, prueba con la función GuiCTRLSetData().

Salu2!

Re: Cambiar texto en input

Publicado: 12 Nov 2011, 22:26
por Chefito
Lo mejor para hacer esto es utilizar los eventos del input que se disparan cuando éste gana y pierde el foco. Te recomiendo que mires en la ayuda la función _GUICtrlEdit_Create, donde en el ejemplo encontrarás casi todos los eventos que dispara un input/edit. De aquí está sacado el ejemplo que te voy a poner a continuación....algo modificado, por supuesto :smt024 :

Código: Seleccionar todo

#include <GuiEdit.au3>
#include <WinAPI.au3> ; used for Lo/Hi word
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>

Opt('MustDeclareVars', 1)

Global $Input_1, $boton, $Input_2, $aux=True

Local $hGUI

; Create GUI
$hGUI = GUICreate("", 400, 300)
$boton=GUICtrlCreateButton("Mi boton", 40,40)
$Input_1 = GUICtrlCreateInput("Esperando ...", 10,10, 100)
GUICtrlSetColor(-1,0x8080ff)
$Input_2= GUICtrlCreateInput("", 10,100)
GUISetState()

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

; Loop until user exits
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
GUIDelete()

Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg
    Local $hWndFrom, $iIDFrom, $iCode, $hWndEdit
    If Not IsHWnd($Input_1) Then $hWndEdit = GUICtrlGetHandle($Input_1)
    $hWndFrom = $ilParam
    $iIDFrom = _WinAPI_LoWord($iwParam)
    $iCode = _WinAPI_HiWord($iwParam)
    Switch $hWndFrom
        Case $Input_1, $hWndEdit
            Switch $iCode
				Case $EN_KILLFOCUS ; Sent when an edit control loses the keyboard focus
					If GUICtrlRead($Input_1)="" Then
						GUICtrlSetColor($Input_1,0x8080ff)     ;Cambio el color del texto del Input.
						GUICtrlSetData($Input_1,"Esperando ...")     ;Pongo es texto Esperando ... en el Input.
						$aux=True
					Else
						$aux=False
					EndIf
                Case $EN_SETFOCUS ; Sent when an edit control receives the keyboard focus
					If $aux Then
						GUICtrlSetData($Input_1,"")     ;Borro el contenido del Input.
						GUICtrlSetColor($Input_1,0)     ;Cambio el color del texto del Input a negro.
					EndIf
			EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND
Te explico un poco.
Con GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") registramos (recogemos) los mensajes de nuestra ventana que pertenecen a wm_command. Se recogen muchos mensajes, así que filtramos los que nos interesan, que son los que dispara nuestro input (Case $Input_1, $hWndEdit) cuando pierde ($EN_KILLFOCUS) o gana ($EN_SETFOCUS) el foco. Dentro de estos case introducimos el código apropiado para que cuando pierda el foco aparezca el texto "Esperando ...", y cuando lo gane se quede en blanco preparado para escribir.
Si miras bien el código se puede optimizar más, ya que no he variado nada del principio de la función wm_command del ejemplo. Esto si quieres lo investigas tú :smt002 .

Le he añadido un par de opciones más que veo lógica. Le he cambiado el color al texto "Esperando ...", poniendolo más clarito (esto es cuestión de gustos), y otra más importante, le he puesto una condición apoyándome en una variable auxiliar ($aux), la cual dice que si en el input hay texto escrito, que si pierde el foco no lo borre, y si lo gana, no lo machaque poniendo el texto "Esperando ...". Si no hay nada escrito en el input, funciona normalmente.

Si no quieres que pase esto último solamente tienes que cambiar este código:

Código: Seleccionar todo

				Case $EN_KILLFOCUS ; Sent when an edit control loses the keyboard focus
					If GUICtrlRead($Input_1)="" Then
						GUICtrlSetColor($Input_1,0x8080ff)     ;Cambio el color del texto del Input.
						GUICtrlSetData($Input_1,"Esperando ...")     ;Pongo es texto Esperando ... en el Input.
						$aux=True
					Else
						$aux=False
					EndIf
                Case $EN_SETFOCUS ; Sent when an edit control receives the keyboard focus
					If $aux Then
						GUICtrlSetData($Input_1,"")     ;Borro el contenido del Input.
						GUICtrlSetColor($Input_1,0)     ;Cambio el color del texto del Input a negro.
					EndIf
por este otro:

Código: Seleccionar todo

				Case $EN_KILLFOCUS ; Sent when an edit control loses the keyboard focus
						GUICtrlSetColor($Input_1,0x8080ff)     ;Cambio el color del texto del Input.
						GUICtrlSetData($Input_1,"Esperando ...")     ;Pongo es texto Esperando ... en el Input.
                Case $EN_SETFOCUS ; Sent when an edit control receives the keyboard focus
						GUICtrlSetData($Input_1,"")     ;Borro el contenido del Input.
						GUICtrlSetColor($Input_1,0)     ;Cambio el color del texto del Input a negro.
Saludos.

Re: Cambiar texto en input

Publicado: 13 Nov 2011, 02:32
por avechuche
estaba seguro de que era con GUIRegisterMsg pero no se utilizarlo muy bien, con esta explicacion va a quedar muy claro. muchisimas gracias!!!!

Re: Cambiar texto en input

Publicado: 21 Nov 2011, 20:18
por avechuche
Otra cosa, con que lenguaje se puede hacer esto mas "sencillamente". Yo con Flash (AS3) es mucho mas facil. en 3 renglones lo tenes (Me refiero a la parte de "WM_COMMAND"). Con .NET se puede hacer mas sencillo?

Re: Cambiar texto en input

Publicado: 22 Nov 2011, 09:28
por Ximorro
AutoIt es ideal para algunas cosas y menos bueno para otras. En concreto el modelo de eventos es demasiado sencillo, y cuando quieres controlarlos mejor tienes que hacer cosas más complejas como mirar los mensajes, como en este ejemplo. Al menos lo bueno del asunto es que se puede, que no es poco.

Si te pasas a otros lenguajes probablemente podrás hacer estas cosas (gestión de eventos) más fácilmente pero habrá otras que sean más farragosas de programar. Comprendo que te haya asustado pero yo le daría una oportunidad a Autoit, cuando comprendes cómo va eso no es tan complicado, y tampoco hay que aprendérselo al dedillo, total para otra vez es básicamente coger ese código y en vez de $EN_SETFOCUS o $EN_KILLFOCUS es poner los eventos correspondientes.

Dicho eso, si te quieres pasar a otros lenguajes probablemente los .NET te servirán bien. En el viejo VB ya había gestión de eventos bastante completa, así que la plataforma .NET lo habrá heredado y seguramente mejorado.
Si te ha asustado AutoIt no te recomiendo usar Java, te parecerá más esotérico. ;-)

Re: Cambiar texto en input

Publicado: 23 Nov 2011, 18:26
por avechuche
Si es verdad. No es que me alla asustado es que muchas cosas "no las entiendo" y como q no da para preguntar todo. Me gusta que si copio un codigo, saberlo aplicar para futuros proyectos. este COMMAND entiendo la mitad. pero hay cosas q no las termino de aprender todavia :(