FILTER KEYSTROKE

4D - Documentation   Français   English   German   Español   4D v11 SQL, Comandos por temas   4D v11 SQL, Lista alfabética de comandos   4D v11 SQL, Constantes por temas   Regresar   Anterior   Siguiente

versión 6.0


FILTER KEYSTROKE (carFiltro)

ParámetroTipoDescripción
carFiltroAlfaCarácter de filtrado de tecleo o
Cadena vacía para cancelar el filtrado

Descripción

FILTER KEYSTROKE le permite reemplazar el carácter introducido por el usuario en un campo o en un área editable por el primer carácter de la cadena carFiltro.

Si usted pasa una cadena vacía, el filtrado se cancela y es ignorado.

Generalmente, FILTER KEYSTROKE se llama en un método de formulario o de objeto cuando se gestiona el evento de formulario On Before Keystroke. Para detectar los eventos de tecleo, utilice el comando Form event. Para obtener el carácter tecleado, utilice el comando Keystroke.

IMPORTANTE: El comando FILTER KEYSTROKE le permite cancelar o reemplazar el carácter introducido por el usuario con otro carácter. Por otra parte, si quiere insertar más de un carácter para un keystroke especifico, recuerde que el texto que ve en la pantalla aún NO es el valor de la variable o campo fuente de datos para el área que está siendo editada. El valor del campo o de la variable fuente de datos se asigna después de que se valida la entrada de datos para el área. Por lo tanto depende de usted el colocar los datos introducidos en una variable y luego trabajar con el valor de la variable y reasignar el área de entrada (ver el ejemplo en esta sección).

Utilice el comando FILTER KEYSTROKE para:

efectuar un filtro personalizado de caracteres

crear un filtro de entrada no disponible en estándar, por ejemplo en los filtros de entrada

implementar áreas dinámicas de búsqueda o de tecleo anticipado

Advertencia: si llama al comando Keystroke después de llamar a FILTER KEYSTROKE, se devuelve el carácter que usted pasa a este comando en lugar del carácter introducido realmente.

Ejemplos

1. Utilizando el siguiente código:

      ` Método de objeto del área editable miObjeto 
   Case of 
      : (Form event=On Load )
         miObjeto:=""
      : (Form event=On Before Keystroke )
         If(Position(Keystroke;"0123456789")>0)
            FILTER KEYSTROKE("*")
         End if
   End case

Todos los dígitos introducidos en el área miObjeto se transforman en asteriscos.

2. Este código define el comportamiento de un área de entrada de contraseña, en la cual los caracteres introducidos son reemplazados (en la pantalla) por caracteres aleatorios:

      ` Método de objeto del área editable vsContraseña 
   Case of 
      : (Form event=On Load )
         vsContraseña :=""
         vsContraseñaReal:=""
      : (Form event=On Before Keystroke )
         Manejo keystroke (->vsContraseña ;->vsContraseñaReal)
         If (Position(Keystroke;Char(Backspace )+Char(Left Arrow Key )+   
               Char(Right Arrow Key )+Char(Up Arrow Key )+Char(Down Arrow Key ))=0)
            FILTER KEYSTROKE(Char(65+(Random%26)))
         End if 
   End case

Una vez validada la entrada de datos, usted recupera la contraseña introducida en realidad por el usuario vsContraseñaReal. Nota: El método Manejo keystroke está listado en el ejemplo del comando Keystroke.

3. En su aplicación, tiene algunas áreas de texto en las cuales puede introducir algunas frases. Su aplicación también incluye una tabla de diccionario de los términos utilizados con más frecuencia en su base. Durante la edición de sus áreas de texto, a usted le gustaría poder recuperar e insertar rápidamente entradas del diccionario basado en los caracteres seleccionados en un área de texto. Hay dos formas de hacer esto:

- Ofrecer algunos botones con teclas asociadas o

- Interceptar caracteres especiales durante la edición del área de texto

