Руководство 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
to2
доstring
достаточно долго и делает недействительным uicontrol. - MATLAB глючит, каждая новая версия дважды a год удаляет старые и приносит новые ошибки. Если вы уверены, что режим отладки работает не так, как должен, то это случай для поддержки MATLAB. У меня такой же код работает как m-код, p-код и скомпилированный exe - тот же код ведет себя по-разному, в основном в том, как работает GUI.
по моему опыту, эта ошибка чаще всего возникает, когда value
свойство больше, чем количество записей в списке. Таким образом, всякий раз, когда вы повторно заполняете список, вы должны обновить value
свойство-установите его в 1 по соображениям безопасности.
кроме этого, проверьте отличные комментарии @Mikhail.