配列要素の順番をドラッグで動かす

Tips

スポンサーリンク

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

  • 配列要素の順番をドラッグで動かす方法

を紹介しています。

LabVIEWの配列は、他のプログラミング言語での同様な仕組み(配列という名称ではなくリストと呼ばれるものもありますが)と同じく、その要素の番号を指標番号(index)で指定することで、特定の要素に対して取り出すや置換するなどといった操作をすることができます。

そのため、配列の指標番号というのは多くの場合その番号自体(順番)に意味があることが多いと思いますが、一方で特定の順番をずらす操作が必要になる場合(与えられた配列を意図的に任意に並び替える)もあると思います。

そもそもは番号自体に意味があるものなので容易にはずらせないことから、ずらせるようにするためにはそういったプログラムを組む必要があります。

ということで、プログラムを考えてみました。

今回は数字と文字列の配列を例にとっていますが、仕組みはどちらも同じなので、他のデータタイプの配列でも同様に実装できるはずです。

スポンサーリンク

どんな結果になるか

分かりやすくするために、数字や文字列は識別しやすい簡単な構造としています。

配列の中身を編集したい場合と、ドラッグ操作で中身を入れ替える操作を切り替えるためのブール(スイッチ動作)制御器を設けています。

このブール制御器がFalseの時には、いわゆるいつもの配列であり、ある要素の部分をクリックするとそこがハイライトされ、要素の中身を変えることができます。

ブール制御器がTrueになると、ドラッグ操作で値を好きな位置にずらすことができます。

このときには、クリックした要素自体は変更できないので注意します。

プログラムの構造

ドラッグしたり制御器の中でマウスを移動させたりといった操作が必要になるので、イベントストラクチャを使用しています。

今回は簡単のためにイベントストラクチャの中に具体的な処理コードを実装していますが、本来はイベントストラクチャの中でエンキューして別のループ中でデキューして処理を実装するようにするとより効率のいいプログラムとなります。

重要なのがループに入る前の部分で、配列のリファレンスを指定していくつかのプロパティを設定しています。

今回のプログラムでは、「どの配列要素が選択(クリック)されたか」が重要になります。それをドラッグ操作で動かすわけなので。

ただし、プロパティノードやイベントストラクチャでも、選択された配列要素の指標番号は取得できません。

せいぜい、配列のクリックされた座標をイベントストラクチャで取得できる程度です。

そこで、どの要素が選択されたかを、座標の情報から導くというアプローチをとります。

そのために、配列全体の大きさや、要素(制御器)の大きさ、表示されている列の数や、フロントパネル全体から見た時の配列そのものの座標の情報を駆使する必要があり、そのための処理を行っています。

これで、配列の大きさや位置が変わっても、同じプログラムを使い続けることができます。

イベントの中身に入っていきます。

配列のマウスダウンイベントで、どの要素が選択されたかという情報を抜き出します。

下の図の指標配列から得られているのは、選択された要素値そのものです。

これを調べるために、ループの外での演算結果と、イベントストラクチャの「座標.水平」のノードの値を使用して座標と要素番号を関連付けています。

なお、全体がケースストラクチャで囲われていますが、これは、フロントパネル上の「入れ替え有効?」のブール値の値を反映させています(後述)。

配列のマウス移動イベントでは、マウス移動によって現在のマウスの座標がわかるので、そこから「マウスダウンイベントで調べた配列要素を動かすかどうか」を決定しています。

二重になっているケースストラクチャの中に配列のローカル変数がありますが、これがないと見た目上要素がドラッグ操作によって移動している様子がわからなくなってしまいます。

配線がごちゃついているのですが、下の図の通りに配線してみてください。

マウスアップイベントでは、ブール値をFalseにしています。

このブール値はマウスダウンイベントでTrueになるものですが、これがTrueになっているときにマウス移動イベントが起こったときだけ上記のごちゃごちゃした演算を行います。

それ以外の(マウスダウンしていない状態)でいくらマウス移動イベントが発生しても(二重にあったケースストラクチャの外側のケースストラクチャがFalseの状態)何も起こらないようにしています。

停止ボタンの値変更イベントでは、このイベントストラクチャの入ったループを終了させています。

入れ替え有効のブールスイッチの値変更イベントでは、配列の無効プロパティの切り替えを行っています。

ここで、無効状態になるようにしておかないと、ドラッグ操作で配列の要素を入れ替えようにもうまくいきません。

ここまででプログラムの中身の説明は同じです。

他のデータタイプ、例えば文字列であっても構造は同じです。

縦方向の1次元配列の場合

上で紹介したのは横方向に伸びた1次元配列の場合ですが、値の取り方さえわかれば縦方向に伸びた1次元配列でも対応が可能です。

この場合には、今まで「水平」の座標を気にしていたところを「垂直」の座標に置きなおせばよく、具体的には以下の3つの赤枠の部分を変更してやるだけです。

2次元配列の場合

横、縦と値を取得して入れかえることができるということは・・・これらを組み合わせて2次元配列に対するプログラムも書けます。

既に紹介した、横長の1次元配列と縦長の1次元配列の場合のプログラムを組み合わせるだけです。

一番ややこしい、マウス移動イベントのみ紹介します(他のイベントの中身は既に紹介した1次元配列の場合を見ればそのままわかると思うので割愛)。

マウス移動イベントの中身がかなりごちゃごちゃしてしまっていますが、下の図を参考に組んでみてください。

全てのケースの中身は以下の図の通りです。

本記事では配列要素の番号をドラッグで動かす方法を紹介しました。

用途例としては少ないかもしれませんが、任意のデータの並び替えなど、ピンポイントで役に立てばうれしいです。

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

コメント

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