GUIDEを使用して簡単なMATLABGUIを構築しています。アイテムのリストボックスがあります。ほとんどの場合、期待どおりに機能しますが、(通常はGUIDEで図を編集した後)リストボックスにデータを入力すると、次のメッセージとともにリストボックスが消えることがあります。
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