Matlab Guide GUI Listbox Переоценно исчезает с, казалось бы, устаревшим ошибкой
-
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
Собственность должна быть не пуста, т.е. есть какой-то содержание. Но он пуст по умолчанию, поэтому он должен всегда быть определен.
В всплывающем окне отображается (в списке выделен) элемент определяется двумя свойствами string
(как массив клеток строк) и value
(который 1
по умолчанию).
Принимая первый элемент в пустом массиве, очевидно, не работает, поэтому контроль не может быть оказан!
Ваш элемент управления ListBox - это один выбор - его свойства min
< max
а также value
скалярный и> 0. Listbox (но не всплывающее окно) может быть много выделения, если свойство min
> max
, в этом случае value
может быть массивом (который подразумевает также пустым) и пустым string
не будет вызывать проблемы.
Прочитайте помощь MatLab для свойств UICONTROL string, value, min, max, listboxtop
В праси
- Вы говорите, что это проявляется после редактирования с руководством. Руководство создает код сзади. После редактирования старого кода-позади иногда остается на месте.
- Иногда Matlab чувствителен к порядку внутри одного утверждения, то есть
set(hlist, 'value', 2, 'string', {'aa','bb'})
Находит наивноvalue
к2
доstring
Достаточно длинный и недействительный UIControl. - Matlab Buggy, каждая новая версия два раза в год удаляет старую и приносит новые ошибки. Если вы уверены, что режим отладки работает не так, как он должен, то это имеет место для поддержки MATLAB. У меня такой же код, работающий в виде M-Code, P-Code и Compicied Exe - тот же код ведет себя по-разному, в основном в том, как работает GUI.
Другие советы
По моему опыту эта ошибка чаще всего возникает, когда value
Свойство больше, чем количество записей в списке. Таким образом, всякий раз, когда вы вытесните список списка, вы должны обновить value
Свойство - установить его на 1 по соображениям безопасности.
Кроме того, проверьте отличные комментарии @Mikhail..