Я создаю простой графический интерфейс MATLAB с использованием GUIDE. У меня есть список элементов. В большинстве случаев это работает, как и ожидалось, но иногда (обычно после того, как я редактирую рисунок с помощью 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