この記事で扱っていること
- 言葉を登録してコピペで使用する方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
よく使う文字を辞書登録的な形で残して適当なショートカットを割り当てていつでもその言葉を使えるようにすれば、長い文字をいちいち入力する手間が省けて便利です。
これをLabVIEWプログラムとして行う場合、どのようになるかを考えてみました。
今回は数字の情報がついていて都合のいい、ファンクションキーをショートカットキーとして指定しています。
どんな結果になるか
フロントパネル上には5つの文字を登録できるようにしています。
文字を登録したり入力した文字を取り消してもともと登録していた文字に戻すボタンがあります。
実際に対応するファンクションキーを押すと、その文字列制御器の中身をCtrl + Cしたのと同じ状態となるので、あとはCtrl + Vでペーストできるようになります。
各文字列制御器に入力した文字は「登録」することで使えるようになります。
また、文字列制御器の入力値を変更している間に(登録する前に)、やっぱり前の入力値に戻す、という場合には戻すボタンを押すことで前の入力値を文字列制御器に戻すことができます。
これらの文字列制御器の情報はプログラムの実行時にiniファイルから読み出し前回登録した値を自動的に使用することができ、プログラム終了時にそのiniファイルに保存していくようにしています。
プログラムの構造
全体の構造はステートマシンです。
一つ一つのイベントに対して動作させるのであればやはりステートマシンが強力ですね。
今回のプログラムでは6つのステートを用意しています。
まずはiniステートです。
ここでは、プログラム内で使用するリファレンスを準備したり、登録した文字列の情報をiniファイルから拾い出して制御器に反映させたり文字列配列の初期化を行っています。
リファレンスを使用しているのは、これ以外の方法だとローカル変数を使用することになりますが、その場合はケースストラクチャで場合分けをするようなプログラムを書くことになるため、今回のプログラムのようにリファレンスの配列と指標番号を扱うプログラムの方がより簡潔に書けなおかつ項目(登録用の文字列制御器)の数を増やしてもプログラムをほとんど変えなくて済むからです。
selected elementのワイヤ(下の図で横一直線に通った青いワイヤ)では、入力と出力をそのままワイヤで結ぶ以外でも、定数0を出力として与えても後の動作に影響はありません。
次にeventステートです。
4つのイベントを定義し、それぞれが実行されると異なるステートに移動するようにしています。
各イベントの中身は以下の図を参考にしてください。
複数のイベント内容を定義したものについては、制御Refの値を使用して、どのボタンが押されたかということを判定し、さらに押されたボタンに応じた「数値」が抽出されるように、extract number info.viというサブVIを作っています。
キーダウンイベントには、関数パレットの「接続」から「入力デバイス制御器」パレットの中身の関数を使用して、キーボードのボタンが押された時にどのボタンが押されたかを判別するようにしています。
今回はF2からF5のいずれかのファンクションキーが押されたらcopyステートに進みそれ以外はeventステートに戻るようにしています。
37を引いている部分がありますが、これは検出された「押されたボタン」の情報を示した列挙体の項目番号として「F2」が37番目の項目にあたるからです。
例えば、F3が押されたら、F3は列挙体の中で38番目の項目であるため、38-37=1がselected elementとなり、これを他のステートで配列の指標を指定する番号として使用します。
extract number info.viの中身は以下の図を参考にしてください。
制御Refの値を受け取ったらこのリファレンスをプロパティノードに渡し、ラベルのテキストプロパティを指定して部分文字列関数に渡します。
ブールボタンのラベルはどれも「F<n>登録」や「F<n>戻す」としているため、これらのラベルに部分文字列関数でオフセット1、長さ1を指定すると<n>の値を抽出できます。
今回のプログラムでは、F2に対応する文字列制御器が、initで用意したregistered string配列の要素0に相当します。
つまりF2が押されたら要素0を指定できるようにしたいので、F<n>のnの値から2を引くようにしています。
こうすることで、別のボタン、例えばF4が押された場合には(これはregistered string配列の要素2に相当することになります)、それはF4の「4」から2を引くことになります(こうすることでregistered string配列の指定したい要素番号と一致するようにします)。
次にregisterステートです。
登録のボタンが押されると実行され、リファレンスの配列から要素番号(selected element)で指定したリファレンスをプロパティノードに(より特定のクラスに変換を介して)渡し、値プロパティを読み取って、registered string配列の対応する要素(これもselected elementに一致)を置換しています。
こうすることで、registered stringの中身の要素を、対応する文字列制御器の中身で置き換える操作を、ローカル変数なしで実現しています(ローカル変数を使用することが悪いと言いたいわけではないですが、今回のような書き方をすることで、例えば登録する文字の数を増やす場合に、F7等のリファレンスを増やすだけで他にプログラムを修正しなくてもよいといった拡張性が高くなります)。
次にundoステートです。
やっていることは、registered stringの対応する要素で、文字列制御器の値を上書きする操作であり、上のregisterステートの逆の操作っぽいですが、こちらもまたselected elementをうまく使用することで簡潔に書けるようにしています。
次にcopyステートです。
選ばれた要素の中身を値プロパティで取得して、インボークノードのApplicationクラスにある「クリップボードに書き込む」メソッドを使用することでクリップボードに書き込んでいます。
(実は今回のプログラムではリファレンス配列は全て文字列のリファレンスであるため、下記の図のように、指標配列の後により特定のクラスに変換関数を使用しなくてもプロパティノードを使用して文字列に対するプロパティ操作を扱うことができます。)
最後はendステートです。
initステートで指定していたiniファイルと同じiniファイルに対して、要素を書き込んでいます。
F1を使いたい場合
上では、F1が既に特定の操作(ヘルプを開く)に割り当てられているのでF1をショートカットに使用することはできないと書きましたが、どうしてもF1を使用したいという場合には、「Shift + F1」であれば使用することができます。
Shiftキーが押されてかつF1キーが押されたというのは、キーダウンイベントの中で複数のキーボードキーが押されたことを受けて「Shiftキーが検出された」かつ「F1からF5のいずれかが検出された」ということで判断できます。
また、registered stringの配列要素の番号がF1が要素0になるようにため、要素番号を指定するselected elementに関する値の扱い方も変わります。
具体的には、キーダウンイベントおよびextract number info.viで要素番号の情報を扱う部分で今までよりも1つ少ない数を引くことになります。
また、iniファイル上の表示もF1から始められるように、initステートおよびendステートでiniファイルへの読み書きに対してForループを使用している部分の数字の扱い方も変える必要があります。
下の図の赤枠部分(endステートの変更は省略していますがinitステートの変更と同じです)を参考にしてみてください。
本記事では言葉を登録してコピペで使用する方法を紹介しました。
辞書登録的な機能を持たせる必要があるアプリケーションでの実装の参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント