Problema con TextBox y la Barra Espaciadora

220 views
Skip to first unread message

integral

unread,
Mar 10, 2026, 10:49:20 AMMar 10
to Comunidad de Visual Foxpro en Español
Que tal amigos del Foro

Muy Buenos Dias

Recurrido a ustedes por lo siguiente : 

Como puedo cambiar el Texto de un Textbox con la Barra Espaciadora

La idea es al momento se ubicarse en dicho control TextBox el usuario mediante la Barra Espaciadora pueda elejir una opcion pre establecida
algo parecido a una funcion que existia en Foxpro para D.O.S. 2.6 y hacia justamente ese proceso..

Ej. Moneda :   Soles o Dolares o Viceversa.

Tengo el siguiente código en el evento KeyPress de un control TextBox pero no realiza ninguna seleccion. 
 
LPARAMETERS nKeyCode, nShiftAltCtrl
Local lc_LaTecla, lc_Divisa
lc_Divisa = Alltrim(Thisform.TxtMoney.Value)
lc_LaTecla = CHR(nKeyCode)  

IF INLIST(LASTKEY(), 7)
 DO CASE
    CASE lc_Divisa = "SOLES"
         Thisform.TxtMoney.Value = "DOLARES"
    CASE lc_Divisa = "DOLARES"
         Thisform.TxtMoney.Value = "SOLES"
 ENDCASE
 RETURN
ENDIF

IF !lc_LaTecla $ "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ abcdefghijklmnñopqrstuvwxyz "
   Nodefault
ENDIF

RETURN

Agradezco sus comentarios y sugerencias.
Saludos,

Integral

Zarlu

unread,
Mar 10, 2026, 12:18:47 PMMar 10
to Comunidad de Visual Foxpro en Español
Buenos días Integral!

Te adjunto una sugerencia.
Vas a tener que validar otros valores de teclas para poder salir del text.

Suerte
zarlu
Chetumal, Quintana Roo, México
form1.2SCT
form1.2scx

Alberius RosenCruz

unread,
Mar 10, 2026, 6:17:12 PMMar 10
to Comunidad de Visual Foxpro en Español
POR QUE NO USAS INTERACTIVE CHANGE?

integral

unread,
Mar 11, 2026, 1:16:03 AMMar 11
to Comunidad de Visual Foxpro en Español
Que tal Colega ZARLU

Muy Buenas Noches

Aqui te muestro el codigo con algunas variantes, Muestra con la Barra Espaciadora SOLES mas no DOLARES y deja un espacio a la izquierda.

Local lcTecla, lc_Divisa                       

lc_Divisa = Alltrim(Thisform.TxtMoney.Value)       
lcTecla = Chr(nKeyCode)
 
IF INLIST(LASTKEY(),13,127,7,19,4)
     return
endif

IF nKeyCode = 32  
 DO CASE
    CASE This.Tag = "SOLES"          
         Thisform.TxtMoney.Value = "DOLARES"
         Thisform.Refresh()

    OTHERWISE
         This.Tag = "DOLARES"             <-- No Funciona
         Thisform.TxtMoney.Value = "SOLES"
         Thisform.Refresh()

 ENDCASE
ENDIF

RETURN

Utilizando tu código muestra los 2 textos, pero deja un espacio a la izquierda...  Ver imagen.

RESULTADO_ADICIONAL.png

Agradezco tus comentarios y sugerencias.

Saludos,

Integral

Víctor Hugo Espínola Domínguez

unread,
Mar 11, 2026, 2:21:19 PMMar 11
to publice...@googlegroups.com
Hazlo como hacías en FPD26

Format         M
InputMask    Soles,Dólares

Saludos,
Víctor.
Lambaré - Paraguay.



--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/f8ae6d72-04dc-4b4e-b43b-68780541c27dn%40googlegroups.com.
integral.xSCT
integral.xscx

Daniel Sánchez

unread,
Mar 11, 2026, 10:02:56 PMMar 11
to publice...@googlegroups.com
Definitivamente si funciona presionando la barra espaciadora cambia entre uno y otro o presionando la primera letra.

Excelente Victor Hugo



