Página 1 de 1

Ayuda cambiar comportamiento TEDIT

Publicado: Mié May 27, 2020 12:13 pm
por buzonjmartial
Buenos días,

Necesitaría cambiar el comportamiento estándar de TEDIT, al hacer click si es numérico que lo seleccione entero.

¿Me pueden decir como hacerlo o qué metodo tendría que sobrecargar?

Re: Ayuda cambiar comportamiento TEDIT

Publicado: Mié May 27, 2020 2:17 pm
por ignacio
Buenos días,

Existe la propiedad lAutoSelect que si le asigna un valor asSELECTALL conseguirá el efecto que desea.

Si desea que se asigne de forma automática en base al tipo de campo deberá sobrecargar la clase T. Por ejemplo:

- Para TEdit utilizando su property 'lNumeric':

Código: Seleccionar todo

CLASS TEdit FROM XEdit
  METHOD SetNumeric( Value )
END CLASS

METHOD SetNumeric( Value ) 
  LOCAL lValue
  lValue := ::Super:SetNumeric( Value )
  IF lValue
    ::lAutoSelect := asSELECTALL
  ENDIF
RETURN lValue 
Para TMaskEdit debería sobrecargar el método SetValue (respetando absolutamente el paso de parámetros a ::super) o el método SetPicture().

Saludos

Re: Ayuda cambiar comportamiento TEDIT

Publicado: Jue May 28, 2020 9:39 am
por buzonjmartial
Buenos días Ignacio,

No es asignar el autoselect automáticamente lo que necesito, es cambiar su comportamiento.

Me explico:

Si la propiedad lAutoSelect es asSELECTALL en un Tedit numérico, al entrar en el control con la tecla ENTER, lo selecciona completo, pero si estando en otro control
hago click no, habría que hacer doble click para que lo seleccione completo.

Lo que quiero es que SOLO con hacer click en el TEDIT, ya lo seleccione todo.

Espero haberme explicado,
Gracias

Re: Ayuda cambiar comportamiento TEDIT

Publicado: Jue May 28, 2020 6:17 pm
por ignacio
Buenas tardes,

Ese comportamiento, entiendo que no sería el correcto, ya que impediría al usuario posicionar el cursor en medio del control (entre varios caracteres) con el ratón. Lo lógico es que si se marca todo el texto como seleccionado el cursor debería estar al principio del todo y en ningún otro sitio, de forma que si se empieza a escribir, se borra la selección actual. Espero haberme explicado.

No obstante le dejo un código que hace lo que comenta, pero que no permite la sobrecarga y tendrá que hacerlo manualmente en cada caso:

Código: Seleccionar todo

CLASS TForm1 FROM TForm
   COMPONENT oEdit1
   .....
   METHOD Edit1Enter( oSender, oPrevCtl )
   METHOD WMXailer() INLINE ::oEdit1:SetSel(0,-1)
ENDCLASS

METHOD Edit1Enter( oSender, oPrevCtl ) CLASS TForm1
   ::PostMsg(WM_XAILER, 0, 0 )
RETURN Nil
Saludos

Nota: El código fuente que se muestra pretende ser simplemente orientativo de como conseguir la funcionalidad que desea.

Re: Ayuda cambiar comportamiento TEDIT

Publicado: Sab May 30, 2020 12:35 pm
por jfgimenez
Joaquín,

mira a ver si te sirve sobrecargando este método:

Código: Seleccionar todo

METHOD WMLButtonDown( nWParam, nLParam ) CLASS TMaskEdit

   IF GetFocus() != ::Handle
      IF ValType( ::Value ) == "N" .OR. ( !Empty( ::cPicture ) .AND. ( "K" $ ::cPicture ) )
         ::SetFocus()
         RETURN 0
      ENDIF
   ENDIF

RETURN ::Super:WMLButtonDown( nWParam, nLParam )
Para que funcione, el contenido del control tiene que ser numérico, o bien el cPicture contener @K

Re: Ayuda cambiar comportamiento TEDIT

Publicado: Dom May 31, 2020 12:25 pm
por buzonjmartial
Muchas gracias Ignacio y Jose,

El código de JF, ha funcionado perfecto. Lo he sobrecargado en TEDIT y hace exactamente lo que necesitaba.

Lo probaré más a fondo a ver si provoca algún efecto colateral, pero a simple vista no.

Gracias,

Re: Ayuda cambiar comportamiento TEDIT

Publicado: Dom May 31, 2020 12:48 pm
por ignacio
Hola,

Me alegro de que la solución de JF le resulte suficiente. Sea consciente de que pierde los eventos de click de ratón cuando se produzcan las condiciones de SetFocus().

Un saludo

Re: Ayuda cambiar comportamiento TEDIT

Publicado: Dom May 31, 2020 7:05 pm
por buzonjmartial
Hola Ignacio,

Comprobaré donde puede repercutir en la aplicación, pero es que necesito ese comportamiento en toda la aplicación y la primera solución no la veía viable por ese motivo.

Quizás en una actualización de Xailer, pudierais poner una propiedad igual que lUseReturn, que fuera lSelectAllEditNumerics, o algo parecido, o por lo menos, en vez de una
global, una propiedad que cambie ese comportamiento en la TEdit a voluntad.

Gracias,