Este ejemplo implementa la segunda solución, basado en la tecla Ayuda.

Como se explicó anteriormente, durante la edición del área de texto, el valor introducido será asignado a la fuente de datos para esta área después de validar la entrada de datos. Para poder recuperar e insertar entradas del diccionario en el área de texto mientras se edita esta área, debe crear una segunda área para poner los valores introducidos. Usted pasa como primeros parámetros los punteros hacia el área de entrada y hacia la variable, luego como tercer parámetro la cadena de caracteres "prohibidos". Sin importar cómo se trate el tecleado, el método devuelve el tecleadooriginal. Los caracteres "prohibidos" son aquellos que usted no quiere insertar en el área editable y quiere tratar como caracteres especiales.

      ` Método de proyecto Tecleado sombra 
      ` Tecleado sombra  ( Puntero ; Puntero ; Alfa) -> Alfa
      ` Tecleado sombra  ( -> srcArea ; -> curValor ; Filtro ) -> Antiguo valor tecleado
   C_STRING(1;$0)
   C_POINTER($1;$2)
   C_TEXT($vtNuevoValor)
   C_STRING(255;$3)
      ` Devuelve el carácter original
   $0:=Keystroke
      ` Obtener la selección de texto en el área editable
   GET HIGHLIGHT($1->;$vlInicio;$vlFin)
      `Comenzar a trabajar con el valor actual
   $vtNuevoValor:=$2->      ` Dependiendo de la tecla presionada o del carácter introducido,
      ` Efectuar las acciones apropiadas
   Case of
         ` La tecla Retorno (Suprimir) ha sido presionada    
      : (Character code($0)=Backspace )
            ` Suprimir los caracteres seleccionados o el carácter a la izquierda del cursor  
         $vtNuevoValor:=Borrar texto ($vtNuevoValor;$vlInicio;$vlFin)
            ` Una tecla flecha ha sido presionada
            ` No hacer nada, sino aceptar el carácter tecleado
      : (Character code($0)=Left Arrow Key )
      : (Character code($0)=Right Arrow Key )
      : (Character code($0)=Up Arrow Key )
      : (Character code($0)=Down Arrow Key )

         ` Un carácter válido ha sido introducido
      : (Position($0;$3)=0)
         $vtNuevoValor:=Insertar texto ($vtNuevoValor;$vlInicio;$vlFin;$0)
   Else 
         ` El carácter no es aceptado
      FILTER KEYSTROKE("")
   End case 
      ` Devolver el valor para la próxima gestión de keystroke 
   $2->:=$vtNuevoValor

Este método utiliza los siguientes dos submétodos:

      ` Método de proyecto Borrar texto 
      ` Suprimir texto ( Alfa; Long ; Long ) -> Alfa
      ` Suprimir texto ( -> Texto ; SelInicio ; SelFin ) -> Nuevo texto
   C_TEXT($0;$1)
   C_LONGINT($2;$3)
   $0:=Substring($1;1;$2-1-Num($2=$3))+Substring($1;$3)
      ` Método de proyecto Insertar texto
      ` Insertar texto ( Alfa ; Long ; Long ; Alfa) -> Alfa
      ` Insertar texto ( -> srcText ; SelInicio ; SelFin ; Texto a insertar ) -> Nuevo texto
   C_TEXT($0;$1;$4)
   C_LONGINT($2;$3)
   $0:=$1
   If ($2#$3)
      $0:=Substring($0;1;$2-1)+$4+Substring($0;$3)
   Else 
      Case of 
         : ($2<=1)
            $0:=$4+$0
         : ($2>Length($0))
            $0:=$0+$4
      Else 
         $0:=Substring($0;1;$2-1)+$4+Substring($0;$2)
      End case 
   End if 

Una vez haya añadido estos métodos de proyecto a su base, puede utilizarlos de esta manera:

      ` Método de objeto del área editable vsDescripcion 
   Case of 
      : (Form event=On Load )
         vsDescripcion :=""
         vsShadowDescripcion :=""
            ` Establecer la lista de caracteres "prohibidos" a tratar como teclas especiales
            ` ( acá, en este ejemplo, sólo la tecla Help es filtrada)
         vsSpecialKeys:=Char(HelpKey)
      : (Form event=On Before Keystroke )
         $vsKey:=Tecleado sombra  (->vsDescripcion ;->vsShadowDescripcion ;vsSpecialKeys)
         Case of 
            : (Character code($vsKey)=Help Key )
                       ` Hacer algo cuando la tecla Ayuda sea presionada
                  ` Acá, en este ejemplo, una entrada de diccionario debe ser buscada e insertada
                CONSULTAR DICCIONARIO (->vsDescripcion ;->vsShadowDescripcion )
         End case 
   End case 

