カスタマイズしたファイルダイアログ

Tips

スポンサーリンク

この記事で扱っていること

  • カスタマイズしたファイルダイアログを作る方法

を紹介しています。

注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。

プログラムを実行し得られた結果を保存するという操作はよく行われることと思いますが、ファイル保存そのものと同じく、保存したファイルの管理をどうするかもまた重要です。

LabVIEWの場合ファイルの指定はファイルダイアログを使用することができ、これはこれで既に関数として用意されています。

ただ、例えば「余計なフォルダは見てほしくない」といった場合に、特定のディレクトリ下しか表示させない、といった機能は持っていません。そのようにするにはファイルダイアログをカスタマイズして作る必要があります。

本記事では、そのような特定ディレクトリ下のファイルしか選択できないようなファイルダイアログを用意してみました。

スポンサーリンク

どんな結果になるか

フロントパネルには、現在選択しているパスを表示するとともにそのパスに存在しているフォルダもしくはファイルを表示するリストボックス制御器があります。

なお、ファイルダイアログなので、別のメインVIがあってそこからこのファイルダイアログとなるサブVIを呼び出してこのVIでファイルを選択後、選択されたファイルのパスをメインVIに渡す前提としているのでselected pathというファイルパス表示器をコネクタペーンにつけています。

プログラムを実行すると、リストボックスにフォルダもしくはファイルが表示され、ダブルクリックすることで選択できます。

ミソとしては、「ホームディレクトリ」を設定し、そのディレクトリより上の階層には行けないようにしている点です。ユーザーに、特定のフォルダ以下の内容しか触ってほしくない場合を想定しているためです。

フォルダ(拡張子がついていない項目)をダブルクリックすると下の階層にいきますがその場所に何のフォルダもファイルもない場合には「空」と表示されます。

一方ファイルをクリックすると「ファイルを選択済み」と表示されます。

決定を押すと指定したファイルやフォルダのパスが、キャンセルを押すとホームディレクトリのパスが、それぞれselected pathに表示されます。

プログラムの構造

イベントストラクチャで実装しています。本来はイベントストラクチャ内に処理をおくのは好ましくないものの、不必要にプログラムが大きくなるのを防ぐためこのイベントストラクチャを含んだWhileループのみで作っています。

各イベントをそれぞれ紹介していきます。

まずはタイムアウトおよびホームディレクトリへのボタンの値変更イベントです。

タイムアウトイベントは、後で紹介する別のイベント後にわざと発生させるようにタイムアウト値を調整できるようにしていて、リストボックスの表示内容をプロパティノードの「項目名」によって変更するという役割を持っています。

以下のブロックダイアグラムではケースストラクチャのTRUEにアプリケーション定数やパス作成の関数を置いていますが、この部分で「これ以上上の階層にいかせたくない」というホームディレクトリを指定します。

これがTRUEになる条件は「初めて呼び出す?」の関数がTRUEになるかホームディレクトリへのボタンがTRUEになるかのいずれかで、それ以外の場合にこのイベントが実行される際にはFALSEとなります。

リストボックスの項目名プロパティには、フォルダをリストから呼び出した結果を入れるか、あるいは「<空>」という文字列が書かれた配列(配列の要素は一つだけ)を入れるか、「<ファイル選択済み>」という文字列が書かれた配列(こちらも要素は一つだけ)を入れます。

ではそれらのうちどれをプロパティノードに入力すかを決めるために、フォルダをリストの関数に入力するためのファイルパスを調べてそれがディレクトリのパスになっているか、フォルダをリストの結果が何もない(配列のサイズが0)かどうかで判断し選択関数で決定しています。

次に、リストボックスのダブルクリックイベントです。

このイベントによってリストボックス制御器に表示されている項目のうち実際にダブルクリックされた項目を指標配列で抜き出しパスを作成していますが、もし既にファイルを選んでいてそれ以上先にファイルやフォルダがない場合、あるいは空のフォルダを選択している場合にはパス作成の前の値をシフトレジスタに渡すようにします。

このイベントが起こったら、先ほどのタイムアウトイベントでリストボックスの表示を表示内容を更新するため、タイムアウト値に対応したシフトレジスタに「1」を渡してすぐにタイムアウトイベントが発生するようにしています。

次は戻るボタンの値変更イベントです。

パスをストリップさせるだけではありますが、もし今既にホームディレクトリにいる場合には上の階層にいかないようにするためにパスをストリップを行いません。

このイベントもまた、発生後リストボックスの表示を更新するためにタイムアウトイベントを発生させようとしてタイムアウト値を「1」としてシフトレジスタに渡すようにしています。

次はパネルを閉じる?イベントです。

このVIはウィンドウ右上のバツボタンで閉じてほしくないため、バツボタンで閉じようとすると警告を出すようにし、バツボタンが押されたことを無かったことにします(イベントを破棄します)。

そして最後にキャンセルまたは決定のボタンの値変更イベントです。

このイベントが発生したのが決定ボタンの値変更だった場合、キャンセルのボタンはFALSEになっているはずですし、もしキャンセルのボタンが押されたことでこのイベントが発生した場合にはその時点ではキャンセルはTRUEとして読み取られることを利用し、ホームディレクトリのパスか選択したパスどちらかをselcted pathに渡すようにしています。

拡張子を指定する場合

上のプログラムではフォルダ、ファイル全てを表示するようなプログラムとしていました。

しかし、場合によってはもっと制限したく、特定の拡張子のファイルしか表示させないようにするといった場合もあり得るかと思います。

そんな時にはファイルの拡張子を調べて指定した拡張子のファイルしかリストさせないようにします。

そのためのイベントを一つ追加して、フロントパネルに置いた特定拡張子という文字列制御器のイベントを定義します。

例えば 以下のような方法での実装が考えられます。

本記事ではカスタマイズしたファイルダイアログを紹介しました。

元々ファイルダイアログを表示する関数は存在する中、「車輪の再発明」状態っぽくなっていますが、アクセスするディレクトリを制限するということを使用と思ったときに元々ある関数自体は改造ができないため、自力で用意するしかないため作ってみました。

ファイル操作や指定はアプリケーションによっては頻繁に行うことになると思うので、参考になればうれしいです。

ここまで読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました