6

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

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: спасибо Михаилу, я, кажется, решил проблему. Я отправляю свой код здесь для дальнейшего использования.

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

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

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

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

Read MATLAB Help для UIControl свойств string, value, min, max, listboxtop

В праксисе

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

Привет, Михаил, спасибо за ответ! Мне все еще нужна дополнительная информация. Вы говорите, что список по умолчанию пуст, но НЕ должен быть пустым ... как это работает? Почему это работает для меня иногда, но не все время? Почему я не могу отладить эту ошибку? Я вполне уверен, что следую всем рекомендациям по этому uicontrol, и все же SOMETIMES падает на меня, в одинаковых условиях. Спасибо за помощь! – eli

+0

Благодарим вас за отличные советы. Вы, очевидно, очень опытны в этом. Вы указали мне в правильном направлении, и теперь я делаю список вещей более тщательно. Я отправляю еще один ответ с моим кодом, но вы получаете приз =) – eli

2

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

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