FILTER KEYSTROKE
FILTER KEYSTROKE ( carFiltro )
Parâmetro | Tipo | Descrição | |
---|---|---|---|
carFiltro | Text | → | Caracter de filtrado de tecle ou Cadeia vazia para cancelar o filtrado |
Esse comando não é seguro para thread e não pode ser usado em código adequado.
Descrição
FILTER KEYSTROKE permite substituir ou caractere introduzido pelo usuário em um campo ou em uma área editável pelo primeiro caractere da string carFiltro.
Se passar uma string vazia, a tecla é cancelada e ignorada.
Geralmente, FILTER KEYSTROKE é chamada em um método de formulário ou de objeto quando é gerenciado o evento de formulário On Before Keystroke. Para detectar os eventos de teclagem, utilize o comando Form event. Para obter o caractere teclado, utilize o comando Keystroke.
IMPORTANTE: o comando FILTER KEYSTROKE lhe permite cancelar ou substituir o caractere introduzido pelo usuário com outro caractere. Por outra parte, se deseja inserir mais de um caractere para um keystroke especifico, lembre que o texto que vê na tela ainda NAO é o valor da variável ou campo fonte de dados para a área que está sendo editada. O valor do campo ou da variável fonte de dados é atribuída depois de que se confirma a entrada de dados para a área. Portanto depende de você colocar os dados introduzidos em uma variável e depois trabalhar com o valor da variável e reatribuir a área de entrada (ver o exemplo nesta seção).
Utilize o comando FILTER KEYSTROKE para:
- efetuar um filtro personalizado de caracteres
- criar um filtro de entrada não disponível em padrão, por exemplo nos filtros de entrada
- implementar áreas dinâmicas de pesquisa ou áreas de autocompletar
Advertência: se chamar ao comando Keystroke depois de chamar a FILTER KEYSTROKE, é devolvido o caractere que você passa a este comando em lugar do caractere introduzido realmente.
Exemplo 1
Utilizando o seguinte código:
// Método de objeto da área editável meuObjeto
Case of
:(FORM Event=On Load)
meuObjeto:=""
:(FORM Event=On Before Keystroke)
If(Position(Keystroke;"0123456789")>0)
FILTER KEYSTROKE("*")
End if
End case
Todos os dígitos introduzidos na área meuObjeto se transformam em asteriscos.
Exemplo 2
Este código define o comportamento de uma área de entrada de senha, na qual os caracteres introduzidos são substituídos (na tela) por caracteres aleatórios:
// Método de objeto da área editável vsSenha
Case of
:(FORM Event=On Load)
vsSenha:=""
vsSenhaReal:=""
:(FORM Event=On Before Keystroke)
Manejo keystroke(->vsSenha;->vsSenhaReal)
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
Logo que tiver confirmado a entrada de dados, você recupera a senha introduzida em realidade pelo usuário vsSenhaReal. Nota: O método Manejo Handle keystroke está listado no exemplo do comando Keystroke.
Exemplo 3
Em sua aplicação, tem algumas áreas de texto nas quais pode introduzir algumas frases. Sua aplicação também inclui uma tabela de dicionário dos termos utilizados com mais frequência em seu banco. Durante a edição de suas áreas de texto, é útil poder recuperar e inserir rapidamente entradas do dicionário baseado nos caracteres selecionados na área de texto. Há duas formas de fazer isto:
- Oferecer alguns botões com teclas associadas ou
- Interceptar caracteres especiais durante a edição da área de texto
Este exemplo implementa a segunda solução, baseado na tecla Ajuda.
Como se explicou anteriormente, durante a edição da área de texto, o valor introduzido será atribuído à fonte de dados para esta área depois que a entrada de dados seja confirmada. Para poder recuperar e inserir entradas do dicionário na área de texto, enquanto esta área é editada, deve criar uma segunda área para colocar os valores introduzidos. Se passam como primeiros parâmetros os ponteiros até a área de entrada e até a variável, depois como terceiro parâmetro a string de caracteres “proibidos”. Sem importar como se trate a teclagem, o método retorna a teclagem original. Os caracteres “proibidos” são aqueles que você não deseja inserir na área editável e deseja tratar como caracteres especiais.
// Método de projeto Teclado sombra
// Teclado sombra ( Ponteiro ; Ponteiro ; Alfa) -> Alfa
// Teclado sombra ( -> srcArea ; -> curValor ; Filtro ) -> Antigo valor teclado
C_STRING(1;$0)
var $1;$2 : Pointer
var $vtNovoValor : Text
C_STRING(255;$3)
// Retorna o caractere original
$0:=Keystroke
// Obter a seleção de texto na área editável
GET HIGHLIGHT($1->;$vlInicio;$vlFim)
//Começar a trabalhar com o valor atual
$vtNuevoValor:=$2->
// Dependendo da tecla pressionada ou do caractere introduzida,
// Efetuar as ações apropriadas
Case of
// a tecla Retorno (eliminar) foi pressionada
:(Character code($0)=Backspace)
// Eliminar os caracteres selecionados ou o caractere a esquerda do cursor
$vtNovoValor:=Eliminar texto($vtNovoValor;$vlInicio;$vlFim)
// Uma tecla flecha foi pressionada
// Não fazer nada, mas aceitar o caractere teclado
:(Character code($0)=Left arrow key)
:(Character code($0)=Right arrow key)
:(Character code($0)=Up arrow key)
:(Character code($0)=Down arrow key)
// Um caractere válido foi introduzido
:(Position($0;$3)=0)
$vtNovoValor:=Inserir texto($vtNovoValor;$vlInicio;$vlFim;$0)
Else
// O caractere não foi aceito
FILTER KEYSTROKE("")
End case
// Devolver o valor para a próxima gestão de keystroke
$2->:=$vtNovoValor
Este método utiliza os seguintes dois sub-métodos:
// Método de projeto Apagar texto
// Apagar texto ( Alfa; Long ; Long ) -> Alfa
// Apagar texto ( -> Texto ; SelInicio ; SelFim ) -> Novo texto
var $0;$1 : Text
var $2;$3 : Integer
$0:=Substring($1;1;$2-1-Num($2=$3))+Substring($1;$3)
// Método de projeto Inserir texto
// Inserir texto ( Alfa ; Long ; Long ; Alfa) -> Alfa
// Inserir texto ( -> srcText ; SelInicio ; SelFin ; Texto a inserir ) -> Novo 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
Quando tiver adicionado estes métodos de projeto a seu banco, podem ser utilizados desta maneira:
// Método de objeto da área editável vsDescrição
Case of
:(FORM Event=On Load)
vsDescrição:=""
vsShadowDescrição:=""
// Estabelecer a lista de caracteres “proibidos” a tratar como teclas especiais
// ( aqui, neste exemplo, só a tecla Help é filtrada)
vsSpecialKeys:=Char(HelpKey)
:(FORM Event=On Before Keystroke)
$vsKey:=Teclado sombra(->vsDescrição;->vsShadowDescripcion;vsSpecialKeys)
Case of
:(Character code($vsKey)=Help key)
// Fazer algo quando a tecla Ajuda seja pressionada
// Aqui, neste exemplo, uma entrada de dicionário deve ser buscada e inserida
CONSULTAR DICIONARIO(->vsDescripcion;->vsShadowDescripcion)
End case
End case
O método de projeto LOOKUP DICTIONARY é listado a seguir. Seu propósito é utilizar a variável shadow para retribuir a área editável a modificar:
// Método de projeto CONSULTAR DICIONARIO
// CONSULTAR DICIONARIO ( Ponteiro ; Ponteiro )
// CONSULTAR DICIONARIO ( -> Area editavel ; ->ShadowVariable )
var $1;$2 : Pointer
var $vlInicio;$vlFin : Integer
// Obter a seleção de texto na área editável
GET HIGHLIGHT($1->;$vlInicio;$vlFin)
// Obter o texto selecionado ou a palavbra localizada a esquerda do cursor
$vtHighlightedText:=ObterTextoSelecionado($2->;$vlInicio;$vlFin)
//Há algo que buscar?
If($vtHighlightedText#"")
// Se a seleção de texto era o cursor
// a seleção começa com a palavra situada depois do cursor
If($vlInicio=$vlFin)
$vlInicio:=$vlInicio-Length($vtHighlightedText)
End if
// Buscar a primeira entrada disponivel do dicionário
QUERY([Dicionario];[Dicionario]Entry=$vtHighlightedText+"@")
// Há alguma?
If(Records in selection([Dicionario])>0)
// Se houver alguma entrada disponível, inserí-la no texto shadow
$2->:=Insert text($2->;$vlInicio;$vlFin;[Dicionario]Entry)
// Copiar o texto shadow na área editável
$1->:=$2->
// Fixar a seleção logo após inserir a entrada do dicionario
$vlFin:=$vlInicio+Length([Dicionario]Entry)
HIGHLIGHT TEXT(vsComments;$vlFin;$vlFin)
Else
// Não há uma entrada correspondente no dicionário
BEEP
End if
Else
// Não há um texto selecionado
BEEP
End if
O método ObterTextoSelecionado é o seguinte:
// Método de objeto ObterTextoSelecionado
// ObterTextoSelecionado( Alfa ; Long ; Long ) -> Alfa
// ObterTextoSelecionado ( Text ; SelInicio ; SelEnd ) -> texto selecionado
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