Contar caracteres de un campo


([N2] overBCN) #1

Hola,
Muy sencillo, pero ne hay manera.
Lo que quiero es poder contabilizar en una variable los caracteres que faltan para completar los 296 que tiene el campo ALFA 128.
Desde una “Conexión de eventos” con señal “Tecla pulsada, Tecla soltada o Value changed”, lanzo un Manejador de evento que hace la correspondiente comprobación y va actualizando visualmente el contador de caracteres que faltan.
Lo único que hace el proceso es actualizar el valor de la variable y lanzar un mensaje justo cuando nos excedemos.
Pues bien, cuando estamos escribiendo, al poner un espacio, siempre nos manda al principio del campo, no pudiendo poner espacio al final. Si que acepta espacios entre letras.
No hay forma de poder hacer una cosa tan sencilla.
Alguna idea?
Gracias


([N4] eic) #2

Hola, Luis.

Una posible alternativa es colocar un cuadro de texto (p.ej., en rojo) a la derecha del control alfabético del campo en cuestión, con condicion de visibilidad: (296-len(#CAMPO)) < 1. Esto funciona sin necesidad de manejadores de evento. No es un mensaje emergente, pero aparece un texto al lado que avisa de la incidencia.

Lo intenté con un evento “Value changed” (sólo ese evento), para mostrar un mensaje, pero no me deja escribir espacios en el campo (!!) si lo tengo activado. Raro (versión 7.18.1).


([N2] overBCN) #3

Muchas gracias Fran


([N3] pacosatu) #4

Hola Luis.

Dices:

... al poner un espacio, siempre nos manda al principio del campo, no pudiendo poner espacio al final. Si que acepta espacios entre letras.

Esto es un comportamiento nativo de Velneo, cuando se produce cualquier evento en el formulario se refrescan todos los controles. Los campos de la tabla “NO pueden tener espacios al final” y por esa razón se quitan en cada resfresco.

Aunque la solución de Fran es perfecta, para otra ocasión, se puede evitar ese comportamiento usando una Variable Local, la cual no se verá afectada por el refresco respeteando los espacios al final.

Por ejemplo, en un formulario de Búsqueda en el que quieres que el usuario vaya tecleando en el campo #NAME palabras o trozos y al mismo tiempo ejecutando las Búsquedas resultantes. En este caso no se puede usar el campo de la tabla debido al efecto indeseado del refresco y habrá que sustituir el campo #NAME por una Variable Local del formulario.

Saludos
Paco Satué


([N2] overBCN) #5

Gracias Paco.
El método que indicas de utilizar variables locales ya lo utilizo y va perfecto.
Creía que la espacios en blanco al final del campo los quitaba al guardar el registro.
Saludos


([N4] victorgt) #6

Humm… interesante.

Hace tiempo intente utilizar un campo cuadro de texto (memo) para editar campos alfa largos en varias lineas, ya que el control de edicion alfabetico normal NO ACEPTA MULTILINEA. En el año 2016, en fin…

Todo va bien, el campo alfa funciona con el cuadro de texto, hasta que empiezas a pensar en la longitud maxima. El cuadro acepta cualquier cosa y si el usuario se pasa de largo al guardar trunca. Bastante razonable.

Y claro, lo siguiente es usar un evento cada vez que cambie el texto para controlar con len() y esas cosas… Logicamente todo esto no funciona por el problema expuesto en este post. Cada vez que se ejecuta el evento al carajo los blancos del final y ademas te pone el cursor al principio. Total que abandone la idea. La unica solucion es controlar el tamaño al guardar y avisar al usuario (un poco cutre, le dejas escribir).

Pero ahora se me ocurre que con una variable local quiza funcione (edicion multilinea de una variable local alfa en un cuadro de texto con control de longitud maxima). ¿Merecera la pena hacer la prueba?

PD: ya podian los de Velneo añadir una propiedad “Longitud maxima” al cuadro de texto. Pero seguramente sea algo complicadisimo y esten muy ocupados con cosas mas importantes.

Saludos.


([N1] wikan) #7

Alguien ha probado esto:
https://velneo.es/info_v7_719_es/velneo_vdevelop/scripts/clases/core/widget/vlineedit/#maxLength

Se supone que establece la longitud máxima del edit.


([N4] victorgt) #8

Copio y pego de la ayuda:
VLineEdit
Hereda de: Widget
Esta clase representa al control de edición de una linea de texto.

Creo que nada de multilinea aqui. Este debe ser el control normal de edicion de texto.

Necesitamos eso pero en el control cuadro de texto.


([N4] victorgt) #9

Perdon, el control en Velneo se llama “caja de texto”, no cuadro de texto.

Saludos.


([N2] overBCN) #10

Hola Wikan, perdona la ignorancia, pero donde deberíamos poner maxLength?


([N1] wikan) #11

En el Post Inicializado del formulario.

theRoot.DataView().control("EDIT").maxLength(296)

Incluso con un poco más de trabajo se podría leer directamente la longitud máxima del campo y hacerlo dinámico.

var tableInfo = theRegisterIn.tableInfo()
var maxLength = tableInfo.fieldBufferLen(tableInfo.findField("CAMPO_ALFA"))

Nota: Está escrito directamente en el post, podría contener errores.


([N2] overBCN) #12

HOLA WIKAN,
He probado lo que dices, y nos funciona.
theRoot.DataView().control("DSC").maxLength(296)
lo he puesto en el Pre-ini y en el Post-ini, y no hace nada
Hay que hacer algo más, o no debe funcionar?
Saludos


([N1] wikan) #13

Cambia DataView por dataView que lo escribi mal, a ver si es por eso


([N2] overBCN) #14

No funciona,
En el Pre-ini “Rompe” vClient y en Post-ini no hace nada (el control es una Caja de texto)
Saludos


([N1] wikan) #15

Las cajas de texto no tienen la propiedad maxLength ya que pueden contener mucho texto (4GB si no recuerdo mal).

Está solución solo sirve para “edit” de una sola línea.

PD: En el Pre-Ini nunca se puede manipular controles ya que todavía no están construidos.


([N2] overBCN) #16

Ok, gracias,.
Nadie quiere escribir 296 caracteres en una sola linea. Un cosa tan sencilla y de solución …


([N4] informatica) #17

Hola, hoy me ha surgido la necesidad de controlar el número máximo de caracteres en un control de edición alfabético, y tras varias pruebas, lo he logrado creando un evento javascript al que llamo en el evento post_ini del formulario con el siguiente contenido:

theRoot.dataView().control(“ED_TBL_10_4”).maxLength = 10;
theRoot.dataView().control(“ED_TBL_40_1”).maxLength = 35;
theRoot.dataView().control(“ED_TBL_60_1”).maxLength = 60;

donde “ED_TBL_10_4”, “ED_TBL_40_1”, “ED_TBL_60_1” son los identicadores de los controles en el formulario.

Un saludo,


([N1] alid-buritica) #18

buern dia
VERP es una aplicacion ya finalizdda?