MatlabガイドGUIリストボックスは、一見陳腐化するエラーで断続的に消えます
-
27-09-2019 - |
質問
ガイドを使用して、簡単なMatlab GUIを構築しています。アイテムのリストボックスがあります。ほとんどの場合、それは期待どおりに機能しますが、時々(通常はガイドでフィギュアを編集した後)リストボックスを入力すると、このメッセージとともに消えます。
Warning: single-selection listbox control requires a scalar Value
Control will not be rendered until all of its parameter values are valid
この動作はデバッグを無視します!私がステップスルーするとき、それは期待どおりに機能します(私はそれが一種のスレッドレースか何かだと思います)。さらに、同一の条件下で、MATLAB環境を再起動した後、通常は消えます。
このエラーで見つかったすべてのドキュメントは、MATLABの以前/古代バージョン(R2010Aを使用しています)を参照しています。
このテーマに関するアイデアや情報は大歓迎です!
編集:ミハイルのおかげで、私は問題を解決したようです。今後の参照のために、ここにコードを投稿しています。
多くのデバッグ印刷とワイルドクリックの後、私は時々、選択したものをリストボックスに尋ねると、空の結果が得られることがわかりました。これやその他の問題は、物事を困惑させました。私はすべての執筆対話をリストボックスに集中機能に移し、テストコードを作成して、物事が必要な状態にとどまることを確認しました。
これは私自身の環境(R2010A)でテストされており、広範囲ではないことに注意してください。また、コードは少し冗長ですが、とにかく気分が良くなりました。 (すなわち。 itemcount
0未満にすることはできません...)
function ensure_listbox_ok(handles)
%check to make sure it does not suck - ask what it has
thestrings = get(handles.listbox_files, 'String');
selection = get(handles.listbox_files, 'Value');
itemcount = length(thestrings);
betterselection = selection;
if(itemcount <= 0)
betterselection = 1;
else
if(selection > itemcount)
betterselection = itemcount;
end
end
%never use zero!!!! even if 1 is out of bounds.
if(isempty(betterselection) || betterselection <= 0)
betterselection = 1;
end
%uncomment for debug logging
%display(['Was: ' num2str(selection) ', cleaned: ' num2str(betterselection)]);
%update if we are out of bounds.
if(isempty(selection) || betterselection ~= selection)
set(handles.listbox_files, 'Value', betterselection);
end
解決
これは既知のプログラミングエラーであり、人種の状態とは何の関係もありません!
これが機能する方法です:
ポップアップおよび単一選択リスト用 string
プロパティは空ではない必要があります。つまり、コンテンツがあります。ただし、デフォルトでは空です。したがって、常に定義する必要があります。
ポップアップに表示された(リスト内で強調表示されている)アイテムは2つのプロパティで定義されています string
(文字列のセルの配列として)および value
(これは 1
デフォルト)。
空の配列で最初の要素を取得しても明らかに機能しないため、コントロールをレンダリングすることはできません!
リストボックスコントロールは単一選択です - そのプロパティ min
< max
と value
スカラーと> 0です。 ListBox(ただし、ポップアップではありません)は、プロパティの場合はマルチセレクションになる可能性があります min
> max
, 、 この場合 value
アレイ(空のことを意味する)と空の可能性があります string
問題を引き起こしません。
UICONTROLプロパティのMATLABヘルプをお読みください string, value, min, max, listboxtop
プラクシスで
- あなたはそれがガイドで編集した後に現れると言います。ガイドはCode-Behindを作成します。古いCode-Behindを編集した後、時にはその場に残ります。
- 時々、matlabは1つのステートメント内の順序に敏感です。
set(hlist, 'value', 2, 'string', {'aa','bb'})
素朴に設定しますvalue
に2
前string
十分に長く、Uicontrolを無効にします。 - Matlabはバギーで、年に2回すべての新しいバージョンが古いものを削除し、新しいバグをもたらします。デバッグモードが必要ではないと確信している場合は、MATLABサポートの場合です。 M-Code、P-Code、コンパイルされたExeと同じコードが実行されています。同じコードの動作は、主にGUIの仕組みで異なって動作します。
他のヒント
私の経験では、このエラーはほとんどの場合、 value
プロパティは、リストボックスのエントリの数よりも大きいです。したがって、ListBoxを再駐在させるときはいつでも、 value
プロパティ - 安全上の理由から1に設定します。
それ以外は、優れたコメントを確認してください @mikhail.