31 de marzo de 2017

Evitar salir de los TextBox al borrar con BackSpace

Mucha gente desea saber si es un bug de los controles TextBox, y cómo evitarlo. Aquí veremos la explicación sobre el tema.

No es un error, es el comportamiento normal de VFP, y tanto no es un error que puedes cambiarlo, para esto, puedes codificar lo siguiente en el evento KeyPress de tu clase TextBox personalizada (que así lo deberíamos tener todos):

IF nKeyCode = 127 AND (LEN(ALLTRIM(this.Value))-1 < 0)
  NODEFAULT
ENDIF

Un pequeño código para probarlo:

oForm = CREATEOBJECT("MyForm")
oForm.Show(1)
DEFINE CLASS myForm AS Form
   ADD OBJECT TextBox1 AS MyTextBox WITH Top=20, Width=150, Height= 25
   ADD OBJECT TextBox2 AS MyTextBox WITH Top=50, Width=150, Height= 25
   PROCEDURE Init
      SET CONFIRM ON 
      lcMessage = "Escriba un texto en las cajas, borre el contenido con BackSpace"+;
                  CHR(13)+"Verá el comportamiento cambiado"
       MESSAGEBOX(lcMessage,64,"Aviso")
   ENDPROC
ENDDEFINE
DEFINE CLASS myTextBox AS TextBox
   PROCEDURE KeyPress
   LPARAMETERS nKeyCode, nShiftAltCtrl
     IF nKeyCode = 127 AND (LEN(ALLTRIM(this.Value))-1 < 0)
        NODEFAULT
      ENDIF
ENDDEFINE

El mismo ejemplo, pero usando BindEvents ( a partir de VFP8):

oForm = CREATEOBJECT("MyForm")
oForm.Show(1)
DEFINE CLASS myForm AS Form
   ADD OBJECT TextBox1 AS TextBox WITH Top=20, Width=150, Height= 25
   ADD OBJECT TextBox2 AS TextBox WITH Top=50, Width=150, Height= 25
   PROCEDURE Init
      SET CONFIRM ON 
      lcMessage = "Escriba un texto en las cajas, borre el contenido con BackSpace"+;
                  CHR(13)+"Verá el comportamiento cambiado"
       MESSAGEBOX(lcMessage,64,"Aviso")
       FOR EACH oControl IN This.Controls 
         IF oControl.BaseClass = 'Textbox'
            BINDEVENT(oControl, 'KeyPress',This,'MyKeyPress')
         ENDIF
       ENDFOR
   ENDPROC
   PROCEDURE myKeyPress
   LPARAMETERS nKeyCode, nShiftAltCtrl
     IF AEVENTS(laControl,0) > 0
       IF nKeyCode = 127 AND (LEN(ALLTRIM(laControl[1].Value))-1 < 0)
          NODEFAULT
       ENDIF
     ENDIF
   ENDPROC
ENDDEFINE

Nota: Para ejecutar los códigos anteriores basta con copiar y pegarlos en tu command window, seleccionar lo y presionar ENTER. Verás como el comportamiento ha cambiado.

Espero les sea de utilidad.

Esparta Palma

1 comentario :