El método de proyecto LOOKUP DICTIONARY es listado a continuación. Su propósito es utilizar la variable shadow para reasignar el área editable a modificar:

      ` Método de proyecto CONSULTAR DICCIONARIO
      ` CONSULTAR DICCIONARIO ( Puntero ; Puntero )
      ` CONSULTAR DICCIONARIO ( -> Area editable ; ->ShadowVariable )

   C_POINTER($1;$2)
   C_LONGINT($vlInicio;$vlFin)

      ` Obtener la selección de texto en el área editable
   GET HIGHLIGHT($1->;$vlInicio;$vlFin)
      ` Obtener el texto seleccionado o la palabra situada a la izquierda del cursor
   $vtHighlightedText:=ObtenerTextoSeleccionado ($2->;$vlInicio;$vlFin)
      `¿Hay algo que buscar?
   If ($vtHighlightedText#"")
         ` Si la selección de texto era el cursor  
         ` la selección comienza con la palabra situada después del cursor
      If ($vlInicio=$vlFin)
         $vlInicio:=$vlInicio-Length($vtHighlightedText)
      End if 
         ` Buscar la primera entrada disponible  del diccionario  
      QUERY([Diccionario];[Diccionario]Entry=$vtHighlightedText+"@")
         ` ¿Hay alguna?
      If (Records in selection([Diccionario])>0)
            ` Si hay alguna entrada disponible, insertarla en el texto shadow 
         $2->:=Insert text ($2->;$vlInicio;$vlFin;[Diccionario]Entry)
            ` Copiar el texto shadow en área editable 
         $1->:=$2->
            ` Fijar la selección justo después de insertar la entrada del diccionario
         $vlFin:=$vlInicio+Length([Diccionario]Entry)
         HIGHLIGHT TEXT(vsComments;$vlFin;$vlFin)
      Else 
            ` No hay una entrada correspondiente en el diccionario    
         BEEP
      End if 
   Else 
         ` No hay un texto seleccionado  
      BEEP
   End if 

El método ObtenerTextoSeleccionado es el siguiente:

      ` Método de objeto ObtenerTextoSeleccionado
      ` ObtenerTextoSeleccionado( Alfa ; Long ; Long ) -> Alfa
      ` ObtenerTextoSeleccionado ( Text ; SelInicio ; SelEnd ) -> texto seleccionado
   C_TEXT($0;$1)
   C_LONGINT($2;$3)
   If ($2<$3)
      $0:=Substring($1;$2;$3-$2)
   Else 
      $0:=""
      $2:=$2-1
      Repeat 
         If ($2>0)
            If (Position($1[[$2]];"  ,.!?:;()-_–—")=0)
               $0:=$1[[$2]]+$0
               $2:=$2-1
            Else 
               $2:=0
            End if 
         End if 
      Until ($2=0)
   End if 

Ver también

Form event, Get edited text, Keystroke.


4D - Documentation   Français   English   German   Español   4D v11 SQL, Comandos por temas   4D v11 SQL, Lista alfabética de comandos   4D v11 SQL, Constantes por temas   Regresar   Anterior   Siguiente