この記事で扱っていること
- 表の指定箇所をハイライトする方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWで読み込んだファイルの中身を表示させる際に、場合によっては表表示器が便利です。
わかりやすいのがExcelファイルの中身のような縦と横に項目が並んだようなデータを表示させる場合です。
そこで、特定のフォーマットで保存されたデータを前提としていますが、行方向、列方向にそれぞれヘッダ情報がある表を読み込ませて、それぞれのヘッダを選択することで行と列を指定の色でハイライトし、また交点についてはさらに別の色で示せるようにしてみました。
どんな結果になるか
「特定のフォーマットで保存されたデータ」として、以下の図のようなファイルを想定します。一番最初の行(1)と一番最初の列(A)に項目名(ヘッダ情報)があるようなものです。
プログラムでは、ファイルを指定するためのファイルパス制御器と、表表示器、およびテキストリング制御器とカラーボックス制御器を配置しています。
実行するとファイルの中身が読み出され、2つのテキストリングそれぞれに行と列の情報が入ります。
あとはこれらを選択することで、指定の色でハイライトすることができます。
プログラムの構造
ハイライトするセルの指定やハイライトカラーはプロパティノードで指定できます。基本的に全て表表示器のプロパティを使用するので、最初に指定した表のリファレンスを使用し続け、似たような処理が多くなるのでサブVIにまとめました。
まず、初めの部分ではファイルから中身を読み出し、ヘッダ部分として最初の行および列を配列から削除関数で抜き出し、それぞれの項目の中身を列方向項目リストおよび行方向項目リストのテキストリングに入るよう、文字列[]プロパティを使用しています。
次にある二重のForループは表の初期化です。行、列の方向で値が入っている部分に対してハイライトするための背景色の指定を白に戻しています。もちろん、この部分を白以外の色にすることもできます。
セルの色を変えるには、まずどのセルを対象とするかをアクティブセルとして指定し、その次にセル背景色を指定します。プロパティノード上で「アクティブセル」という名前で見つかる項目から選べます。
次に、イベントストラクチャの入ったWhileループに移ります。
停止ボタンを押した際のイベントは特に説明することはないとして、行方向、列方向項目リストの値変更に対してイベントを発生させるようにしています。
列方向項目リストの値変更イベントでは、以下の二つの動作を行うことになります。
- 一つ前に選択されていた列のハイライトカラーを戻す
- 今選択された列のハイライトカラーを設定する
便利なことに、イベントストラクチャでは、「このイベントが前回発生したときの(列方向項目リストの)値」を取得することができるため、これを利用します。
注意する点としては、列方向の指定の際に、行方向で指定されていた値も参照する必要があることです。これをしないと、プログラムがうまく機能しません(言葉で説明するのが難しいので、興味がある方は行方向の指定をしない状態でどうなるか確かめてみてください)。下の画像をクリックして拡大して間違えないように配線してみてください。
言葉がややこしいのですが、「列方向を指定」するということは、列番号の値は固定で、行番号を変えてハイライトカラーを指定することに注意してください(そのため列方向項目リストで使用しているサブVI名も、row_colorchangeという名前にしています)。
サブVIの中身は以下のようです。色の指定の部分が少しややこしいかもしれません。
行方向項目リストの値変更イベントも、実装の考え方は同じです。配線がごちゃついているので、もう少し見やすくできるとは思いますが・・・。
サブVI、column_colorchangeは以下の構造をしています。row_colorchangeと一部異なっているので注意してください。(行列情報のクラスタからForループにデータを渡す部分と、Forループの中の名前でバンドルの上下が逆になっています)
表の初期化について
こちらのプログラム、表の初期化についてはやや難点があります。というのも、初期化の部分で実装しているのは、「読み出した表の大きさの範囲の部分で、背景色を白にする」という処理であるため、例えば4×6の行列の表を読み込んだ後に、今度は3×4の表を読み込むと、背景色が白にならない部分が表れるためです。
毎回読み込むファイルの表の中身の大きさが同じであればこの問題は起こりませんが、もし場合によってまちまちの場合には、想定されうる最大の表の大きさ分、Forループを回すようにする必要があります。
例えば、読み出したいファイルが複数あってそのどれもが行も列も20はないときには以下のようにします。
この記事ではヘッダ情報を読み取って、ヘッダの名前で指定することで表の特定箇所をハイライトする方法を紹介しました。
複数の箇所(この場合はセル)をまとめて指定する場合には対象の制御器などのリファレンスをプロパティノードに配線し、Forループと併用することでまとめてプロパティの設定ができるのでプログラムがすっきりするので、手法として参考になると嬉しいです(今回のプログラムではその他の部分での配線のごちゃごちゃ感は否めませんが・・・)。
ここまで読んでいただきありがとうございました。
コメント