Список GUI MATLAB GUIDE периодически исчезает с, казалось бы, устаревшей ошибкой

Я создаю простой графический интерфейс 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
6
задан Andras Deak 26 January 2016 в 16:50
поделиться