version 6.0
FILTER KEYSTROKE (filteredChar)
| 引数 | 型 | 説明 | |
| filteredChar | 文字列 | フィルタされたキーストローク文字、または | |
| 空文字の場合キーストロークをキャンセル |
説明
FILTER KEYSTROKE は、ユーザがフィールドや入力可エリアに入力した文字を、filteredChar に渡した文字列の最初の文字で置き換えます。
空の文字を渡すと、キーストロークはキャンセルされ無視されます。
通常FILTER KEYSTROKEはOn Before Keystrokeフォームイベントを処理するフォームメソッドあるいはオブジェクトメソッドで呼び出します。キーストロークイベントを検知するには、Form eventコマンドを使用します。実際のキーストロークを得るにはKeystrokeコマンドを使用します。
重要: FILTER KEYSTROKEコマンドはユーザが入力した他の文字をキャンセルしたり置き換えたりすることを可能にします。他方特定のキーストロークに対し複数の文字を入力したい場合、スクリーン上に表示されているテキストは、編集中のデータソースフィールドや変数の値にまだなっていないことに注意してください。データソースフィールドや変数にはデータ入力が確定された後に値が代入されます。変数へのデータ入力を途中で取得し、この値を変更して、入力エリアに代入するのは開発者に任されています (この節の例題を参照)。
FILTER KEYSTROKE は以下の目的で使用できます:
・カスタマイズされた方法で文字をフィルタする
・データ入力フィルタで実現できない方法でデータ入力のフィルタを行う
・ダイナミックなルックアップやタイプアヘッドの実装
警告: FILTER KEYSTROKEの後にKeystrokeコマンドを呼び出すと、実際に入力された文字の代わりにこのコマンドに渡された文字が返されます。
例題
1. 以下のコードを使用すると:
` myObject enterable area object method
Caes of
: (Form event=On Load )
myObject:=""
: (Form event=On Before Keystroke )
If(Position(Keystroke;"0123456789")>0)
FILTER KEYSTROKE("*")
End if
End case
myObject エリアに入力されたすべての数字がアスタリスクに変換されます。
2. 以下のコードはパスワード入力エリアを実装します。入力された文字はスクリーン上にランダムな文字で表示されます:
` vsPassword enterable area object method Caes of : (Form event=On Load ) vsPassword:="" vsActualPassword:="" : (Form event=On Before Keystroke ) Handle keystroke (->vsPassword;->vsActualPassword) 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
データ入力が確定されると、ユーザが実際に入力したデータはvsActualPasswordに格納されています。
Note: Handle keystroke メソッドはKeystrokeの節で紹介されています。
3. アプリケーションに文章を入力できる欄があります。またアプリケーションには辞書テーブルがあります。テキストエリア編集中に、テキストエリア中で選択された文字に基づき、辞書の内容を取り出して挿入したいとします。これを行うには2つの方法があります:
- キーを割り当てたボタンを用意する
- テキストエリアの編集中、特別なキーストロークを検知する
この例題ではHelpキーを使用して、2つ目のソリューションを実装します。
上で説明した通り、テキストエリアの編集中、このエリアのデータソースにはデータ入力を確定した後に入力された値が代入されます。テキストエリア編集中、辞書の内容を取り出してこのエリアに挿入するために、データ入力をシャドウする必要があります。最初の2つの引数として、この入力エリアとシャドウ用の変数へのポインタを、3番目の引数として禁止文字を渡します。キーストロークがどのように取り扱われるにしても、メソッドは元のキーストロークを返します。禁止文字は入力エリアに挿入されず、特別に扱いたい文字のことです。
` Shadow keystroke project method
` Shadow keystroke ( Pointer ; Pointer ; String) -> String
` Shadow keystroke ( -> srcArea ; -> curValue ; Filter ) -> Old keystroke
C_STRING(1;$0)
C_POINTER($1;$2)
C_TEXT($vtNewValue)
C_STRING(255;$3)
` 元のキーストロークを返す
$0:=Keystroke
` 入力エリア中で選択されいる文字範囲を取得する
GET HIGHLIGHT($1->;$vlStart;$vlEnd)
` 現在値を処理する
$vtNewValue:=$2-> ` 押されたキーまたは入力された文字に基づき、
` 適切な処理を行う
Caes of
` (Delete) キーが押された
: (Character code ($0)=Backspace )
` 選択されいる文字あるいはカーソルの左の文字を削除
$vtNewValue:=Delete text ($vtNewValue;$vlStart;$vlEnd)
` 矢印キーが押されたら
` 何も行わずキーストロークを受け入れる
: (Character code($0)=Left Arrow Key )
: (Character code($0)=Right Arrow Key )
: (Character code($0)=Up Arrow Key )
: (Character code($0)=Down Arrow Key )
` 入力を許可する文字が入力された
: (Position($0;$3)=0)
$vtNewValue:=Insert text ($vtNewValue;$vlStart;$vlEnd;$0)
Else
` 入力を許可しない
FILTER KEYSTROKE("")
End case
` 次のキーストローク処理のために値を返す
$2->:=$vtNewValue
このメソッドは以下のサブメソッドを使用します:
` Delete text プロジェクトメソッド ` Delete text ( String; Long ; Long ) -> String ` Delete text ( -> Text ; SelStart ; SelEnd ) -> New text C_TEXT($0;$1) C_LONGINT($2;$3) $0:=Substring($1;1;$2-1-Num($2=$3))+Substring($1;$3)
` Insert text プロジェクトメソッド ` Insert text ( String; Long ; Long ; String) -> String ` Insert text ( -> srcText ; SelStart ; SelEnd ; Text to insert ) -> New text 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 Caes 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
プロジェクトにこれらのメソッドを実装したのち、以下のように使用することができます:
` vsDescription 入力可エリアのプロジェクトメソッド Caes of : (Form event=On Load ) vsDescription:="" vsShadowDescription:="" ` 特別なキーとし使用する禁止文字リストを作成 ` ( この例題ではHelpキーをフィルタする) vsSpecialKeys:=Char(HelpKey) : (Form event=On Before Keystroke ) $vsKey:=Shadow keystroke (->vsDescription;->vsShadowDescription;vsSpecialKeys) Caes of : (Character code($vsKey)=Help Key ) ` Help キーが押された時の処理 ` この例題では辞書を検索し、挿入する LOOKUP DICTIONARY (->vsDescription;->vsShadowDescription) End case End case
LOOKUP DICTIONARY プロジェクトメソッドは以下のようなものです。このメソッドの目的はシャドウの変数を使用して検索を行い、編集中のエリアに再代入を行うことです:
` LOOKUP DICTIONARY プロジェクトメソッド ` LOOKUP DICTIONARY ( Pointer ; Pointer ) ` LOOKUP DICTIONARY ( -> Enterable Area ; ->ShadowVariable ) C_POINTER($1;$2) C_LONGINT($vlStart;$vlEnd) ` 入力エリアの選択範囲を取得 GET HIGHLIGHT($1->;$vlStart;$vlEnd) ` 選択されたキストあるいはカーソルの左側の単語を取得 $vtHighlightedText:=Get highlighted text ($2->;$vlStart;$vlEnd) ` 検索すべきものがあるか If ($vtHighlightedText#"") ` キストセレクションがカーソルなら ` 選択はキストカーソルの前の単語から始まる If ($vlStart=$vlEnd) $vlStart:=$vlStart-Length($vtHighlightedText) End if ` 最初に有効な辞書エントリを検索 QUERY([Dictionary];[Dictionary]Entry=$vtHighlightedText+"@") ` 存在するか If (Records in selection([Dictionary])>0) ` 存在すればシャドウキストに挿入する $2->:=Insert text ($2->;$vlStart;$vlEnd;[Dictionary]Entry) ` シャドウキストを編集中のエリアにコピーする $1->:=$2-> ` 挿入した辞書入力の後に選択をセットする $vlEnd:=$vlStart+Length([Dictionary]Entry) HIGHLIGHT TEXT(vsComments;$vlEnd;$vlEnd) Else ` 辞書に対応するエントリがなかった BEEP End if Else ` ハイライトされたキストがない BEEP End if
Get highlighted text メソッド:
` Get highlighted text プロジェクトメソッド ` Get highlighted text ( String; Long ; Long ) -> String ` Get highlighted text ( Text ; SelStart ; SelEnd ) -> highlighted text 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
参照
Form event, Get edited text, Keystroke.