Matlab Guide GUI Listbox Переоценно исчезает с, казалось бы, устаревшим ошибкой

StackOverflow https://stackoverflow.com/questions/3465082

Вопрос

Я строю простую 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..

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top