6

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
4

2 に答える 2

2

value私の経験では、このエラーは、プロパティがリストボックスのエントリ数よりも大きい場合に最も頻繁に発生します。したがって、リストボックスを再作成するときはいつでも、プロパティを更新する必要がありますvalue。安全上の理由から、プロパティを 1 に設定してください。

それ以外は、@Mikhailによる優れたコメントを確認してください。

于 2010-08-12T11:55:32.647 に答える
2

これは既知のプログラミング エラーであり、競合状態とは関係ありません。

これがどのように機能するかです:

ポップアップおよび単一選択リストのstringプロパティは、空であってはなりません。つまり、コンテンツが含まれている必要があります。ただし、デフォルトでは空であるため、常に定義する必要があります。

表示されるポップアップ (強調表示されたリスト内) では、項目はstring(文字列のセル配列として) とvalue(1既定では) の 2 つのプロパティによって定義されます。

空の配列の最初の要素を取得することは明らかに機能しないため、コントロールをレンダリングできません!

Listbox コントロールは単一選択です。そのプロパティはmin<maxであり、valueスカラーであり、>0 です。プロパティmin>maxの場合、リストボックス (ポップアップではありません) は複数選択できます。この場合value、配列 (空であることも意味します) にすることができ、空であってもstring問題は発生しません。

uicontrol プロパティの MATLAB ヘルプを読むstring, value, min, max, listboxtop

実際には

  • GUIDE で編集した後、それ自体が現れると言います。GUIDE はコード ビハインドを作成します。古いコード ビハインドを編集した後、そのまま残ることがあります。
  • 場合によっては、MATLAB は 1 つのステートメント内の順序に敏感です。つまり、十分な長さになる前に単純にset(hlist, 'value', 2, 'string', {'aa','bb'})設定し、uicontrol を無効にします。value2string
  • MATLAB にはバグがあり、年に 2 回の新しいバージョンごとに古いバグが削除され、新しいバグがもたらされます。デバッグ モードが正常に動作しないことが確実な場合は、MATLAB サポートのケースです。m-code、p-code、およびコンパイル済みの exe と同じコードを実行しています。主に GUI の動作において、同じコードの動作が異なります。
于 2010-08-12T08:47:39.690 に答える