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