--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software SAC
Móvil y WhatsApp +051-949398047 / Móvil 948615385
Trujillo - Perú

P  Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.

integral

unread,
Mar 12, 2026, 1:16:11 AMMar 12
to Comunidad de Visual Foxpro en Español
11 mar 2026, 0:16:03 (hace 24 horas) 
a Comunidad de Visual Foxpro en Español
Que tal Amigos del Foro

Muy Buenas Noches

Aquí les muestro el código con algunas variantes, Muestra con la Barra Espaciadora DOLARES  mas no SOLES

Local lcTecla                                          
       
lcTecla = Chr(nKeyCode)
if INLIST(LASTKEY(),13,127,7,19,4)

   return
endif

IF nKeyCode = 32  
 NODEFAULT
 DO CASE
    CASE This.Tag = "SOLES"        
         Thisform.TxtMoney.Value = "DOLARES"
         Thisform.Refresh()

    OTHERWISE
         THISFORM.TXTMONEY.VALUE = "DOLARES"
         Thisform.Refresh()

 ENDCASE

endif
     
RETURN

Buscando encontre el siguiente codigo 

LOCAL oForm
oForm = CREATEOBJECT("myform")
oForm.SHOW(1)

DEFINE CLASS MyForm AS FORM
DOCREATE = .T.
AUTOCENTER = .T.
CAPTION = "Imita la cláusula de formato M de Fox2.x"
WIDTH = 310
HEIGHT = 63
cTxtBoxValue = SPACE(2)

ADD OBJECT txtMformat AS TEXTBOX WITH ;
TOP = 5, ;
LEFT = 5, ;
HEIGHT = 24, ;
WIDTH = 200, ;
TAG = "Este,Ejemplo,Imita,La,M,Formato,Cláusula,Usado,En,Fox2.x,@Obtener regiones de edición", ;
CONTROLSOURCE = "thisform.cTxtBoxValue", ;
nListCount = 0, ;
nCurListItem = 0

ADD OBJECT txtTwo AS TEXTBOX WITH ;
TOP = THIS.txtMformat.TOP + THIS.txtmFormat.HEIGHT + 5, ;
LEFT = 5, ;
HEIGHT = 24, ;
WIDTH = 200

PROCEDURE txtMformat.INIT
THIS.nListCount = OCCURS(&quot,&quot,THIS.TAG)+IIF(OCCURS(&quot,&quot,THIS.TAG)>0,1,0)
IF EMPTY(THIS.VALUE)
   THIS.VALUE = LEFT(THIS.TAG,AT(&quot;,&quot;,THIS.TAG)-1)
   THIS.nCurListItem = 1
ENDIF
ENDPROC

PROCEDURE txtMformat.KEYPRESS
LPARAM nKeyCode, nShiftAltCtrl
DO CASE
   CASE nKeyCode == 32 && space bar
        THIS.nCurListItem = THIS.nCurListItem + 1
     IF THIS.nCurListItem > THIS.nListCount
        THIS.nCurListItem = 1
     ENDIF

LOCAL cSelValue, nNxtCharPos
nNxtCharPos = IIF(THIS.nCurListItem>1,AT(&quot;,&quot;,THIS.TAG,THIS.nCurListItem-1)+1,1)
cSelValue = &quot;&quot;

DO WHILE SUBSTR(THIS.TAG,nNxtCharPos,1) <> &quot;,&quot; .AND. nNxtCharPos<LEN(THIS.TAG)+1
   cSelValue = cSelValue + SUBSTR(THIS.TAG,nNxtCharPos,1)
   nNxtCharPos = nNxtCharPos + 1
ENDDO

THIS.VALUE = cSelValue
THIS.SELSTART = 0
NODEFAULT      && Insure the space isn't pre-pended to the textbox

CASE INLIST(nKeyCode,5,13,19,24) && Allow UpArrow, Enter, LeftArrow, or DownArrow through
     DODEFAULT(nKeyCode, nShiftAltCtrl)
     OTHERWISE
     NODEFAULT
ENDCASE

ENDDEFINE

Aqui el link del ejemplo que falta depurar..


