FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Problema en Get con FWH13.07
Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Problema en Get con FWH13.07
Posted: Wed Aug 28, 2013 09: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 (fw): Select all Collapse
   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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Problema en Get con FWH13.07
Posted: 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 (fw): Select all Collapse
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
Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Re: Problema en Get con FWH13.07
Posted: 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
Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Re: Problema en Get con FWH13.07
Posted: Wed Aug 28, 2013 07: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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Problema en Get con FWH13.07
Posted: 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
Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Re: Problema en Get con FWH13.07
Posted: Thu Aug 29, 2013 07: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
Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Re: Problema en Get con FWH13.07
Posted: Thu Aug 29, 2013 10:04 AM
Antonio,

Lo he conseguido resolver:
El método queda así:
Code (fw): Select all Collapse
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.  ->  ::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 = ::pos
por:
::nPos = nHi + 1
y dejando los cambios que tu me indicaste, funciona correctamente
Desconozco porque ::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
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Problema en Get con FWH13.07
Posted: 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
Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Re: Problema en Get con FWH13.07
Posted: Fri Aug 30, 2013 09: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 (fw): Select all Collapse
 
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

Continue the discussion