08-10-2015 03:46 AM
いつもお世話になります、toffyと申します。
コントロール同士が重なった際に使用する前面・背面設定をプログラム中で設定することは可能でしょうか
現在画面上にボタンを33個表示しており、それらをクラスタとして扱っています(ボタン1、ボタン2・・・ボタン33という形です)。
今回の改修作業でそれらの一つ一つの座標(Left, Top)をcsvファイルから読み取り座標設定することになりました。
取り込んだ座標値で希望の位置に表示する事はできたのですが、ボタン同士が同じ座標で重なった場合に
ボタンの数値が小さい方を優先して前面に表示するようにしたいと思います。
最初はプロパティに書き込めるだろうと思っていたのですが、それらしいプロパティがない事に気づきました。
また、全てのボタンを座標値に移動した後、
「一度全てのボタンのVisibleをFalseにして、ボタン33から降順でVisibleをTrueにする。」という方法も試してみたのですがダメでした。
(ボタン1とボタン2を同一座標に設定すると、ボタン2が押せる形になってしまいます)
ご存じの方がいらっしゃいましたらよろしくお願い致します。
解決済! 解決策の投稿を見る。
08-10-2015 09:40 AM
toffy様
制御器の前面、背面へ移動のメソッドは「パネル」のメソッドです。
「パネル」のリファレンスは、「VI」のプロパティから取得します。
移動したい制御器を「選択」プロパティで選んでから、パネルの「選択範囲を前面へ移動」などを実行します。
この操作にはVIスクリプトが必要です。オプションでVIスクリプトを有効にしてください。
ツール>オプション>VIサーバ>VIスクリプト で設定してください。
また、このメソッドはVIの実行中は使えないので、対象の制御器があるVIのリファレンスを開いて操作します。
制御器をどのように選択するかが考えどころです。
08-10-2015 07:24 PM
KONDOH様、返信ありがとうございます。
コントロールのプロパティではなく、パネルのメソッドだったのですね。
下名はLabVIEWでメソッドを使用したことが無いのですが、MoveSelectionToFrontは
「選択状態のコントロールを最前面に移動する」メソッドということですね。選択範囲を最前面に移動
また、実行中はMoveSelectionToFrontを実行できないということは、VIを開く際に設定しておく必要があるということでしょうか。
ということは途中で順序を変更することは難しいのですね。
(今回は幸い、優先順位を途中で変更することは無いのですが勉強になります。)
制御器の選択に関してはボタンの名称などで判断して設定し、
今後の改修に備えて、同じ名前のオブジェクトを作成しないよう注意書きを残しておく形にしようと思います。
取り急ぎの返信で申し訳ありません、今から実際に試してみて再度返信させて頂こうと思います。
08-10-2015 07:43 PM
toffy様
制御器の順番を変えたいVIはファイルパスから”開く”のですが、”実行”はしません。
止まっている状態で、別のVIからリファレンスを用いて操作するという形式です。
実行中に変更するには離れ業が必要です。
順番を変えたいVIを、Panel.vi
順番を変えるVIを、Script.vi とします。
Panel.viは、Script.viを動的に実行し、終了を待たずにPanel.viは終了して閉じます。
立ち上がったScript.viは、Panel.viを開き制御器の操作メソッドを実行します。
操作が完了した後に、今度はScript.viが、Panel.vi動的に実行し、終了を待たずに終了して閉じます。
こんな手順で処理を行う事でVIスクリプトで様々な処理を実装できます。
お試しください。
08-10-2015 10:29 PM
こんにちは。
「一度全てのボタンのVisibleをFalseにして、ボタン33から降順でVisibleをTrueにする。」という方法も試してみたのですがダメでした。
(ボタン1とボタン2を同一座標に設定すると、ボタン2が押せる形になってしまいます)
二つ以上のボタンが重なっていても、一つだけがVisibleになっていれば問題なく動作すると思います。
ですので、それぞれのボタン座標を比較して、同一のものがあれば一つだけがVisibleになるように設定するのはいかがでしょうか。
ちなみに座標が重なる可能性があるというのは、どんなUI を想定されているんでしょうか。
08-10-2015 11:13 PM
KONDOH様、追伸ありがとうございました
現在、最初に教えて頂いた方法で実装を試みているのですが1点わからない点があります。
添付の図を参照していただければと思うのですが、PnlメソッドのMoveSelectionToFrontが選択できないのです…。
下名の開発環境がバージョン13.0f2ですので、もしかして対応していない?とも思ったのですが
MoveSelectionToFrontメソッドのヘルプが2012でしたので恐らく別の原因だと思います。
質問ばかりで申し訳ないのですが、選択できない原因に心当たりがありましたら教えて頂いても良いでしょうか。
宜しくお願い致します。
以下、図の補足です。
※請負改修という形ですので、固有名詞は置き換えさせて頂きました。
設定により、起動する画面が異なり、またボタンクラスタの存在しない画面もあるため左部の判定を入れています。
前面背面を設定するボタンは33個昇順でボタンクラスタにまとめられており、数値の小さい方を優先的に前面にするため、ボタンクラスタ制御器[]を逆転させて使用しています。
08-10-2015 11:30 PM
doradorachan様、返信ありがとうございます。
>二つ以上のボタンが重なっていても、一つだけがVisibleになっていれば問題なく動作すると思います。
これは気が付きませんでした(見た瞬間、ハッとする思いでした)、実装も簡単ですし良いアイデアですね。
恐らく先方が運用される時はボタン同士が重なることは無いと思います。
ぴったり重なることはもちろん、ボタンの一部が重なる事もないとは思うのですが
書類に「数値の小さい順で前面に配置される」と記載されているためコーディング上は想定する事になりそうです。
また、ボタンの一部が重なった時に数値の大きいものが前面に出てくる点と
ボタン以外のコントロールに重なった際もボタンを前面にする(こちらは説明不足でした、申し訳ありません)
という制約があるため今回は別の方法を探してみようと思います。
とはいえ、今後のプログラミングにとても有効なアイデアで勉強になりました。ありがとうございます。
08-11-2015 12:33 AM
08-11-2015 06:09 AM
08-11-2015 07:09 PM
KONDOH様
お手数だなんてとんでもないです、最初にバージョンを明記しなかったこちらの不手際ですので…
こちらこそ、お手数おかけして申し訳ありませんでした。
今後もスクリプト関連で調査をしていこうと思います、ありがとうございました。