NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

プログラム中での前面・背面設定

解決済み
解決策を見る

いつもお世話になります、toffyと申します。

 

コントロール同士が重なった際に使用する前面・背面設定をプログラム中で設定することは可能でしょうか

 

 

現在画面上にボタンを33個表示しており、それらをクラスタとして扱っています(ボタン1、ボタン2・・・ボタン33という形です)。

今回の改修作業でそれらの一つ一つの座標(Left, Top)をcsvファイルから読み取り座標設定することになりました。

 

取り込んだ座標値で希望の位置に表示する事はできたのですが、ボタン同士が同じ座標で重なった場合に

ボタンの数値が小さい方を優先して前面に表示するようにしたいと思います。

 

最初はプロパティに書き込めるだろうと思っていたのですが、それらしいプロパティがない事に気づきました。

また、全てのボタンを座標値に移動した後、

「一度全てのボタンのVisibleをFalseにして、ボタン33から降順でVisibleをTrueにする。」という方法も試してみたのですがダメでした。

(ボタン1とボタン2を同一座標に設定すると、ボタン2が押せる形になってしまいます)

 

ご存じの方がいらっしゃいましたらよろしくお願い致します。

0 件の賞賛
メッセージ1/14
5,672件の閲覧回数

toffy様

 

制御器の前面、背面へ移動のメソッドは「パネル」のメソッドです。

 

「パネル」のリファレンスは、「VI」のプロパティから取得します。

移動したい制御器を「選択」プロパティで選んでから、パネルの「選択範囲を前面へ移動」などを実行します。

 

 

この操作にはVIスクリプトが必要です。オプションでVIスクリプトを有効にしてください。

ツール>オプション>VIサーバ>VIスクリプト で設定してください。

 

また、このメソッドはVIの実行中は使えないので、対象の制御器があるVIのリファレンスを開いて操作します。

制御器をどのように選択するかが考えどころです。

 

 

Discuss20150810.png

メッセージ2/14
5,629件の閲覧回数

KONDOH様、返信ありがとうございます。

 

コントロールのプロパティではなく、パネルのメソッドだったのですね。

 

下名はLabVIEWでメソッドを使用したことが無いのですが、MoveSelectionToFrontは

「選択状態のコントロールを最前面に移動する」メソッドということですね。選択範囲を最前面に移動

 

また、実行中はMoveSelectionToFrontを実行できないということは、VIを開く際に設定しておく必要があるということでしょうか。

ということは途中で順序を変更することは難しいのですね。

(今回は幸い、優先順位を途中で変更することは無いのですが勉強になります。)

 

制御器の選択に関してはボタンの名称などで判断して設定し、

今後の改修に備えて、同じ名前のオブジェクトを作成しないよう注意書きを残しておく形にしようと思います。

 

 

取り急ぎの返信で申し訳ありません、今から実際に試してみて再度返信させて頂こうと思います。

0 件の賞賛
メッセージ3/14
5,588件の閲覧回数

toffy様

 

制御器の順番を変えたいVIはファイルパスから”開く”のですが、”実行”はしません。

止まっている状態で、別のVIからリファレンスを用いて操作するという形式です。

 

実行中に変更するには離れ業が必要です。

順番を変えたいVIを、Panel.vi

順番を変えるVIを、Script.vi とします。

 

Panel.viは、Script.viを動的に実行し、終了を待たずにPanel.viは終了して閉じます。

立ち上がったScript.viは、Panel.viを開き制御器の操作メソッドを実行します。

操作が完了した後に、今度はScript.viが、Panel.vi動的に実行し、終了を待たずに終了して閉じます。

こんな手順で処理を行う事でVIスクリプトで様々な処理を実装できます。

 

お試しください。

0 件の賞賛
メッセージ4/14
5,582件の閲覧回数

こんにちは。



「一度全てのボタンのVisibleをFalseにして、ボタン33から降順でVisibleをTrueにする。」という方法も試してみたのですがダメでした。

(ボタン1とボタン2を同一座標に設定すると、ボタン2が押せる形になってしまいます)


二つ以上のボタンが重なっていても、一つだけがVisibleになっていれば問題なく動作すると思います。

ですので、それぞれのボタン座標を比較して、同一のものがあれば一つだけがVisibleになるように設定するのはいかがでしょうか。

 

ちなみに座標が重なる可能性があるというのは、どんなUI を想定されているんでしょうか。

メッセージ5/14
5,540件の閲覧回数

KONDOH様、追伸ありがとうございました

 

現在、最初に教えて頂いた方法で実装を試みているのですが1点わからない点があります。

添付の図を参照していただければと思うのですが、PnlメソッドのMoveSelectionToFrontが選択できないのです…。

 

下名の開発環境がバージョン13.0f2ですので、もしかして対応していない?とも思ったのですが

MoveSelectionToFrontメソッドのヘルプが2012でしたので恐らく別の原因だと思います。

 

質問ばかりで申し訳ないのですが、選択できない原因に心当たりがありましたら教えて頂いても良いでしょうか。

 

しくお願い致します。

 

以下、図の補足です。

※請負改修という形ですので、固有名詞は置き換えさせて頂きました。

設定により、起動する画面が異なり、またボタンクラスタの存在しない画面もあるため左部の判定を入れています。

前面背面を設定するボタンは33個昇順でボタンクラスタにまとめられており、数値の小さい方を優先的に前面にするため、ボタンクラスタ制御器[]を逆転させて使用しています。

0 件の賞賛
メッセージ6/14
5,523件の閲覧回数

doradorachan様、返信ありがとうございます。

 

>二つ以上のボタンが重なっていても、一つだけがVisibleになっていれば問題なく動作すると思います。

これは気が付きませんでした(見た瞬間、ハッとする思いでした)、実装も簡単ですし良いアイデアですね。

 

恐らく先方が運用される時はボタン同士が重なることは無いと思います。

ぴったり重なることはもちろん、ボタンの一部が重なる事もないとは思うのですが

書類に「数値の小さい順で前面に配置される」と記載されているためコーディング上は想定する事になりそうです。

 

また、ボタンの一部が重なった時に数値の大きいものが前面に出てくる点と

ボタン以外のコントロールに重なった際もボタンを前面にする(こちらは説明不足でした、申し訳ありません)

という制約があるため今回は別の方法を探してみようと思います。

 

とはいえ、今後のプログラミングにとても有効なアイデアで勉強になりました。ありがとうございます。

0 件の賞賛
メッセージ7/14
5,516件の閲覧回数

※自身で調査した事を記載致します。

 

どうやら、パネルメソッドがMoveSelectionToFrontを持つのはLabVIEW2014からだと思われます。

2013ヘルプ2014ヘルプ

 

LabVIEW2013でも他のクラスで使用できるものがあるかもしれませんので、そちらについて調査しようと考えています。

0 件の賞賛
メッセージ8/14
5,479件の閲覧回数

toffy様

 

ご指摘ありがとうございます。

 

確かに「選択範囲を最前面へ移動」スクリプトはLabVIEW2014からの機能です。

お手数をおかけしました。

 

新しいVIスクリプトオブジェクト

0 件の賞賛
メッセージ9/14
5,453件の閲覧回数

KONDOH様

 

お手数だなんてとんでもないです、最初にバージョンを明記しなかったこちらの不手際ですので…

こちらこそ、お手数おかけして申し訳ありませんでした。

 

今後もスクリプト関連で調査をしていこうと思います、ありがとうございました。

0 件の賞賛
メッセージ10/14
5,437件の閲覧回数