Agradezco vuestra ayuda.

Atte.,

Integral

Vinicio Altamirano

unread,
Mar 12, 2026, 7:45:37 AMMar 12
to publice...@googlegroups.com
Te sugiero una solución diferente al lado del control textbox pon un botón y haz el textbox solo de lectura 
Cuando des click en el botón haces que cambie el valor del textbox. Si es que está en pesos que te ponga en dólares o si está en dólares que te ponga en pesos 

Es una solución bien sencilla

Zarlu

unread,
Mar 12, 2026, 9:20:07 AMMar 12
to Comunidad de Visual Foxpro en Español
Buenos días Integral!

De tu penúltimo mensaje adecuar el IF:
IF nKeyCode = 32  
NoDefault

 DO CASE
    CASE This.Tag = "SOLES"          
         This.Value = "DOLARES"
    OTHERWISE
         This.Value = "SOLES"
 ENDCASE
 This.Tag=This.Value
ENDIF

Prácticamente sólo te falta almacenar el nuevo valor en el TAG para  la validación

Suerte
zarlu
Chetumal, Quintana Roo, México



integral

unread,
Mar 13, 2026, 1:15:40 AMMar 13
to Comunidad de Visual Foxpro en Español

Buenas Noches Colega Zarlu

Según lo sugerido hice el cambio en mi código y solo me permite presionar una sola vez la Barra Espaciadora
para seleccionar el tipo de moneda...Y ademas presionando la S o D.

Local lcTecla, lc_Divisa                                                
lc_Divisa = Alltrim(Thisform.TxtMoney.Value)      
lcTecla = Chr(nKeyCode)
 
IF INLIST(LASTKEY(),13,127,7,19,4)
   RETURN
ENDIF


IF nKeyCode = 32  
 DO CASE
    CASE This.Tag = "SOLES"          
         Thisform.TxtMoney.Value = "DOLARES"
         Thisform.Refresh()

    OTHERWISE
         This.Tag = "DOLARES"          
         Thisform.TxtMoney.Value = "SOLES"
         Thisform.Refresh()

 ENDCASE

 Thisform.Tag = This.Value

ENDIF

RETURN


MUESTRA_BARRA.png

Que  puede estar faltando para que funcione según lo esperado.

Atte.,

Integral

Zarlu

unread,
Mar 13, 2026, 9:18:04 AMMar 13
to Comunidad de Visual Foxpro en Español
Buenos días Integral!

ThisForm.Tag=This.Value debe ser This.Tag=This.Value

Adicionalmente:
No se requiere tantas líneas de Refresh()
En el OtherWise eliminar This.Tag="DOLARES"

En resumen:
Sustituye todo el IF..ENDIF tal cual te lo sugerí en mi mensaje anterior

Suerte
zarlu
Chetumal, Quintana Roo, México

integral

unread,
Mar 14, 2026, 11:59:17 AMMar 14
to Comunidad de Visual Foxpro en Español
Que tal Amigos del Foro
Muy Buenos Días

Aquí les muestro el código completo de la solución a mi consulta. Gracias a todos los colegas por sus comentarios y sugerencias, En especial al colega ZARLU y Víctor.  
Local lc_Tecla, lc_Divisa                                                                  

lc_Divisa = Alltrim(Thisform.TxtMoney.Value)      
lc_Tecla = Chr(nKeyCode)
 
IF INLIST(Lastkey(),13,127,7,19,4)
   RETURN
ENDIF

IF !lc_Tecla $ "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ abcdefghijklmnñopqrstuvwxyz "
   Nodefault
ENDIF

IF nKeyCode = 32
   DO CASE
      CASE This.Tag = "Dolares"            
           Thisform.TxtMoney.Value = "Soles"  
      OTHERWISE
           Thisform.TxtMoney.Value = "Dolares"
   ENDCASE
   This.Tag = This.Value
ENDIF

RETURN

Adjunto el código que encontré que falta depurar algunas líneas y el link del ejemplo ...

Hasta la proxima

Atte,

Integral

MUESTRA_BARRA.png
FORMATO_M_002.txt
Reply all
Reply to author
Forward
0 new messages