Problema en Get con FWH13.07

Problema en Get con FWH13.07

Postby fgondi » Wed Aug 28, 2013 9:14 am

Tengo un get con siguiente picture: "@R! XX-XXX-XX-X"
Con la versión 13.07 tengo un problema al intentar borrar la última letra.

Si para borrar la última letra me posiciono con el ratón y luego pulso la tecla "Retroceso" borra la penúltima letra, dejando la última letra.

Si para borrar la última letra me posiciono pulsando la tecla "Fin" y luego pulso la tecla "Retroceso" borra la última letra (Osea, opera de forma correcta)

Code: Select all  Expand view
  local oDlg, cCodigo := SPACE(8)

   DEFINE DIALOG oDlg FROM 1, 1 TO 100, 200 ;
          PIXEL OF oWnd                            && Defined by Pixels


   @  1, 2 GET cCodigo OF oDlg PICTURE  "@R! XX-XXX-XX-X"

   ACTIVATE DIALOG oDlg CENTERED
 
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España

Re: Problema en Get con FWH13.07

Postby Antonio Linares » Wed Aug 28, 2013 10:41 am

Fernando,

Con este cambio se soluciona, ahora hay que probarlo y ver que no ocasione ningún efecto colateral:

Code: Select all  Expand view
METHOD LButtonUp( nRow, nCol, nFlags ) CLASS TGet

   local nLo, nHi, cText

   if ::lDrag
      ::Super:LButtonUp( nRow, nCol, nFlags )
      SysRefresh()
      ::Refresh()
      return 0
   else
      cText = ::GetText()
      if Left( cText, 1 ) == "("
         ::nPos = 2
         ::SetPos( ::nPos )
      elseif Empty( cText ) .or. RTrim( cText ) == "  /  /" .or. ;
         AllTrim( cText ) == "0" .or. ;
         RTrim( cText ) == "   -  -"
         ::nPos = 1
         ::SetPos( ::nPos )
      else
         ::GetSelPos( @nLo, @nHi )
         ::oGet:pos = nHi + 1
         ::nPos = ::oGet:pos
      endif
      if ::oBtn != nil
         ::oBtn:Refresh()
      endif
   endif
   // Cambios aqui
   if ::oGet:buffer != nil .and. ::nPos >= Len( ::oGet:buffer )
      ::nPos = Len( ::oGet:buffer ) + 1
      ::oGet:pos = ::nPos
   endif
   // Cambios aqui

return nil
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42099
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Problema en Get con FWH13.07

Postby fgondi » Wed Aug 28, 2013 12:19 pm

Antonio,

Muchas gracias, lo pruebo y te cuento.
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España

Re: Problema en Get con FWH13.07

Postby fgondi » Wed Aug 28, 2013 7:50 pm

Antonio,

Ahora, si se pulsa al final del campo funciona bien,

Pero si se pulsa entre el penúltimo y el último caracter, al borrar borra el último y no el penúltimo que es lo que tendría que hacer
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España

Re: Problema en Get con FWH13.07

Postby Antonio Linares » Wed Aug 28, 2013 10:11 pm

Fernando,

Prueba asi:

if ::oGet:buffer != nil .and. ::nPos > Len( ::oGet:buffer ) // > en vez de >=
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42099
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Problema en Get con FWH13.07

Postby fgondi » Thu Aug 29, 2013 7:51 am

Antonio,

Si se cambia >= por > vuelve a tener el problema inicial. No borra el último caracter.
Pero, si borra el penúltimo caracter al posicionarse en él-
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España

Re: Problema en Get con FWH13.07

Postby fgondi » Thu Aug 29, 2013 10:04 am

Antonio,

Lo he conseguido resolver:
El método queda así:
Code: Select all  Expand view
METHOD LButtonUp( nRow, nCol, nFlags ) CLASS TGGet

   local nLo, nHi, cText

   if ::lDrag
      ::Super:LButtonUp( nRow, nCol, nFlags )
      SysRefresh()
      ::Refresh()
      return 0
   else
      cText = ::GetText()
      if Left( cText, 1 ) == "("
         ::nPos = 2
         ::SetPos( ::nPos )
      elseif Empty( cText ) .or. RTrim( cText ) == "  /  /" .or. ;
         AllTrim( cText ) == "0" .or. ;
         RTrim( cText ) == "   -  -"
         ::nPos = 1
         ::SetPos( ::nPos )
      else
         ::GetSelPos( @nLo, @nHi )
         ::oGet:pos = nHi + 1
         ::nPos = nHi + 1  //Cambios de fgondi.  ->  ::oGet:pos
      endif
      if ::oBtn != nil
         ::oBtn:Refresh()
      endif
   endif
   // Cambios aqui
   if ::oGet:buffer != nil .and. ::nPos > Len( ::oGet:buffer )
      ::nPos = Len( ::oGet:buffer ) + 1
      ::oGet:pos = ::nPos
   endif
   // Cambios aqui

return nil
 


Sustituyendo:
::nPos = ::oGet:pos
por:
::nPos = nHi + 1
y dejando los cambios que tu me indicaste, funciona correctamente
Desconozco porque ::oGet:pos todavía no se ha actualizado el valor y en la línea inmediatamente anterior se le asigna el valor "nHi + 1"
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España

Re: Problema en Get con FWH13.07

Postby Antonio Linares » Thu Aug 29, 2013 11:34 am

Fernando,

Muy bien, muchas gracias :-)

Posiblemente se deba a que la posición del GET interno no puede ser superior a su longitud, y se autocorrige y asi perdemos ese valor que necesitamos :-)

Incluido para el próximo build de FWH
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42099
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Problema en Get con FWH13.07

Postby fgondi » Fri Aug 30, 2013 9:33 am

Antonio,

Estos cambios provocan otro problema.
Antes si se pulsaba con el ratón después del último caracter ( Ejemplo: -> "hola|" ) y luego se pulsaba una letra.
Esta reemplazaba el último caracter (Ejemplo pulsar "r" -> "holr|")

Ahora no hace nada porque el puntero esta en la posición siguiente al último

Lo he solucionado en el método KeyChar()
Compruebo si el puntero esta posicionado en el siguiente al último y lo posiciono en el último
Code: Select all  Expand view

METHOD KeyChar( nKey, nFlags ) CLASS TGet
...
     case nKey >= 32 .and. nKey < 256
           if ::oGet:buffer == nil
              return 0
           endif

           // Cambios fgondi
           if ::nPos = Len( ::oGet:buffer )+1
             ::nPos := Len( ::oGet:buffer )
             ::oGet:Pos := ::nPos
           endif
           // Cambios fgondi

           if ::nPos > Len( ::oGet:buffer )
              return 0
           endif
...
 


Aunque esto provoca si siempre se sobreescriba la última letra. En un campo de longitud 4, te permite teclear 4 caracteres y al pulsar el quinto (antes no hacia nada que es lo correcto) ahora sobreescribe la última letra.
Un saludo
Fernando González Diez
ALSIS Sistemas Informáticos
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot], SantaCroya and 38 guests