version 6.0
Keystroke 文字列
| 引数 | 型 | 説明 | ||||
| このコマンドには、引数はありません。 | ||||||
| 戻り値 | 文字列 | ユーザが入力した文字 | ||||
説明
Keystroke はユーザがフィールドや入力可能エリアに入力した文字を返します。
通常、KeystrokeはOn Before Keystrokeフォームイベントを処理するフォーム/オブジェクトメソッドで使用します。キーストロークイベントを検知するには、Form eventコマンドを使用します。
ユーザが実際に入力した文字を置き換えるには、FILTER KEYSTROKEコマンドを使用します。
Note: Keystroke 関数はサブフォームでは動作しません。
重要: 編集中の入力可エリアの現在値や新しく入力された値を使用して逐次処理を行う場合、スクリーン上に表示されているテキストは、編集中のデータソースフィールドや変数の値にまだなっていないことに注意してください。データソースフィールドや変数には、タブで他のエリアに移動したりボタンをクリックするなどして、データ入力が確定された後に値が代入されます。変数へのデータ入力を途中で変数に取得し、この値を処理することは開発者に任されています。特定の処理を行うために現在のテキスト値を所得しなければならない場合、この作業を行う必要があります。なおGet edited textも使用できます。
Keystroke コマンドは以下の目的で使用します:
・カスタマイズされた方法で文字をフィルタする
・データ入力フィルタで実現できないフィルタを実装する
・ダイナミックなルックアップやタイプアヘッドを実装する
例題
1. FILTER KEYSTROKEコマンドの例を参照
2. On Before Keystroke イベントを処理する際、(カーソルがある) 現在のテキストエリアの編集中の値を扱います。このエリアのデータソース (フィールドまたは変数) の将来の値ではありません。Handle keystroke プロジェクトメソッドはテキストエリアのデータ入力を2つ目の変数にコピーします。この変数を使用して、入力中の文字に基づく処理を行うことができます。第1引数にはエリアのデータソースへのポインタを渡します。2番目の引数にはコピー先の変数へのポインタを渡します。メソッドはコピー先変数にテキストエリアの新しい値を返し、そして最後に入力された文字が挿入された値と異なっていればTrueを返します。
` Handle keystroke プロジェクトメソッド
` Handle keystroke ( Pointer ; Pointer ) -> Boolean
` Handle keystroke ( -> srcArea ; -> curValue ) -> Is new value
C_POINTER ($1;$2)
C_TEXT ($vtNewValue)
` 入力エリアで現在選択されいる範囲を取得
GET HIGHLIGHT ($1->;$vlStart;$vlEnd)
` 現在の値を処理する
$vtNewValue:=$2->
` 押されたキーや入力された文字に基づき、
` 適切な動作を行う
Caes of
` Backspace (Delete) キーが押されたら
: (Character code (Keystroke)=Backspace )
` 選択されたキストまたはキストカーソルの左の文字を削除
$vtNewValue:=Substring ($vtNewValue;1;$vlStart-1-Num($vlStart=$vlEnd))
+Substring($vtNewValue;$vlEnd)
` 入力可能な文字が入力されたら
: (Position (Keystroke;"abcdefghjiklmnopqrstuvwxyz -0123456789")>0)
If ($vlStart#$vlEnd)
` 1つ以上の文字が選択されいれば、入力された文字で置き換える
$vtNewValue:=Substring($vtNewValue;1;$vlStart-1)
+Keystroke+Substring($vtNewValue;$vlEnd)
Else
` カーソルが置かれいるだけなら
Caes of
` カーソルがキストの先頭にある
: ($vlStart<=1)
` 文字をキストの先頭に挿入
$vtNewValue:=Keystroke+$vtNewValue
` カーソルがキストの最後にある
: ($vlStart>=Length($vtNewValue))
` 文字をキストに追加
$vtNewValue:=$vtNewValue+Keystroke
Else
` カーソルがキスト中にある。新しい文字を挿入する
$vtNewValue:=Substring($vtNewValue;1;$vlStart-1)+Keystroke
+Substring($vtNewValue;$vlStart)
End case
End if
` 矢印キーが押された
` 何もせず、キーストロークを受け入れる
: (Character code(Keystroke)=Left Arrow Key )
: (Character code(Keystroke)=Right Arrow Key )
: (Character code(Keystroke)=Up Arrow Key )
: (Character code(Keystroke)=Down Arrow Key )
`
Else
` 文字、数字、ダッシュ以外のキーストロークを受け付けない
FILTER KEYSTROKE ("")
End case
` 値が異なっいるか?
$0:=($vtNewValue#$2->)
` 次回のキーストローク処理のために値を返す
$2->:=$vtNewValue
このプロジェクトメソッドがプロジェクトに追加されたら、以下のように使用できます:
` myObject enterable area オブジェクトメソッド Caes of : (Form event=On Load) MyObject:="" MyShadowObject:="" : (Form event=On Before Keystroke) If (Handle keystroke (->MyObject;->MyShadowObject)) ` MyShadowObjectに格納された値に基づき、適切なアクションを行う End if End case
以下のフォームを見てみましょう:
このフォームには以下のオブジェクトが置かれています: vsLookup入力エリア、vsMessage入力不可エリア、asLookupスクロールエリア。vsLookupに文字を入力する間、オブジェクトメソッドが[US Zip Codes]テーブルの検索を実行し、年の最初の文字を入力すると、USの都市が検索されます。
vsLookup オブジェクトメソッドは以下のようになります:
` vsLookup 入力エリアオブジェクトメソッド Caes of : (Form event=On Load ) vsLookup:="" vsResult:="" vsMessage:="検索する都市の最初の文字を入力しください。" CLEAR VARIABLE(asLookup) : (Form event=On Before Keystroke ) If (Handle keystroke (->vsLookup;->vsResult)) If (vsResult#"") QUERY([US Zip Codes];[US Zip Codes]City=vsResult+"@") MESSAGES OFF DISTINCT VALUES([US Zip Codes]City;asLookup) MESSAGES ON $vlResult:=Size of array(asLookup) Caes of : ($vlResult=0) vsMessage:="都市が見つかりませんでした。" : ($vlResult=1) vsMessage:="1つの都市が見つかりました。" Else vsMessage:=String($vlResult)+" cities found." End case Else DELETE FROM ARRAY(asLookup;1;Size of array(asLookup)) vsMessage:="検索する都市の最初の文字を入力しください。" End if End if End case
フォームを実行:
4Dのプロセス間通信を使用することで、レコードを編集するプロセスと通信するフローティングウィンドウに同様の機能を実装することができます。
参照
FILTER KEYSTROKE, Form event, Get edited text.