Saltar al contenido principal
Versión: Siguiente

FILTER KEYSTROKE

FILTER KEYSTROKE ( carFiltro )

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

Este comando no es hilo seguro, no puede ser utilizado en código apropiativo.

Descripción

FILTER KEYSTROKE 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 pasa una cadena vacía, el filtrado se cancela y se ignora.

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.

Ejemplo 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.

Ejemplo 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.

Ejemplo 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á asignará 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. Se pasan 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)
 var $1;$2 : Pointer
 var $vtNuevoValor : Text
 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
 var $0;$1 : Text
 var $2;$3 : Integer
 $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
 var $0;$1;$4 : Text
 var $2;$3 : Integer
 $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 )
 
 var $1;$2 : Pointer
 var $vlInicio;$vlFin : Integer
 
  // 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
 var $0;$1 : Text
 var $2;$3 : Integer
 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 code
Get edited text
Is editing text
Keystroke