Improvement in the TGET class, LButtonDown method

Post Reply
MGA
Posts: 1289
Joined: Mon Feb 25, 2008 2:54 pm
Location: Brasil/PR/Maringá
Contact:

Improvement in the TGET class, LButtonDown method

Post by MGA »

Adjust this so that when you click on a GET request (type == "C"), the cursor in the GET request is positioned at the end of the typed text.

Code: Select all | Expand

 DATA   lLeftClickPosEndText INIT .F.


METHOD LButtonDown( nRow, nCol, nFlags, lTouch ) CLASS TGet

   local nLo, nHi, nLenText

   if ::lDrag
      return ::Super:LButtonDown( nRow, nCol, nFlags, lTouch )
   else
      CallWindowProc( ::nOldProc, ::hWnd, WM_LBUTTONDOWN, nFlags,;
                      nMakeLong( nCol, nRow ) )
      ::GetSelPos( @nLo, @nHi )
      ::nPos = nHi + 1
      if ::oGet:Type != "N" .and. ::nPos == 1
         ::oGet:Home()
         ::SetPos( ::oGet:Pos )
      else
         if ::oGet:type == "N" .and. ::lRightToLeft
            ::SetPos( ::nNumLen )
            ::Refresh()
         else
            if ::lLeftClickPosEndText .and. ::oGet:type == "C"
               nLenText := Len( RTrim( ::oGet:VarGet() ) )
               if ::nPos > nLenText
                  //clicou fora do texto ? vai para o final
                  ::oGet:Home()
                  ::oGet:End()
                  ::SetPos( ::oGet:Pos )
               else
                  //clicou no texto ? respeita
                  ::oGet:Pos = ::nPos
               endif
            else
               ::oGet:Pos = ::nPos
            endif
         endif
      endif
      if ::bLClicked != nil
         Eval( ::bLClicked, nRow, nCol, nFlags, Self, lTouch )
      endif
      if ::oBtn != nil
         ::oBtn:Refresh()
      endif
      if ::oBtnLeft != nil
         ::oBtnLeft:Refresh()
      endif
      return 1
   endif

return nil
[email protected]

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
AiBot
Posts: 0
Joined: Wed Aug 26, 2026 9:41 am

Re: Improvement in the TGET class, LButtonDown method

Post by AiBot »

Gracias por compartir esta mejora en el método `LButtonDown` de la clase `TGet`. El cambio es interesante y resuelve un escenario de UX bastante común en campos tipo caracteres (`Type == "C"`).

**Resumen de lo que hace el código:**

1. Introduce el flag `lLeftClickPosEndText` (inicializado a `.F.`) que, cuando se activa, posiciona el cursor al final del texto si el usuario hace clic más allá de la longitud del contenido actual.
2. Si el clic es dentro del rango del texto, respeta la posición `::nPos` donde se hizo clic (comportamiento estándar).
3. Si el clic es fuera del texto (y el flag está activo y el tipo es `"C"`), lleva el cursor al final mediante `::oGet:Home()` y `::oGet:End()`.
4. Mantiene el comportamiento original para campos numéricos (`"N"`) y el resto de tipos.

**Observaciones técnicas:**

- El uso de `RTrim(::oGet:VarGet())` para calcular `nLenText` es correcto para evitar contar espacios trailing como posiciones válidas del cursor.
- La validación `::nPos > nLenText` como condición para ir al final es robusta.
- Es importante que el bloque de `SetPos` y `Refresh` se ejecute correctamente en todos los caminos del `if/else` para no romper la posición del cursor en otros tipos de GET.

**Pregunta pendiente:** ¿Podrías aclarar cuál es la pregunta o el punto específico que quieres tratar con este fragmento? Por ejemplo:
- ¿Buscas feedback/revisión del código?
- ¿Quieres que se integre en una versión compilada?
- ¿Tienes algún problema concreto al aplicarlo?
- ¿Necesitas extender la lógica a otros tipos o comportamientos?

Con más contexto sobre el objetivo final, puedo ayudarte mejor.

---
Respuesta generada por Inteligencia Artificial usando el modelo ling-3.0-flash-fin-free via OpenCode Zen. Puede contener errores; por favor verifiquela antes de aplicar.
AI-generated reply using the ling-3.0-flash-fin-free model via OpenCode Zen. May contain mistakes; please verify before applying.
Post Reply