2012年11月7日水曜日

キー入力の連続入力を阻止

キー入力の処理に四苦八苦していた私ですが(関連記事
ウェイトコマンドの活躍によりなんとか形になったわけですが(関連記事
ちょうど同じような悩みの人がいたらしく、某巨大掲示板の質問スレでわかりやすい解答を見つけましたので以下引用。

「Xキーが押されている状態ならばメニュー表示or消去」という分岐を繰り返すから、
Xキーを押しっぱなしにしているとメニューの表示消去が連続で行われてしまう
「Xキーがいったん離されたあと、再び押されている状態ならばメニュー表示or消去」と解釈すればいい
つまり、Xキーがいったん離されたことを監視する分岐・変数を作ればいい
1. Xキーの入力状況をチェックする
2. Xキーが押されていない→変数を1にする
3. Xキーが押されており、なおかつ変数が1である→変数を0にして、メニュー表示or消去
4. ループなり並列実行終了なりで最初に戻る
という構造の並列実行やループで、求める動作がおそらく実現する
あくまで例で、「キーがいったん押されていない状態になった」ことを判定できれば何でもよい
「特定キーのみ判定」は「指定されたキー以外の入力を無視する」機能だから、
今回の目的とは直接の関係はない
「キーが押されるまで待つ」を利用すれば、「キーがいったん離されたあと押された」ことが担保されるので、
一見メニュー表示消去に使えないでも無さそうだが、
並列実行やループがそこで待機してしまうため、暴発防止の手間がかかる

なるほどなあー。

ウェイトしてもちょっと長押しすると連続でキーが入力されてしまうことにイライラしていたので、この方法だと絶対に連続で入力されないので良いですね。
ということで改良してみましたメモ。
自分用メモなので大変わかりにくいですけれども。


|■ループ開始
||■ウェイト:1 フレーム
||■キー入力:このコモンEvセルフ変数4 / キーボード(100~) [キーコード[128]のみ判定] ( Enterキー )
||■キー入力:このコモンEvセルフ変数3 / キーボード(100~)
||■キー入力:このコモンEvセルフ変数14 / キーボード(100~) [キーコード[114]のみ判定] ( BSキー )
||▼ キーが何も押されていない場合に入力フラグをONにする
||■条件分岐(変数): 【1】CSelf3[キー入力受付(文字キー)] が 0と同じ
||-◇分岐: 【1】 [ CSelf3[キー入力受付(文字キー)] が 0と同じ ]の場合↓
|||■条件分岐(変数): 【1】CSelf4[キー入力受付(決定キャンセル)] が 0と同じ
|||-◇分岐: 【1】 [ CSelf4[キー入力受付(決定キャンセル)] が 0と同じ ]の場合↓
||||■条件分岐(変数): 【1】CSelf14[キー入力受付(BS)] が 0と同じ
||||-◇分岐: 【1】 [ CSelf14[キー入力受付(BS)] が 0と同じ ]の場合↓
|||||■変数操作: CSelf13[文字入力フラグ[0=ON]] = 0 + 0
|||||■
||||◇分岐終了◇
||||■
|||◇分岐終了◇
|||■
||◇分岐終了◇
||■条件分岐(変数): 【1】CSelf13[文字入力フラグ[0=ON]] が 0と同じ||-◇分岐: 【1】 [ CSelf13[文字入力フラグ[0=ON]] が 0と同じ ]の場合↓
|||■条件分岐(変数): 【1】CSelf3[キー入力受付(文字キー)] が 130と同じ
|||-◇分岐: 【1】 [ CSelf3[キー入力受付(文字キー)] が 130と同じ ]の場合↓
||||▼ a
||||■可変DB書込:DB[27:0:CSelf12[今何文字目]]()  =  "a"
||||■変数操作: CSelf12[今何文字目] += 1 + 0
||||■                             
|||◇分岐終了◇
|||▼ BSキーが押されたら一文字戻る
|||■条件分岐(変数): 【1】CSelf3[キー入力受付(文字キー)] が 115と同じ
|||-◇分岐: 【1】 [ CSelf3[キー入力受付(文字キー)] が 115と同じ ]の場合↓
||||▼ 一文字目の場合は処理せずに戻る
||||■条件分岐(変数): 【1】CSelf12[今何文字目] が 0と同じ
||||-◇分岐: 【1】 [ CSelf12[今何文字目] が 0と同じ ]の場合↓
|||||■ループ開始へ戻る
|||||■
||||◇分岐終了◇
||||■変数操作: CSelf12[今何文字目] -= 1 + 0
||||■可変DB書込:DB[27:0:CSelf12[今何文字目]]()  =  "*"
||||■
|||◇分岐終了◇
|||▼ キャンセルキーが押されたら一文字戻る
|||■条件分岐(変数): 【1】CSelf14[キー入力受付(BS)] が 114と同じ
|||-◇分岐: 【1】 [ CSelf14[キー入力受付(BS)] が 114と同じ ]の場合↓
||||▼ 一文字目の場合は処理せずに戻る
||||■条件分岐(変数): 【1】CSelf12[今何文字目] が 0と同じ
||||-◇分岐: 【1】 [ CSelf12[今何文字目] が 0と同じ ]の場合↓
|||||■ループ開始へ戻る
|||||■
||||◇分岐終了◇
||||■変数操作: CSelf12[今何文字目] -= 1 + 0
||||■可変DB書込:DB[27:0:CSelf12[今何文字目]]()  =  "*"
||||■
|||◇分岐終了◇
|||▼ 文字数をオーバーしたら消す
|||■条件分岐(変数): 【1】CSelf12[今何文字目] が CSelf2[文字数]と同じ
|||-◇分岐: 【1】 [ CSelf12[今何文字目] が CSelf2[文字数]と同じ ]の場合↓
||||■変数操作: CSelf12[今何文字目] -= 1 + 0
||||■
|||◇分岐終了◇
|||▼ 決定キーを押して正誤判定へ
|||■条件分岐(変数): 【1】CSelf4[キー入力受付(決定キャンセル)] が 128と同じ
|||-◇分岐: 【1】 [ CSelf4[キー入力受付(決定キャンセル)] が 128と同じ ]の場合↓
||||●ラベル「正誤判定」に飛ぶ >>>>>>>>>>>>>>>>>>>>>>>>>
||||■
|||◇分岐終了◇
|||▼ 文字が入力されたら入力フラグをOFFにして、ループを抜ける
|||■条件分岐(変数): 【1】CSelf3[キー入力受付(文字キー)] が 0以外
|||-◇分岐: 【1】 [ CSelf3[キー入力受付(文字キー)] が 0以外 ]の場合↓
||||■変数操作: CSelf13[文字入力フラグ[0=ON]] = 1 + 0
||||■変数操作: CSelf3[キー入力受付(文字キー)] = 0 + 0
||||■ループ中断
||||■
|||◇分岐終了◇
|||■条件分岐(変数): 【1】CSelf14[キー入力受付(BS)] が 0以外
|||-◇分岐: 【1】 [ CSelf14[キー入力受付(BS)] が 0以外 ]の場合↓
||||■変数操作: CSelf13[文字入力フラグ[0=ON]] = 1 + 0
||||■変数操作: CSelf14[キー入力受付(BS)] = 0 + 0
||||■ループ中断
||||■
|||◇分岐終了◇
|||■条件分岐(変数): 【1】CSelf4[キー入力受付(決定キャンセル)] が 0以外
|||-◇分岐: 【1】 [ CSelf4[キー入力受付(決定キャンセル)] が 0以外 ]の場合↓
||||■変数操作: CSelf13[文字入力フラグ[0=ON]] = 1 + 0
||||■変数操作: CSelf4[キー入力受付(決定キャンセル)] = 0 + 0
||||■ループ中断
||||■
|||◇分岐終了◇
|||■
||◇分岐終了◇
||■
|◇ループここまで◇◇


 きちんと、一回キーを離すまで文字を入力しないシステムになりました。
逆に連打で何かを入力させたい場合は、ウェイトさせる方法をとればいいわけだな。

0 件のコメント:

コメントを投稿