この記事で扱っていること
- 実行中に制御器や表示器の位置をドラッグして変更する方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
LabVIEWは、ユーザーインタフェースを作成しやすいプログラミング環境と言えます。
プログラムを作り始める初期段階で、どの制御器や表示器がどの位置にあって、といったレイアウトを決定でき、ユーザーの使いやすさも意識しながらプログラムを組むことができます。
ただ、プログラム実行中に何らかの理由で表示位置を変更したいという場合もあると思います。
LabVIEW以外のウィンドウも表示させる必要があり、位置がかぶってしまうといった不都合があることから特定の制御器や表示器の位置をずらしたい、といった場合に、そのままでは実行中にこれらを動かすことはできないため、プログラム的に位置を動かす方法を考えます。
実はこのプログラムには元ネタがあり、サンプルファインダのサンプルとベースは全く同じで、扱っているデータタイプが異なるだけです。
どんな結果になるか
よく使用されるであろうデータタイプについて適当に配置したフロントパネルを例にとります。

実行中に、これらの位置をドラッグ操作で任意の場所に動かすことができます。

当然これは値が更新されている表示器にも応用でき、例えば常に値を更新し続けているチャートを移動させるようなこともできます。

プログラムの構造
元ネタにしたサンプルは、LabVIEWのツールバーのヘルプから「サンプルを検索」で開くNIサンプルファインダから見つけることができます。
以下の図の場所にある、ダイナミックイベントを生成のサンプルを見てみます。

このサンプルでは、特定の対象(サンプルではピクチャ)にマウスダウンした時だけ、マウス移動イベントが有効になるように、動的にイベントを定義し、マウスアップイベント時にはマウス移動イベントを検出しなくなるようになります。

これの応用で、動かしたい対象の制御器や表示器について同じような要領でマウスダウン、マウスアップイベントを定義してやります。
制御器の例の場合のプログラムは以下のようにします。

マウス移動のイベントにて、プロパティノードを使用して位置を変更します。
既にマウスダウンイベントでどの制御器や表示器に対してマウスダウンしたかのラベル名を取得しているため、ケースストラクチャで場合分けして各制御器、表示器に対してプロパティノードを指定するだけです。

マウスアップしたらマウス移動イベントに対して定数を配線するのはサンプルの作り通りです。

チャートの方のプログラムは以下のようにします。
例として見せるためにチャートに適当な乱数を表示させた状態としていますが、実際には表示させたいデータをチャートに配線してください。

他のイベントの中身も先ほど紹介したものと一緒です。

途中で動かすのを制限する場合
上のプログラム、移動させたくない時にもドラッグ操作をしてしまい動いてしまうということが起こりえます。
また、制御器の場合にちゃんと値を入力できない状態になりえます(ブールなど)。
そのため、プログラム的に移動操作を受け付けないようにする工夫も必要です。
あるスイッチ動作のボタンがTrueになっている場合はドラッグ操作を受け付けない、という設定にする場合には以下のように実装します。
要は、マウスダウンイベントの際にケースストラクチャを使用してイベント登録そのものを行わせないようにする、ということですね。

本記事では、実行中に制御器や表示器の位置をドラッグして変更する方法を紹介しました。
LabVIEWの性質上、ユーザーインタフェースはあらかじめ決められていることが多いためあまり活躍する機会はない処理かもしれませんが、「実行中の移動は全くできません」ということではなく、やりようはある、ということの参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント