この記事で扱っていること
- フロントパネル上のボタンをクリックすることで文字を入力する方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
PC上のアプリケーションの操作にはマウスやキーボードを使用しますが、キーボードがないと文字が入力できないかというとそんなことはなく、ソフトウェアキーボードを使用して文字を入力するような機能を持たせられます。
本記事ではLabVIEWによってソフトウェアキーボードを作成した例を紹介しています。
アルファベットと記号だけの対応になっていますが、大文字と小文字の区別ができるほか、応用すればキーボードの配置をバラバラにすることができます(サイトによってはランダムな配列のキーボードでの入力によって操作のトレースに依るパスワード流出を防ぐものがありますが、あんな感じです)。
どんな結果になるか
プログラムのフロントパネルには入力した文字を表示する文字列表示器と、ソフトウェアキーボードがあるだけです。
Shiftの代わりになるボタンを押すことで、大文字、小文字を切り替えられます。また文字の取り消しの機能も備えています。
プログラムの構造
まずはフロントパネルで入力パッドを用意する必要がありますが、これはクラスタで作っています。
シルバーのデザインの空のボタンをクラスタの中にいれるのですが、これらのボタンのクラスタ内の順番に注意します。
デザインパターンは一通りではないと思いますが、今回は別に効率を重視しているわけではないのでイベントストラクチャが入ったWhileループのみを使用する形としてみました。
本来はイベントストラクチャの中に処理を入れるのは好ましくない(イベントストラクチャの中の処理が終わらないとフロントパネルの操作ができないロック状態となるため)のですが、イベントが途中で止まるような作りにはしていないので問題になることはほぼないと思います。
各イベントは次の通りです。
Shiftボタンの値変更とタイムアウトイベントをまとめて一つのイベントとしています。こちらでは、あらかじめ決めた文字セットを配列にしてそれを空のボタンそれぞれのテキストとして表示させるようにしています。
中ほどにあるForループの部分で、文字列定数の文字一つずつを配列にするという操作をしています。もちろん、こんなことをしなくても最初から文字一つずつが入った文字列定数の配列を用意すればいいのですが、めんどくさかったのでプログラム的に作るようにしました。
なお、タイムアウトイベントも設定しているのは、プログラム実行時にまず小文字セットのテキストを一度全てのボタンに反映させるためです。タイムアウトイベントは、イベントストラクチャが入ったWhileループの一番最初に実行される以降は、下の図の左上の組み方をすることで、起こらないようにしています。
小文字セット、大文字セットのそれぞれの文字列定数の一番最後にはどちらも半角スペースが入っています。キーボードのスペースキーの機能を持たせるためですね。
入力パッドの値変更イベントでは、押されたボタンどれかがTRUEになり他はFALSEとなっているはずであることを利用し、クラスタから配列に変換してそのTRUEになったボタンが何番目のボタンかをForループを使って取得、その番号の文字を取り出すために指標文字列配列関数を使用しています。
一文字取り消しの値変更イベントでは文字列を一度バイト配列にしその配列の最後の要素を削除して再び文字列に変換しています。
最後にAll deleteのイベントですが、これは単純で表示させる文字をリセットするだけです。
上にも書きましたが、本来はイベントストラクチャに処理を書き込むべきではないです。が、別にこのプログラムは効率を重視したプログラムでもなくまたエラーも基本起こらないのでこのような形としています。
また、今回はキーボードの機能をアルファベットだけ実装していますが「小文字セット」や「大文字セット」の部分やボタンの数を変えることで、数字だけを扱うテンキーを作ることもできます。
今回のプログラムをサブVIとして、メインVI上で必要な場合に呼び出すような作りとする場合にはメインVIの方に値を渡せるようにしておく必要があります。
メインVIに渡す際の文字列表示器は「入力文字列」でもいいのですが、典型的な形を踏襲しWhileループを抜けた後の文字列表示器(「最終文字」)をコネクタペーンに設定しています。この部分およびその下のエラー入出力はフロントパネル上で見えている必要はないため、ウィンドウのサイズを調整して隠します。
なお、サブVIとしただけだとメインVIでこのサブVIを呼んでもサブVIのフロントパネルが表示されないので、サブVIに対してVIプロパティを設定してちゃんとフロントパネルが表示されるように構成する必要があります。
ランダム配列のキーボード
キーボードの配列を、通常のQWERTYではなくバラバラにするには配列をシャッフルするだけです。1次元配列のシャッフルを行う関数は比較的新しいLabVIEWであれば関数パレットに存在しています。
これを文字列配列を扱っている部分で使用するだけでシャッフルすることができます。
ただし、古いLabVIEWだと関数パレットに1D配列シャッフルの関数がないため、自作する必要があります。どのようなアルゴリズムにするとよりランダムさが増すのかといった難しいことを考えなければ、例えば以下のような感じでいいと思います。
あとはこれをプログラムの中の以下の位置で使用するだけです。
キーボードの変化をまとめて行う
今回のプログラム、空のボタンのテキストに文字を反映させる操作をForループで行っているのですが、Forループの順番で処理されたボタンに文字が反映されるので、Shiftボタンを押したときに順番に文字が小文字、大文字入れ替わる様子が見えてしまいます(一瞬では全てのボタンを変化させられない、ということです)。
もしそのような見た目とさせたくないのであれば、下の図のように一度フロントパネルの更新を止めてすべてのボタンの処理が終わってから更新を再開するようにするという対策が考えられます。
本記事ではフロントパネル上のボタンを押下することでアルファベットを入力する方法を紹介しました。ランダム配列にする場合にも対応しやすくなっていると思うので、ユーザーにパスワードを入力させるための画面を自作する、といった場合に参考にしてみてください。
ここまで読んでいただきありがとうございました。
コメント