Список GUI MATLAB GUIDE периодически исчезает с, казалось бы, устаревшей ошибкой - PullRequest
6 голосов
/ 12 августа 2010

Я создаю простой графический интерфейс 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

Ответы [ 2 ]

2 голосов
/ 12 августа 2010

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

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

2 голосов
/ 12 августа 2010

Это известная ошибка программирования, которая не имеет отношения к состоянию гонки!

Вот как это должно работать:

Для всплывающих окон и списка с одним выбором string свойство должно быть не пустым, то есть иметь некоторое содержимое. Но по умолчанию он пуст, поэтому всегда должен быть определен.

В отображаемом всплывающем окне (в списке выделен) элемент определяется двумя свойствами string (в виде массива ячеек строк) и value (по умолчанию 1).

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

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

Прочитать справку MATLAB для свойств 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 - один и тот же код ведет себя по-разному, главным образом в том, как работает GUI.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...