|
|
[キーダウン]イベントは、キーボード上のキーが押されているときに発生するイベントです。
[システムキーダウン]イベントは、[Alt]キーまたは[F10]キーが押されているときに発生するイベントです。
このイベントはいろいろな目的で使うことが出来ますが、押されたキーを判定することがとても大変です。
INF_Framework では "VK_framework" という仕掛けでこの問題を解決しています。
VK_Framework では任意に[キーダウン]イベントで実行する内容をセットして、また任意にその設定をクリアします。
[キーダウン]イベントの設定を動的に行うということです(静的な運用も簡単にできます)。
※なおサンプル集に含まれるユーティリティ ” INF_VK_key_checker” と”INF_VK_変数確認 ” 、そして ” 1st_Spec_Memo_VK.txt ” もご覧になってください。
VK_Framework では
◆ フォーム起動時に ショートカットキー を登録して、希望のプロシージャ等を実行できるようにします:静的運用
◆ 随時(動的に) 押されたキーを検出して、処理を実行します:動的運用
◇ "Enter"、"Esc"、"→" といった[キートップの文字]を使用します(13、27、39 といった[キーに対応した恣意的な数値]を使用しません)。
◇ ソース値更新の代替えとして利用できます。
◇ VK_Framework側で [キーダウン]イベント と [システムキーダウン]イベント を利用しています。
※ 桐の釣魚大全 → フォームアプリケーション教書 第1部 の [キーダウン]イベントと[システムキーダウン]イベント も参照してください。
ここの解説は2020年に ONnoji さんが書き下ろされた VK仕様メモに、
同じく ONnoji さんが2005年に執筆されていた VK_ライブラリの仕様ノート等からの補足と引用を加え、さらに導入部分を加筆したものです。
◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇
APPENDIX
1.VK_Framework の仕様
1.1 VK_Framework に用意されているプロシージャの一覧
■[キーダウン]イベント/[システムキーダウン]イベントを有効/無効にする
1.2 VK_Framework に用意されている変数の一覧
■イベントに対するスイッチ変数 &VKmKeyDownLive/整数 &VKmSystemKeyDownLive/整数
■コマンド実行に対するスイッチ変数 &VKmOnKey/整数
◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇
APPENDIX
サンプル1:キーの組み合わせの検出(例)、ファンクションキーの検出(例)
サンプル2:&VKmRepeat(リピートの判定)の値を利用する
サンプル4:Enterキー/Escキー を押したとき、自身のフォームを閉じる
備考1:【訂正モードのスラッシュメニューに関して】、【テンキーのキーの名前に関して】
1. 静的運用:フォーム起動時にデフォルトとしてショートカットキーを設定します
VK_Framework をフォーム起動時に実行することでデフォルトの設定とすることができます。
あらかじめ ”cmdStartupClick() ”
を実行するコマンドボタンを登録しておきフォーム起動時の実行コマンドに登録しておくと便利です。
※フォームの開始時実行コマンドの登録方法についての詳細は→
こちら(クリックしてください) をご覧になってください。
1-1. 静的運用(例):スラッシュメニューを表示しないようにします
桐では ”/ ” キーでメニューが表示されます。単に入力等の操作だけを行うオペレーターさんにとってはビックリですね。 | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
なおVK_Framework を使わずにスラッシュメニューをキャンセルするとしたら、例えば次のようになります。 ※VK_Framework は簡単な設定でこれほどの手間を省いてくれます (^^♪ |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
1-2. 静的運用(例):編集禁止にしているフォームをスペースキーで項目訂正モードに移行します
まず 名札メイン で編集モードに移行できないようにしておいてダブルクリックの動作をスムーズにできるようにします。 | ||||||||||
|
||||||||||
そしてフォーム起動時に編集が必要なときに VK_Framework を利用するように設定(スペースキーを押したら項目訂正モードに遷移する)。 | ||||||||||
|
1-3. 静的運用(例):いずれかのキーを押すと、文字列の該当レコードへ移動します
次のサンプルはキーボードでアルファベットが表示された、例えば Fキーを押すと F(全角) → f (半角小文字)→ F(半角大文字)→ F(全角)と順に該当のレコード行に移動します。 ※明細行のフォーカス項目は [文字列]、[明細]のどちらにあっても構いません。 |
|
<サンプルの作成手順> 表:項目2つ、データは アルファベット26文字を 全角大文字、半角大文字、半角小文字 で入力しています。 フォーム:INF_Framework を適用したフォームを作成して下さい。 |
|
■設定している 一般手続きは次の通りです( cmdStartupClick( ) はフォーム起動時に実行するようにセットしています)。 | |
手続き定義開始 cmdStartupClick( ) 変数宣言 自動,文字列{ &icon, &title = "cmdStartupClick( )", &msg } 手続き実行 INFprcTblFieldRestore( ) 手続き実行 VKprcEventKeyDownON( ) 手続き実行 VKprcKeyON( ) 手続き実行 VKprcKeySet( "key", 1, "0", "手続き実行 prcアイテムSeek( &VKmChr )" ) *VKprcEventKeyDownON~VKprcKeySet の記載は順不同です (^_-) 手続き定義終了 手続き定義開始 prcアイテムSeek( 文字列 &character ) 変数宣言 自動,文字列{ &icon, &title = "prcアイテムSeek( )", &msg } 変数宣言 自動,文字列{ &expression, &WQ = #jis( #hex("22") ) } 変数宣言 自動,文字列{ &chrList = "{,},`,~,|" } 変数宣言 自動,整数 { &status } 条件 ( &character = "comma" ) &character = "," &character = #文字置換( &character, &WQ, &WQ + &WQ ) if ( #対応番号( &chrList, &character ) = 0 ) &expression = &WQ + &character + &WQ + "*:E" else &expression = "#文字位置( #半角([文字列]), " + &WQ + &character + &WQ + ") = 1" end 検索 ∨, [文字列]_&expression, 終了状態 = &status if ( &status = -1 ) 検索 [文字列]_&expression, 終了状態 = &status end &msg = &expression &msg = &msg + "\n\n&status = " + #str( &status ) **手続き実行 INFprcMsgPause( &icon, &title, &msg ) 手続き定義終了 |
|
※キーの名前に "key" を指定する詳細は、「VK仕様メモ(転載)」をご覧になってください。 |
2. 動的運用:必要なときに設定します(押されたキーを検出します)
■基本的な設定は次の通りです(必要な時に設定して、処理が終わればすぐに設定を解除します)。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
■イメージ:直前値( F2 )が押されたら、キャレットを末尾へ移動する 処理の流れです。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
2-1. 動的運用(例):ソース値更新の代替えとしてコマンドボタンを利用します
ソース値更新イベントを使わずに[Enter]キーでコマンドボタンを実行します。 | |
◆[ソース値更新]イベントの代替として最も簡単な方法は、入力前イベントハンドラで次のように設定します(Enterキーを設定します)。 (例) 手続き実行 VKprcKeySet( "Enter", 0, "2,8", "メソッド呼び出し @コマンドボタンオブジェクト名.実行( )" ) ※機能名1に "表示"、機能名2に"手続き実行"、機能パラメータ2に[手続き名]を設定したコマンドボタンを用意します。 |
|
◆設定サンプル 手続き定義開始 txtField_1::入力前(参照 文字列 &編集文字列) 手続き実行 VKprcEventKeyDownON( ) 手続き実行 VKprcEventSystemKeyDownON( ) 手続き実行 VKprcKeySet( "Enter", 0, "2,8", "メソッド呼び出し @ソース値更新代替.実行( )" ) 手続き定義終了 手続き定義開始 txtField_1::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続) 確認 "キー = " + &VKmKeyString * キーの名前を確認しています(下記の格納されるキーの名前を参照してください)。実際に運用する際には不要です。 手続き実行 VKprcEventKeyDownOFF( ) 手続き実行 VKprcKeyOFF( ) 手続き実行 VKprcKeyClear( "Enter", 0 ) 手続き定義終了 *&VKmKeyString には[入力後]イベントが発生するきっかけになったキーの名前が格納されています。 *キーの名前は、"Enter"、"Esc"、"F4"、"Ctrl + →"等です。 *マウスを操作して[入力後]イベントが発生した場合には、別のキーの名前が格納されています。 |
3-1. VK_Framework で設定する 手続き の一覧
|
|||||||||||||||||||||||||||
■利用時に設定が必要な 手続き は次の2つです。あとの 手続き は必要に応じてコピペで利用しましょう。 | |||||||||||||||||||||||||||
手続き実行 VKprcKeySet( キーの名前, 処理中止の値, 適用更新モード, 実行するコマンド ) 手続き実行 VKprcKeyClear( キーの名前, 更新モード ) ※キーの名前は、キーボードのキートップの文字を指定します。 |
|||||||||||||||||||||||||||
■注意 | |||||||||||||||||||||||||||
手続き実行 VKprcEventKeyDownON( ) を実行した後でも、 手続き実行 VKprcKeyON( ) を実行するのを忘れないように。 |
|||||||||||||||||||||||||||
■その他 | |||||||||||||||||||||||||||
Altキー の他 F10キーを検出する場合は、 手続き実行 VKprcEventSystemKeyDownON( ) も必要です。 |
3-2. 動的運用:その都度 有効にして、処理を実行後無効にします
|
|
◇動的運用と静的運用は併用できますが運用方法が異なるだけで、同じ 手続き を使用します。
両方の手続きの登録内容をよく確認して設定してください(特に動的運用のキーを無効にする際、静的運用も解除しないように)。
※VKprcKeyON、VKprcKeyOFF、VKprcKeyClear を適切に使い分けてください。
4. VK仕様メモ(転載) by ONnoji Rev.0 2020.07.27 , Rev.1 2020.09.09 Spec_Memo_VK.txt
この文書はINF_Framework(以降 INF_FW と表記する)の機能:VK に関する仕様メモです。
機能名:VK( ブイキー )は、仮想キーコード( Virtual-Key Codes )の意味です。 機能:VKは、仮想キーコードを識別して、コマンドまたはメソッドを実行するユーティリティです。 仮想キーコードの値は、[キーダウン]イベントと[システムキーダウン]イベントのイベントハンドラの第1引数で求められます。 (例) フォーム::キーダウン(長整数 &仮想キーコード,長整数 &スキャンコード,長整数 &フラグ,参照 長整数 &処理中止) (例)フォーム::システムキーダウン(長整数 &仮想キーコード,長整数 &スキャンコード,長整数 &フラグ,参照 長整数 &処理中止) これらの引数は以下の局所変数に代入されます。 ※&処理中止 を除く &仮想キーコード → &VKmKeyNum / 長整数 &スキャンコード → &VKmScanNum / 長整数 &フラグ → &VKmFlagNum / 長整数 なお、押されたキーに対応するキーの名前は、&VKmKeyString / 文字列 に代入されます。 ダウンロードしたファイルに含まれる INF_VK_key_checker.wfm を用いると変数の値を簡単に確認できます。 |
VK はINF_Framework に組み込まれていて、INF_Framework を導入したフォームであれば、VK が使える状態になります。 ただし、誰もが VK を必要とするわけではないので、所謂スタートアップはあらかじめ用意されていません。 <実行するキーの設定> 実行するキーを設定するには、手続き名:VKprcKeySet を実行します。 (構文)手続き実行 VKprcKeySet( キーの名前, 処理中止の値, 適用更新モード, 実行するコマンド ) 例えば、スラッシュメニューの替わりに、[注釈 / *]コマンドを実行する場合には次のようにします。 (例) 手続き実行 VKprcKeySet( "/", 1, "0", "*" ) /* [スラッシュ]キーでは何もしない 表示モードに適用 */ 手続き実行 VKprcKeySet( "-", 1, "0", "*" ) /* [マイナス]キーでは何もしない 表示モードに適用 */ 手続き実行 VKprcKeySet( "Ctrl + M", 1, "2,4,6,8,33,34,36", "*" ) /* Ctrl + M では何もしない 表示モードを除き適用 */ この例は、[スラッシュ(/)]キーと[マイナス(-)]キーと[Ctrl]+[M]が押されたら、[注釈 / *]コマンドを実行します。 <キーの名前> キーの名前は、手続き名:VKprcKeySet の第1引数に指定します。 キーの名前には、基本的にキートップの文字を指定しますが、いくつかの例外もありますので注意してください。 キーの名前はアルファベット(A...Z)と以下の文字です。※全角・半角・大文字・小文字の区別はありません BackSpace,Tab,Clear,Enter,Shift,Ctrl,Alt,Pause,CapsLock,英数,漢字,Esc,変換,無変換,スペース PageUp,PageDown,End,Home,←,↑,→,↓,PrintScreen,Insert,Delete,Help,NumLock,ScrollLock F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,Windows左,Windows右,Application,漢字番号,カタカナ,ひらがな,半角/全角,ローマ字 0,1,2,3,4,5,6,7,8,9,*,+,-,Separator,:,;,comma,.,/,@,[,\,],^,backslash ※キーの名前がコンマ(,)の場合は "comma" 、バックスラッシュ(\)の場合は "backslash" を指定してください。 ※F10キーは[システムキーダウン]イベントで取得できます。 キーの組み合わせは [Alt] + [Ctrl/Shift] + [キーの名前] の順番にプラス(+)記号で連結して指定します。 <処理中止の値> 処理中止の値は、第2引数にイチ( 1 )またはゼロ( 0 )を指定します。 例えば、次のように第2引数にゼロ( 0 )を指定した場合には、 (例)手続き実行 VKprcKeySet( "/", 0, "0", "*" ) [スラッシュ(/)]キーを押した時に[注釈 / *]コマンドを実行しますが、コマンド実行後に[スラッシュメニュー]が表示されてしまいます。 これは、処理中止の値がゼロ( 0 )なので、桐の[キーカスタマイズ]で[スラッシュ(/)]キーに割り当てられていた機能がキャンセルされずに実行されるからです。 <適用更新モード゙> コマンドの実行を許可するフォームの更新モードを第3引数に指定します。 複数の更新モードを指定する場合には、コンマ(,)区切りの文字列を指定します。※全角・半角の区別はありません。 有効なキーワードは以下の文字列です。 "0,2,4,6,8,33,34,36,表示,訂正,行挿入,行追加,項目訂正,グループ検索,グループ値訂正,グループ追加" "*" を指定すると、すべての更新モードを指定したと見なされます。 <実行するコマンド> コマンドまたはメソッドを第4引数に指定します。 何も実行したくない場合には、[注釈 / *]コマンドを指定します。 ダウンロードしたファイルに含まれるユーティリティ ” INF_VK_変数確認.wfm” を用いると設定内容を簡単に確認できます。 |
<実行許可> 手続き名:VKprcKeySet を実行して[実行するキー]を設定しただけでは VKユーティリティは実行されません。 VKユーティリティを実行するには、次の2つの手続き、またはコマンドを実行してください。どちらを先に実行しても結果は同じです。 手続き実行 VKprcEventKeyDownON( ) または オブジェクト操作 &formObjectName{ キーダウン = 1 } 代入 &VKmKeyDownLive = 1 手続き実行 VKprcKeyON( ) または 代入 &VKmOnKey = 1 これで VKユーティリティの実行が許可されます。 なお、プログラムを読みやすくするために、コマンドを実行するよりも、手続きを実行することをお勧めします。 <実行停止> VKユーティリティを停止するには、次の2つの手続き、またはコマンドを実行してください。どちらを先に実行しても結果は同じです。 手続き実行 VKprcEventKeyDownOFF( ) または オブジェクト操作 &formObjectName{ キーダウン = 0 } 代入 &VKmKeyDownLive = 0 手続き実行 VKprcKeyOFF( ) または 代入 &VKmOnKey = 0 これで VKユーティリティの実行が停止されます。 なお、プログラムを読みやすくするために、コマンドを実行するよりも、手続きを実行することをお勧めします。 なお、VKユーティリティを停止せずに、キーの実行のみを禁止する場合には次のコマンドまたは手続きを実行してください。 手続き実行 VKprcKeyOFF( ) または 代入 &VKmOnKey = 0 |
キーの名前には、基本的にキートップの文字を指定しますが、いくつかの例外もあります。 ここで説明する "key" という名前は、制御キー以外のすべての文字キーを対象にします。 (例1) 手続き実行 VKprcKeySet( "key", 1, "0", "確認 &VKmChr" ) (例2) 手続き実行 VKprcKeySet( "key", 1, "0", "prc任意のプロシージャ( &VKmChr )" ) キーの名前に "key" を指定した場合には、以下のキーに反応してコマンドを実行します。 <普通にキーを押した場合> 次のキーを押すとVK の局所変数:&VKmChr には次の値が代入されます。 [英字] キー ・・・ "A" to "Z" [記号] キー ・・・ "- ^ \ @ [ ; : ] . /" [コンマ] キー ・・・ "comma" [バックスラッシュ]キー ・・・ "backslash" <シフト+キーを押した場合> 次のキーを押すとVK の局所変数:&VKmChr には次の値が代入されます。 [Shift]+[1]・・・ ! [Shift]+[2]・・・ "" ← ※2重引用符が二つ返ります [Shift]+[3]・・・ # [Shift]+[4]・・・ $ [Shift]+[5]・・・ % [Shift]+[6]・・・ & [Shift]+[7]・・・ ' [Shift]+[8]・・・ ( [Shift]+[9]・・・ ) [Shift]+[-]・・・ = [Shift]+[^]・・・ ~ [Shift]+[\]・・・ | [Shift]+[@]・・・ ` [Shift]+[[]・・・ { [Shift]+[;]・・・ + [Shift]+[:]・・・ * [Shift]+[[]・・・ } [Shift]+[,]・・・ < [Shift]+[.]・・・ > [Shift]+[/]・・・ ? [Shift]+ [バックスラッシュ]・・・ _ <注意> 次のキーを押すと、VK の局所変数:&VKmChr には次の値が代入されます。 ・[コンマ]キー ・・・ "comma" ・[バックスラッシュ]キー ・・・ "backslash" ・[shif]+[2]キー ・・・ "" ← ※2重引用符が二つ返ります |
◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇
APPENDIX
1.VK_Framework の仕様
1.1 VK_Framework に用意されているプロシージャの一覧
■[キーダウン]イベント/[システムキーダウン]イベントを有効/無効にする
[キーダウン]イベント/[システムキーダウン]イベントを有効または無効にします。 |
VK_Framework の局所変数:&VKmOnKey の値を真( 1:イチ )、または偽( 0:ゼロ )に設定します。 |
キーにコマンドを割り当てるには、一般手続き:VKprcKeySet( )を実行します。 この手続きは [キーダウン]/[システムキーダウン]イベントで実行するキーの名前とコマンドを VK_Framework の局所変数に登録します。 同名のキーの名前を指定した場合には、新しい値で上書きされます。 ―構文 手続き実行 VKprcKeySet( キーの名前, 処理中止の値, 適用更新モード, 実行するコマンド ) ―記述例 手続き実行 VKprcKeySet( "→", 1, "*", "手続き実行 prcなんとか( )" ) 手続き実行 VKprcKeySet( "→", 1, "0,2,4,6,8,33,34,36", "手続き実行 prcなんとか( )" ) 手続き実行 VKprcKeySet( "→", 1, "表示,訂正,行挿入,行追加,項目訂正,グループ検索,グループ値訂正,グループ追加", "手続き実行 prcなんとか( )" ) <キーの名前> キーの名前はアルファベット(A...Z)と以下の文字です。※全角・半角・大文字・小文字の区別はありません BackSpace,Tab,Clear,Enter,Shift,Ctrl,Alt,Pause,CapsLock,英数,漢字,Esc,変換,無変換,スペース PageUp,PageDown,End,Home,←,↑,→,↓,PrintScreen,Insert,Delete,Help,NumLock,ScrollLock F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,Windows左,Windows右,Application,漢字番号,カタカナ,ひらがな,半角/全角,ローマ字 0,1,2,3,4,5,6,7,8,9,*,+,-,Separator,:,;,comma,.,/,@,[,\,],^,backslash ※キーの名前がコンマ(,)の場合は "comma" 、バックスラッシュ(\)の場合は "backslash" を指定してください。 ※F10キーは[システムキーダウン]イベントで取得できます。 <キーの組み合わせ> キーの組み合わせは [Alt] + [Ctrl/Shift] + [キーの名前] の順番にプラス(+)記号で連結して指定します。 <文字列型:適用更新モード゙> コンマ(,)区切りの文字列を指定します。※全角・半角の区別はありません。 有効なキーワードは以下の文字列です。 "0,2,4,6,8,33,34,36,表示,訂正,行挿入,行追加,項目訂正,グループ検索,グループ値訂正,グループ追加" "*" を指定すると、すべての更新モードを指定したと見なされます。 |
|||||||||||||||||||||||
|
キーに割り当てたコマンドを削除するには、一般手続き:VKprcKeyClear( )を実行します。 この手続きは、一般手続き:VKprcKeySet( )で登録した内容を削除します。 ―構文 手続き実行 VKprcKeyClear( キーの名前, 更新モード ) ―記述例 手続き実行 VKprcKeyClear( "→", "*" ) 手続き実行 VKprcKeyClear( "→", "0,2,4,6,8,33,34,36" ) 手続き実行 VKprcKeyClear( "→", "表示,訂正,行挿入,行追加,項目訂正,グループ検索,グループ値訂正,グループ追加" ) |
|
◆補足 by AKome 手続き実行 VKprcKeyClear( キーの名前, 更新モード ) ◇引数 <文字列型:キーの名前> キーの名前を指定します(補足参照)。 ※全角・半角・大文字・小文字の区別はありません ※キーボードの文字と概ね一致していますが、ユーティリティ INF_VK_key_checker.wfm で確認することをお勧めします。 <文字列型:更新モード> 更新モードを指定します(フォームの更新モードがどの状態の時に実行するか を指定します。 複数の更新モードを指定する場合にはコンマ(,)で区切ります。※全角・半角の区別はありません。 "0,2,4,6,8,33,34,36,表示,訂正,行挿入,行追加,項目訂正,グループ検索,グループ値訂正,グループ追加" アスタリスク記号("*") を引き渡すと、すべての更新モードを指定したと見なされます。 |
キーに割り当てたコマンドをすべて削除するには、一般手続き:VKprcKeyClearAll( )を実行します。 この手続きは、一般手続き:VKprcKeySet( )で登録した VK_Framework の局所変数の内容を空にします。 ・すべてのキーの名前と割り当てたコマンドを削除します。 手続き実行 VKprcKeyClearAll( ) ・Altキーを含まないキーの名前と割り当てたコマンドをすべて削除します。 手続き実行 VKprcKeyClearKeyDown( ) ・Altキーを含むキーの名前と割り当てたコマンドをすべて削除します。 手続き実行 VKprcKeyClearSystemKeyDown( ) |
1.2 VK_Framework に用意されている変数の一覧
■イベントに対するスイッチ変数 &VKmKeyDownLive/整数 &VKmSystemKeyDownLive/整数
&VKmKeyDownLive/整数 と &VKmSystemKeyDownLive/整数 はイベントの発生に対して VK_Framework
の呼び出しを制御(許可/禁止)します。 &VKmKeyDownLive の値が真( 1:イチ )の時、[フォーム::キーダウン]イベントハンドラから VK_Framework が呼び出されます。 &VKmSystemKeyDownLive の値が真( 1:イチ )の時、[フォーム::システムキーダウン]イベントハンドラから VK_Framework が呼び出されます。 変数の値が偽( 0:ゼロ、または未定義値 )の時にはイベントハンドラから VK_Framework は呼び出されません。 ※変数の値が真( 1:イチ )の場合でも、イベントがOFF(無効)ならば VK_Framework は呼び出されません。 参照:一般手続き:VKprcEventKeyDownON( ) / VKprcEventKeyDownOFF( ) 参照:一般手続き:VKprcEventSystemKeyDownON( ) / VKprcEventSystemKeyDownOFF( ) |
■コマンド実行に対するスイッチ変数 &VKmOnKey/整数
&VKmOnKey/整数 は、キーに割り当てたコマンドの実行を制御(許可/禁止)します。 &VKmOnKey の値が真( 1:イチ )の時、キーに割り当てたコマンドを実行します。 &VKmOnKey の値が偽( 0:ゼロ、または未定義値 )の時にはキーに割り当てたコマンドを実行しません。 ※キーに割り当てたコマンドが見つからない場合には、何も実行しません。 ※キーに割り当てたコマンドが[注釈]コマンドの場合には、何も実行しません。 参照:一般手続き:VKprcKeyON( ) / VKprcKeyOFF( ) |
イベントハンドラが実行されて、イベントに対するスイッチ変数の値が真( 1:イチ )の時、 &VKmKeyString/文字列 には押されたキーの名前が格納されます。 例えば、Shift + Enter のように、キーの組み合わせがある場合には、 [Alt] + [Ctrl/Shift] + [キーの名前] の順番でプラス記号(+)で連結された文字列が格納されます。 最大で、[Alt] + [フラグ] + [キーの名前] のように3個のキーの組み合わせまで有効です。 ※&VKmOnKey の値が偽( 0:ゼロ、または未定義値 )の時でもキーの名前は格納されます。 &VKmKeyString に格納される文字列は、 [フォーム::キーダウン]イベントハンドラの引数:&仮想キーコード/長整数 の値と、 VK_Framework の局所変数 &VKmConstantNumList/文字列 と &VKmConstantChrList/文字列 を比較して求めます。 キーの名前が見つからなかった場合には、&VKmKeyString には "unknown" が格納されます。 ※[フォーム::システムキーダウン]イベントハンドラから VK_Framework が呼び出された場合も同じです。 ※一般手続き:VKprcEventKeyDownON( ) / VKprcEventKeyDownOFF( ) を実行すると未定義値になります。 ※一般手続き:VKprcEventSystemKeyDownON( ) / VKprcEventSystemKeyDownOFF( ) を実行すると未定義値になります。 |
イベントハンドラが実行されて、イベントに対するスイッチ変数の値が真( 1:イチ )の時、 &VKmRepeat/整数 にはキーを押し続けている(リピート状態)かの否かの情報が格納されます。 リピート状態の場合には、真( 1:イチ )が格納されます。 リピート状態ではない場合には、偽( 0:ゼロ )が格納されます。 ※&VKmOnKey の値が偽( 0:ゼロ、または未定義値 )の時でもリピートの判定は格納されます。 ※一般手続き:VKprcEventKeyDownON( ) / VKprcEventKeyDownOFF( ) を実行すると未定義値になります。 ※一般手続き:VKprcEventSystemKeyDownON( ) / VKprcEventSystemKeyDownOFF( ) を実行すると未定義値になります。 |
イベントハンドラが実行されて、イベントに対するスイッチ変数の値が真( 1:イチ )の時、 &VKmAltKey/整数 には Altキーが押されているか否かの情報が格納されます。 Altキーが押されている場合には、真( 1:イチ )が格納されます。 Altキーが押されていない場合には、偽( 0:ゼロ )が格納されます。 ※&VKmOnKey の値が偽( 0:ゼロ、または未定義値 )の時でもAltキーの判定は格納されます。 ※一般手続き:VKprcEventKeyDownON( ) / VKprcEventKeyDownOFF( ) を実行すると未定義値になります。 ※一般手続き:VKprcEventSystemKeyDownON( ) / VKprcEventSystemKeyDownOFF( ) を実行すると未定義値になります。 |
イベントハンドラが実行されて、イベントに対するスイッチ変数の値が真( 1:イチ )の時、 [キーダウン]/[システムキーダウン]イベントハンドラの値渡しの引数は VK_Framework の局所変数に保存されます。 新たにイベントハンドラが実行されると新しい値で上書きされます。 &仮想キーコード → &VKmKeyNum &スキャンコード → &VKmScanNum &フラグ → &VKmFlagNum ※引数:&処理中止 の値は保存されません。 ※一般手続き:VKprcEventKeyDownON( ) / VKprcEventKeyDownOFF( ) を実行すると未定義値になります。 ※一般手続き:VKprcEventSystemKeyDownON( ) / VKprcEventSystemKeyDownOFF( ) を実行すると未定義値になります。 ※一般手続き:VKprcVariableDataClear( ) を実行すると未定義値になります。 <参考> &VKmScanNum( &スキャンコード と同値 )を 0:ゼロと 1:イチの文字列に変換するには、 一般手続き:VKprcBitStringGet( )を実行します。 文字列の先頭が bit15、末尾が bit0 になります。 ・&VKmScanNum を文字列に変換して組み込み変数:&STR に代入する 手続き実行 VKprcBitStringGet( &VKmScanNum, &STR ) |
◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇
APPENDIX
この項では、
・キーの設定
・[キーダウン]イベントのオン/オフ
・キーのオン/オフ
・VK_Framework を無効にする
に関してガイドライン(指針)を示します。
キーの設定には、動的設定と静的設定の2つの方法があります。 注意:VKprcKeySet / VKprcKeyClear に関しては、それぞれの項を参照してください。 1.キーの動的設定 特定の状況で押されたキーを検出する場合には次のようにします。 ―テキストボックスのエディタ内で押されたキーを検出する ・[入力前]イベントで設定( VKprcKeySet )して、[入力後]イベントで解除( VKprcKeyClear )する。 ※Enterキーを設定することで [ソース値更新]イベント の代わりに利用できます。 ―任意のオブジェクトにフォーカスがある時に押されたキーを検出する ・[フォーカス取得]イベントで設定( VKprcKeySet )して、[フォーカス喪失]イベントで解除( VKprcKeyClear )する。 ―マウスインの時に押されたキーを検出する ・[マウスインアウト]イベントのマウスインで設定( VKprcKeySet )して、 [マウスインアウト]イベントのマウスアウトで解除( VKprcKeyClear )する。 ―マウスドラッグ中に押されたキーを検出する ・[マウス左ダウン]イベントで設定( VKprcKeySet )して、[マウス左アップ]でマウスアウト解除( VKprcKeyClear )する。 ―特定のモードに遷移した時にキーを検出する ・フォームアプリケーションにモードが設定されている場合に、 モードの遷移状態に応じて設定( VKprcKeySet )/解除( VKprcKeyClear )する。 2.キーの静的設定 ダイアログボックス・ウィジェット・メニューなどの小規模なフォームアプリケーションでは、ショートカットキーを用意すると便利です。 そこで、ショートカットキーの登録を[開始時実行コマンド]ボタンで実行するプロシージャで複数のキーを一括して設定( VKprcKeySet )します。 なお、一括して複数のキーを設定するのはプログラムのメンテナンスを容易にするためです。 (例)INF_DatePicker.kev より 手続き定義開始 prcKeySetDefault( ) 手続き実行 VKprcEventKeyDownON( ) /* [キーダウン]イベントを有効にする */ 手続き実行 VKprcKeyON( ) /* キーに割当てたコマンドの実行を許可する */ 手続き実行 VKprcKeySet( "Ctrl + ↑", 1, "0", "手続き実行 prcOnKeyArrow( &VKmKeyString, &VKmRepeat )" ) 手続き実行 VKprcKeySet( "Ctrl + ↓", 1, "0", "手続き実行 prcOnKeyArrow( &VKmKeyString, &VKmRepeat )" ) 手続き実行 VKprcKeySet( "Ctrl + ←", 1, "0", "手続き実行 prcOnKeyArrow( &VKmKeyString, &VKmRepeat )" ) 手続き実行 VKprcKeySet( "Ctrl + →", 1, "0", "手続き実行 prcOnKeyArrow( &VKmKeyString, &VKmRepeat )" ) 手続き定義終了 |
手続き実行 VKprcEventKeyDownON( ) [キーダウン]イベントを有効にする。 |
手続き実行 VKprcKeyON( ) VKprcKeySet で設定したコマンドまたはメソッドを実行する 手続き実行 VKprcKeyOFF( ) VKprcKeySet で設定したコマンドまたはメソッドを実行しない [キーダウン]イベントがオンの場合、キーがオフでもキーが押される毎に次のようにイベントハンドラと VK_Framework のプロシージャが実行されます。 [キーダウン]イベント → VKprcEventKeyEval → VKprcVariableDataSet そのために、パフォーマンスに影響を与える可能性があるので、必要がある時に限り[キーダウン]イベントをオンにすることをお勧めします。 また、[トレース出力]ウィンドウに、これらのイベントハンドラとVK_Framework のプロシージャが頻繁に表示されるので、 [トレース出力]ウィンドウを利用してデバッグする場合には非常に邪魔になります。 (例)[キーダウン]イベントのオンで、[S]キーを押した後に、[A]キーを押した時の動作 設定1:手続き実行 VKprcKeySet( "A", 1, "0", "手続き実行 prcProcedureName( &VKmChr )" ) 設定2:手続き実行 VKprcKeyOFF( ) /* キーのオフ設定:デフォルト値 */ 設定3:手続き実行 VKprcEventKeyDownON( ) [S]キーを押した ┌when 手続き"フォーム::キーダウン(83,31,0,0)"を実行開始しました ※引数の&仮想キーコード:83 は[S]キー │ │┌when 手続き"VKprcEventKeyEval(83,31,0,0)"を実行開始しました ││ ││┌when 手続き"VKprcVariableDataSet(83,31,0,,)"を実行開始しました ││└end ││ │└end │ └end [A]キーを押した ┌when 手続き"フォーム::キーダウン(65,30,0,0)"を実行開始しました ※引数の&仮想キーコード:65 は[A]キー │ │┌when 手続き"VKprcEventKeyEval(65,30,0,0)"を実行開始しました ││ ││┌when 手続き"VKprcVariableDataSet(65,30,0,"S",0)"を実行開始しました │││ │││ キーがオフなので[A]キーを押しても何も実行しません │││ ││└end ││ │└end │ └end |
[キーダウン]イベントがオンの場合、キーがオフでもキーが押される毎に次のようにイベントハンドラと VK_Framework
のプロシージャが実行されます。 [キーダウン]イベント → VKprcEventKeyEval → VKprcVariableDataSet VK_Framework のプロシージャ( VKprcEventKeyEval と VKprcVariableDataSet )が実行されないよにするには次のようにします。 &VKmLive = 0 /* 局所変数:&VKmLive にゼロ( 0 )を代入する */ なお、この局所変数は VK_Framework 導入時のエラー判定のフラグです(導入成功の場合にはイチ( 1 )が代入されます)。 |
以上
サンプル1:キーの組み合わせの検出、ファンクションキーの検出
■キーの組み合わせ設定サンプル | |
手続き定義開始 prcEnterキーのフラグを判定する例( ) 手続き実行 VKprcEventKeyDownON( ) /* [キーダウン]イベントを有効にする */ 手続き実行 VKprcEventSystemKeyDownON( ) /* Altキー を検出するために必要です [システムキーダウン]イベントを有効にする */ 手続き実行 VKprcKeyON( ) /* キーに割当てたコマンドの実行を許可する */ ** Enterキーが押されたら、任意の一般手続きを呼び出す 表示モードに適用した例 手続き実行 VKprcKeySet( "Enter", 0, "0", "手続き実行 prcA( )" ) 手続き実行 VKprcKeySet( "Shift + Enter", 0, "0", "手続き実行 prcB( )" ) 手続き実行 VKprcKeySet( "Ctrl + Enter", 0, "0", "手続き実行 prcC( )" ) 手続き実行 VKprcKeySet( "Alt + Enter", 0, "0", "手続き実行 prcD( )" ) 手続き実行 VKprcKeySet( "Alt + Shift + Enter", 0, "0", "手続き実行 prcE( )" ) 手続き実行 VKprcKeySet( "Alt + Ctrl + Enter", 0, "0", "手続き実行 prcF( )" ) 手続き定義終了 |
|
【キーの組み合わせ】 | |
キーの組み合わせは
[Alt] + [Ctrl/Shift] + [キーの名前] の順番にプラス(+)記号で連結して指定します。 最大で、[Alt] + [フラグ] + [キーの名前] のように3個のキーの組み合わせまで有効です。 キーの組み合わせは、ユーティリティ INF_VK_key_checker.wfm で確認することをお勧めします。 |
|
■ファンクションキーの設定サンプル | |
手続き定義開始 prcファンクションキー検出の例( ) 手続き実行 VKprcEventKeyDownON( ) /* [キーダウン]イベントを有効にする */ 手続き実行 VKprcEventSystemKeyDownON( ) /* F10 を検出するために必要です [システムキーダウン]イベントを有効にする */ 手続き実行 VKprcKeyON( ) /* キーに割当てたコマンドの実行を許可する */ ** ファンクションキーが押されたら、任意の一般手続きを呼び出す F1 ~ F12 まで 表示モードに適用した例 手続き実行 VKprcKeySet( "F1", 1, "0", "手続き実行 prcA( )" ) 手続き実行 VKprcKeySet( "F2", 1, "0", "手続き実行 prcB( )" ) 手続き実行 VKprcKeySet( "F3", 1, "0", "手続き実行 prcC( )" ) 手続き実行 VKprcKeySet( "F4", 1, "0", "手続き実行 prcD( )" ) 手続き実行 VKprcKeySet( "F5", 1, "0", "手続き実行 prcE( )" ) 手続き実行 VKprcKeySet( "F6", 1, "0", "手続き実行 prcF( )" ) 手続き実行 VKprcKeySet( "F7", 1, "0", "手続き実行 prcG( )" ) 手続き実行 VKprcKeySet( "F8", 1, "0", "手続き実行 prcH( )" ) 手続き実行 VKprcKeySet( "F9", 1, "0", "手続き実行 prcI( )" ) 手続き実行 VKprcKeySet( "F10", 1, "0", "手続き実行 prcJ( )" ) 手続き実行 VKprcKeySet( "F11", 1, "0", "手続き実行 prcK( )" ) 手続き実行 VKprcKeySet( "F12", 1, "0", "手続き実行 prcL( )" ) 手続き定義終了 |
サンプル2:&VKmRepeat(リピートの判定の値)を利用する
<&VKmRepeat:VK_framework のキーリピート判定変数> 例えば、以下のようにキーにコマンドを割り当てると、 手続き実行 VKprcKeySet( "Enter", 1, "0", "手続き実行 prcSample2( &VKmRepeat )" ) 表示モードで[Enter]キーを押すと、一般手続き:prcSample2( )が呼び出されます。 この時に引数として、&VKmRepeat(1か0が格納されている) を値渡しすると、 オートリピート中かどうかの判定ができ、機能を実行するかどうかを決められます。 手続き定義開始 prcSample2( 整数 &keyRepeat ) ← &keyRepeat には &VKmRepeat の値が代入されます(値渡し)。 if ( .not &keyRepeat ) ** 機能を実行 else ** 何もしない end 手続き定義終了 ※なお、&VKmRepeat/整数 は局所変数なので、引数として渡さなくても値を直接参照できます。 ※キーダウンイベントハンドラの引数:&スキャンコード/長整数 には多くの情報が含まれています。 この情報の中には、キーを押し続けている(リピート状態)か否かに関するものもあります。 VK_framework を利用すると簡単にリピート状態を判定できます。 |
次の例では 矢印キーのリピートを無効化します。 | |
■設定サンプル 手続き定義開始 prc矢印キーのリピートをキャンセルする例( ) 手続き実行 VKprcEventKeyDownON( ) /* [キーダウン]イベントを有効にする */ 手続き実行 VKprcKeyON( ) /* キーに割当てたコマンドの実行を許可する */ ** 矢印キーが押されたら、一般手続き:prc矢印キー評価( ) を呼び出す 表示モードに適用した例 手続き実行 VKprcKeySet( "↑", 0, "0", "手続き実行 prc矢印キー評価( &処理中止 )" ) 手続き実行 VKprcKeySet( "↓", 0, "0", "手続き実行 prc矢印キー評価( &処理中止 )" ) 手続き実行 VKprcKeySet( "←", 0, "0", "手続き実行 prc矢印キー評価( &処理中止 )" ) 手続き実行 VKprcKeySet( "→", 0, "0", "手続き実行 prc矢印キー評価( &処理中止 )" ) 手続き定義終了 ■呼び出す手続きのサンプル 手続き定義開始 prc矢印キー評価( 参照 長整数 &処理中止 ) if ( &VKmRepeat ) /* VK_framework の局所変数:整数 キーをリピートした時の値:1(イチ) リピートしなかった時の値:0(ゼロ) */ &処理中止 = 1 end 手続き定義終了 ■【引数:&処理中止 の参照渡し】 [手続き実行 prc矢印キー評価( &処理中止 )]のように引き数:&処理中止 を参照渡しすれば、 呼び出された一般手続き:prc矢印キー評価( )の側で &処理中止 の値を変更できます。 ※引数;&処理中止 を参照で渡さない場合には、VKprcKeySet( )で設定した &処理中止 の値のままになります。 |
サンプル4:Enterキー/Escキー を押したとき、自身のフォームを閉じる
◆Enterキー と[OK]ボタンを同等に、また Escキーと[キャンセル]ボタンを同等にしてみます。 以下の設定サンプルでは、Enterキー/Escキー を押したとき、自身のフォームを閉じます。 |
|
■設定サンプル | |
手続き定義開始 cmdStartupClick( ) /* フォーム起動時に実行するようにセットしておきます。 */ 手続き実行 VKprcEventKeyDownON( ) 手続き実行 VKprcKeyON( ) 手続き実行 VKprcKeySet( "Esc", 1, "0", "手続き実行 prcOnKeyEnterEsc( 0 )" ) 手続き実行 VKprcKeySet( "Enter", 1, "0", "手続き実行 prcOnKeyEnterEsc( 1 )" ) *ヒント:prcOnKeyEnterEsc → 手続き名 に押されるキーの名前を含めることで分かり易くなります。 手続き定義終了 手続き定義開始 prcOnKeyEnterEsc( 整数 &flag ) メソッド呼び出し @cmd閉じる.実行( ) /* 機能名に "閉じる" を設定してあるコマンドボタン */ 手続き定義終了 |
&処理中止:[フォーム::キーダウン]/[フォーム::システムキーダウン]イベントハンドラの引数に準備されている変数です。 | |
フォーム起動時に、
例えば以下のようにキーにコマンドを割り当てておくと、 手続き実行 VKprcKeySet( "Enter", 1, "0", "手続き実行 prcSample1( &処理中止 )" ) 表示モードで[Enter]キーを押すと、一般手続き:prcSample1( )が呼び出されます。 この時に引数として、&処理中止/長整数 を参照渡しすると、&処理中止の値を変更できます。 手続き定義開始 prcSample1( 参照 長整数 &処理中止 ) if ( 条件式 ) &処理中止 = 1 else &処理中止 = 0 end 手続き定義終了 ※リファレンスより([キーダウン]、[システムキーダウン]イベント) &処理中止/長整数(参照) このハンドラが終了したあと、処理を中止するかどうかを指定します。 値:0 ⇒ 続けます(規定値)、値:0以外 ⇒ 中止します。 |
デフォルト設定はフォーム作成時に決めておき変更しないことがシステム的にベターです。 ※必要な時にデフォルト設定を適宜ストップ&ゴーすることについては「静的運用」で解説しています。 ここではさらにもう一歩踏み込んで デフォルトのキー設定を解除、変更する方法について記載します。 |
|
■解除 デフォルトのキー設定を解除する場合は、イベントで、 ・[キーダウン]イベントを無効にする ・キーに割り当てたコマンドの実行を禁止する ・すべてのキーの名前と割り当てたコマンドを削除する 3つのうちの、いずれかの対策を行えば、デフォルトのキー設定は無効になります。 どの対策を行うかは、ケースバイケースで決めてください。 ※すべての対策を行なってもOKです。 例) 手続き定義開始 famCMD::フォーカス取得(文字列 &喪失オブジェクト名) 手続き実行 VKprcEventKeyDownOFF( ) /* [キーダウン]イベントを無効にする */ 手続き実行 VKprcKeyOFF( ) /* キーに割り当てたコマンドの実行を禁止する */ 手続き実行 VKprcKeyClearAll( ) /* すべてのキーの名前と割り当てたコマンドを削除する */ 手続き定義終了 ※ここでは[フォーカス取得]イベントを使っています(エディタの外で発生するイベントです)。 |
|
■再設定、変更 デフォルトのキー設定に戻す、デフォルトのキー設定を変更するには、 イベントで、デフォルトのキー設定を行う一般手続きを呼び出します。 例) 手続き定義開始 famCMD::フォーカス喪失(文字列 &取得オブジェクト名) 手続き実行 prcKeySetDefault( ) 手続き定義終了 ※ここでは[フォーカス喪失]イベントを使っています(エディタの外で発生するイベントです)。 |
備考1:【訂正モードのスラッシュメニューに関して】、【テンキーのキーの名前に関して】
【訂正モードのスラッシュメニューに関して】 | |
[ツール]メニュー →
[カスタマイズ] → [キーボード]を選んで、 [キーカスタマイズ]の[キー割当て一覧]タブでの[初期値に戻す]ボタンで、 ・[標準の構成]を選んだ時には、Ctrl + M ・[桐ver.5互換の構成]を選んだ時には、Ctrl + Z になります。 |
|
【テンキーのキーの名前に関して】 | |
スラッシュ記号(/)はキーボードとテンキーの両方にあります。 キーダウンイベントハンドラに引き渡される引数:&仮想キーコード の値はそれぞれ違いますが、 VKではどちらも同じキーの名前として処理します。 数字(0...9)とマイナス記号(-)も同じです。 ※もしも、テンキーのキーの名前を区別したい場合は、 ※一般手続き:VKprcConstantDefine( )で仮想キーコードに対応するキーの名前を変更してください。 |
キーの名前は配列変数:&VKmKeyNameKeyDownDim[ ] に格納されます。
処理中止の値は配列変数:&VKmKeyCancelKeyDownDim[ ] に格納されます。
適用更新モードは配列変数の要素番号になります。
実行するコマンドは配列変数:&VKmKeyMacroKeyDownDim[ ] に格納されます。
実行時には、一般手続き:VKprcEventEval( )が配列変数を参照して、[コマンド]コマンドを実行します。