Как отобразить сообщение об ошибке в графическом интерфейсе? - PullRequest
1 голос
/ 17 февраля 2011

Хе Гайз.Мне нужна помощь с этим.У меня есть фигура стола.Пользователь вставит данные в таблицу.Если пользователь неожиданно неправильно введет данные, таблица будет «NaN».У меня вопрос, как я хочу, чтобы таблица не отображала «NaN» на таблице, но я хочу, чтобы появилось сообщение об ошибке.У меня есть эта кодировка:

function Mytable1_CreateFcn(hObject, eventdata, handles)

if isnan(Mytable1)

set(hObject, 'Data', 0);

errordlg('Input must be a number','Error');

end

handles.Mytable2 = hObject;

guidata(hObject,handles);

Но есть ошибка с этим кодом.Является ли эта кодировка правильной для ответа на мой вопрос?

Обновление:

Я сделал эту кодировку на Mytable1_CellEditCallback.Это все еще есть ошибка.Этот код правда?

Mytable1=get(hObject,'Data')

if isnan(Mytable1)

set(hObject, 'Data', 0);
h=errordlg('Oh noes!','Error');
set(h, 'WindowStyle', 'modal');
uiwait(h);
return
end

handles.Mytable2 = hObject;
guidata(hObject,handles);

Это ошибка:

Mytable1 =

[1]    []    []
 []    []    []
 []    []    []
 []    []    []

???Неопределенная функция или метод 'isnan' для входных аргументов типа 'cell'.

Ошибка в ==> fyp_editor> Mytable1_CellEditCallback на 795, если ~ isnan (Mytable1)

Ошибка в ==> gui_mainfcnв 96 feval (varargin {:});

Ошибка в ==> fyp_editor в 42 gui_mainfcn (gui_State, varargin {:});

Ошибка в ==> @ (hObject, eventdata) fyp_editor ('Mytable1_CellEditCallback', hObject, eventdata, guidata (hObject))

???Ошибка при оценке пригодного CellEditCallback

Ответы [ 2 ]

1 голос
/ 13 мая 2015
if isnan(Mytable1)

Mytable - это массив ячеек. Попробуйте это:

if any(isnan(cell2mat(Mytable1)))

Однако, если есть более простой способ, обратный вызов редактирования ячейки получает два входа: вызывающий объект и данные события (и обрабатывает в руководстве). В eventdata есть следующие поля:

  • Индексы: массив размером 1 на 2, содержащий индексы строк и столбцов ячейки, отредактированной пользователем.

  • PreviousData: данные предыдущей ячейки. По умолчанию используется пустая матрица, [].

  • EditData: введенная пользователем строка.

  • NewData: значение, которое MATLAB записало в массив свойств Data. Это то же самое, что EditData или преобразованное значение. Свойство NewData будет пустым, если MATLAB обнаружит ошибку во введенных пользователем данных.

  • Ошибка: сообщение об ошибке возвращается, если MATLAB обнаруживает ошибку во введенных пользователем данных. Свойство Error становится пустым, когда MATLAB успешно записывает значение в свойство Data. Если свойство Error не пустое, то CellEditCallback может отображать строку или пытаться решить проблему.

Источник: http://ch.mathworks.com/help/matlab/ref/uitable-properties.html#zmw57dd0e748724

С NewData или Error это должно быть возможно для обработки ошибок.

например:

MyTable_CellEditCallback(hObj,event,handles)

if isempty(event.NewData)
    h=errordlg('Oh noes!','Error');
    set(h, 'WindowStyle', 'modal');
    uiwait(h);
    return
end

% The rest of the function
end
1 голос
/ 18 февраля 2011

В этом коде есть несколько ошибок. Позвольте мне сосчитать пути.

  1. function Mytable1_CreateFcn(hObject, eventdata, handles)

    Функция создания выполняется при создании объекта, то есть при построении графического интерфейса. Это никогда не выполняется иначе, и, таким образом, это функция, которую вы редко когда-либо захотите изменить. То, что вы хотите изменить, это Mytable1_Callback

  2. if isnan(Mytable1)

    Mytable1 не был определен внутри функции. Таким образом, эта строка выдаст вам ошибку. Может быть, вы хотели добавить строку Mytable1=get(hObject,'Data')? Кроме того, поскольку Mytable1 является массивом ячеек, необходимо проверить элементы на наличие NaN, используя cellfun, то есть запись if any(cellfun(@isnan,Mytable1(:))).

  3. set(hObject, 'Data', 0);

    Эта строка, скорее всего, в порядке.

  4. errordlg('Input must be a number','Error');

    Хотя эта строка не является ошибкой, она не будет работать так, как задумано - появляется сообщение, но функция продолжает выполняться. Либо вы должны написать error('input must be a number), либо написать h=errordlg('Oh noes!');uiwait(h);return

  5. end

    Смотри, другая строка в порядке!

  6. handles.Mytable2 = hObject; guidata(hObject,handles);

    При этом вы перезаписываете ручку на Mytable2, а ручкой на Mytable1. Это действительно то, что вы хотите?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...