Руководство MATLAB gui listbox периодически исчезает с кажущейся устаревшей ошибкой

Я создаю простой графический интерфейс MATLAB с помощью руководства. У меня есть список элементов. В большинстве случаев он работает так, как ожидалось, но иногда (обычно после редактирования фигуры с помощью руководства) заполнение списка заставляет его исчезнуть вместе с этим сообщением:

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).

любые идеи или информация по этому вопросу были бы весьма признательны!


EDIT: благодаря Михаилу, я, кажется, решил проблему. Я размещаю свой код здесь для дальнейшего использования.

после большого количества отладочной печати и дикого щелчка я обнаружил, что иногда, когда вы спрашиваете listbox, что выбран, вы получаете пустой результат. Из-за этой и других проблем все пошло наперекосяк. Я переместил все свои письменные взаимодействия в список в централизованную функцию и написал тестовый код, чтобы гарантировать, что все останется так, как должно быть.

обратите внимание, что это было протестировано в моей собственной среде (на 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

2 ответов


это известная ошибка программирования, и она не имеет ничего общего с состоянием гонки!

вот как это должно работать:

для popup и один-список выбора string свойство должно быть не-пустым, т. е. иметь некоторый контент. Но он пуст по умолчанию, поэтому он должен быть всегда определен.

во всплывающем окне отображается (в списке выделено) элемент определяется двумя свойствами string (как ячейка массива строк) и value (т. е. 1 по умолчанию.)

взятие первого элемента в пустом массиве, очевидно, не работает, поэтому элемент управления не может быть отображен!

ваш элемент управления Listbox является одинарным выбором-его свойства min max и value является скалярным и >0. Listbox (но не всплывающее окно) может быть множественным выбором, если свойство min>max в этом случае value может быть массивом (что подразумевает также пустой) и пустой string не вызовет проблем.

прочитайте справку MATLAB для свойства элементов графического интерфейса string, value, min, max, listboxtop

на практике

  • вы говорите, что он проявляется после редактирования с помощью руководства. Руководство создает код позади. После редактирования старый код-за иногда остается на месте.
  • иногда MATLAB чувствителен к порядку внутри одного оператора, т. е. set(hlist, 'value', 2, 'string', {'aa','bb'}) наивно наборы value to 2 до string достаточно долго и делает недействительным uicontrol.
  • MATLAB глючит, каждая новая версия дважды a год удаляет старые и приносит новые ошибки. Если вы уверены, что режим отладки работает не так, как должен, то это случай для поддержки MATLAB. У меня такой же код работает как m-код, p-код и скомпилированный exe - тот же код ведет себя по-разному, в основном в том, как работает GUI.

по моему опыту, эта ошибка чаще всего возникает, когда value свойство больше, чем количество записей в списке. Таким образом, всякий раз, когда вы повторно заполняете список, вы должны обновить value свойство-установите его в 1 по соображениям безопасности.

кроме этого, проверьте отличные комментарии @Mikhail.