08-24-2023 05:59 AM
先日、以下の様な質問をしました。
https://forums.ni.com/t5/LabVIEW/Buttons-that-remain-pressed/m-p/4322664
ボタンをタブキーで選択できるようにして、ボタンが選択されている状態でEnterキーを押したとき、ボタンがオンの状態のままになってしまうのだがどうしたら良いか、という内容です。
ボタンの機械的動作は「離されるまでスイッチ」にしていました。
そのトピックで頂いたアドバイス、
1. Changed the Mechanical Action to Latch When Released.
2. Edited the event for button1 to Value Change.
をもとに変更を行ったところ、問題は解決されている様にみえました。
しかし、そのトピックにアップしたVIのままではなぜ問題が起きるのか、上の様にしたらなぜOKなのかよくわかっていません。
教えていただけると有難いです。
解決済! 解決策の投稿を見る。
08-24-2023 08:16 AM
ご質問を共有していただきありがとうございます。
「ボタンが押されたまま(True)」になってしまうのと、「button1だとプログラムが停止しない」問題の二つが含まれているものと思われます。
後者のbutton1でイベントが駆動しないのは、イベントが「マウスアップ」であるためで、キーボードで操作すると「マウスアップ」のイベントが発生しないため、という点はよろしいでしょうか。変更点の二つ目の「値変更」イベントに変えるというのはこの部分に相当しています。
ボタンがオンの状態のままになってしまうのは奇妙ですね。他の5つの機械的動作では押されっぱなしにはなりません。「離されるまでスイッチ」のみが押されっぱなしになります。
おそらく以下のヘルプにヒントがあると思います。
ブールオブジェクトの機械的動作を変更する - NI
https://www.ni.com/docs/ja-JP/bundle/labview/page/changing-the-mechanical-action-of-a-boolean-object...
メモ
キーボードショートカットをブール制御器の機械的動作に指定する場合、キーボードは値を切り替えます。たとえば、ブール制御器の機械的動作をキーボードショートカットに割り当て、ラッチ型の機械的動作の1つに設定すると、読み取りの際ボタンのラッチが解除されます。
注目すべきは「キーボードは値を切り替えます」だと思います。「切り替え」であって「マウスでクリック」した動作とは等しくない、と私は解釈しました。そうすると「押されたら」「放されたら」「放されるまで」がことごとく無視されているのが妥当であるように思えます。
スイッチ動作をして元に戻そうとして「マウスクリック」をすると、今度は機械的動作が働きます。Trueの状態のブール制御器に対して、以下の挙動になっています。
「押されたらスイッチ」→マウス押下後にFalseへスイッチ
「放されたらスイッチ」→マウス押下→リリース後にFalseへスイッチ(見た目としてはわからないが
「放されるまでスイッチ」→マウス押下後ただちにFalseへスイッチし、リリース後にTrueへ戻る
これは、「放されるまでスイッチ」機械的動作だけが、「値が読み取られたかどうかにかかわらず元の状態に戻る」という特別な機械的動作であるから、ということに起因しているように思えます。
別スレッドで指摘があったように機械的動作は特殊なアプリケーション以外では「放されたらラッチ」、イベントは「値変更」が無難かと思います。
分かりにくい説明で恐縮ですが、ご不明な点はご質問ください。
08-24-2023 06:40 PM
ご説明いただき、有難うございます。
このあたりは経験の蓄積がないと挙動の予測が難しいですね。
自分の持つイメージでは、「値変更」という言葉からは、ボタン押して離すと、
・OFF→ON
・ON→OFF
の2回、イベント処理が起動しそうな気がしてしまいます。
押されたことによって「値変更」処理が起動され、ボタンが「放されたらラッチ」のとき読み取られたことによってOFFに戻され、そのときは「値変更」処理はされない、ということでよいのでしょうか。
08-25-2023 04:15 AM
仰る通り、値変更は「ラッチ」動作で読み取られた際に元の値に戻る動作、ならびに「放されるまでスイッチ」の放した際動作は含まれません。確かに言われてみるとこれも値変更として検出してもおかしくなさそうですね。あくまでユーザ操作による値変更、ということなのだと思います。
実際にハイライト実行をして挙動の確認をして頂くのが良いかと思います。
よろしくお願いします。
08-25-2023 09:48 AM
ちょっと面白そうなので参加します。私なりの理解ですが・・・
「放されるまでスイッチ」をマウスで操作することは、現実世界のモーメンタリースイッチを模擬したいときに使います。値変更イベントはマウスをクリックしたときと放したときに発生するので、それをトリガに動作ONとOFFを実行するようにコーディングします(みなさんご存じのとおり)。
ボタンをTabキーで選択してスペースまたはEnterキーを押すと値が切り替わりますが、キーを放したときには戻りません。もう一度キーを押すと戻ります。
マウスと同じ操作だとすればキーを放したときに戻ってほしい気もしますが、これだと不都合が生じます。なぜならキーを押しっぱなしにすることはキーリピートだからです。従ってキーをもう一度押すと戻るという動作は現実的な解だと思います。
「放されるまで」アクションにしたとき自動的にTabキー選択をスキップしてくれないのは、お節介すぎるのと、使いたい場面があるかもしれないからじゃないでしょうか。
サブVIのコネクタペーンに割り当てた制御器は自動スキップしてほしいケースが多いけど知らないうちにやられてるのも何だかなあ。
ちなみにエラー制御器とかはデフォルトでスキップになってますね。
無理やりやるなら添付VIみたいなのかな。IMEがONだとスペースキーは誤動作するかも。
08-31-2023 12:41 AM
J.H.Watsonさん、有難うございます。
お二人のおかげで、理解が深まりました。
直観には反しますが、現実的・実用上の理由があるというところでしょうか。
08-31-2023 07:43 AM
>直観には反しますが、現実的・実用上の理由があるというところでしょうか。
そう思います。
LabVIEWの制御器はTabキー選んでキーボードから数値入力や押下するほか、ショートカットキーを割り当てることもできます。
DOS時代のアプリではファンクションキーに機能を割り当てていました。その操作性を模擬できますが、最近のマルチウィンドウアプリでは対象のウィンドウが最前面にないとダメなので逆に使い勝手が悪いです。まあ画面をタッチしたほうが速いですし。
お客さんが古い操作性を希望することもあると思いますが、ユーザインタフェースは時代やOSの仕様も含めて最適化を模索したいです。
個人的には、意味の汲み取れないアイコンが並びそれをタップすると何が起こるか不明なUIが大嫌いです(苦笑)。