Как создать динамические обратные вызовы в MATLAB? - PullRequest
5 голосов
/ 06 декабря 2010

У меня есть эта строка кода:

delete_btn = uicontrol(rr_ops, 'Style', 'pushbutton', 'String', 'Delete Graphic', 'Position', [13 135 98 20], ...
'Callback', 'delete_graphic');

и немного выше этой функции:

function delete_graphic
global rr_list
selected = get(rr_list, 'Value');
selected
return;

почему этот код не работает?Я действительно не понимаю ...

Что мне нужно?Я создаю одну кнопку и список, нажимая кнопку - удаляя выбранный элемент из списка.

Спасибо за помощь.

PS Всегда получаю эту ошибку:

??? Undefined function or variable 'delete_graphic'.
??? Error while evaluating uicontrol Callback

вот весь мой код: http://paste.ubuntu.com/540094/ (строка 185)

1 Ответ

10 голосов
/ 06 декабря 2010

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

Это также объясняетошибка, которую вы получаете.Функция delete_graphic определяется как подфункция в вашем файле rr_intervals.m.Подфункции могут вызываться только другими функциями, определенными в том же m-файле, поэтому delete_graphic не отображается в базовой рабочей области (где оценивается ваш обратный вызов строки).Использование обратного вызова дескриптора функции является лучшей альтернативой.Вот как бы вы это сделали:

  • Измените обратный вызов вашей кнопки (строка 216) с 'delete_graphic' на @delete_graphic.
  • Измените определение функции *От 1022 * (строка 185) до:

    function delete_graphic(hObject,eventdata)
    

    , где hObject - дескриптор объекта, выполняющего обратный вызов, а eventdata - необязательные данные, предоставляемые при выполнении обратного вызова.

РЕДАКТИРОВАТЬ:

Если вы хотите передать другие аргументы в delete_graphic, вы можете выполнить следующие шаги:

  • Добавьте дополнительные входные аргументы в конец определения функции.Например:

    function delete_graphic(hObject,eventdata,argA,argB)
    
  • Используйте массив ячеек при установке обратного вызова для своей кнопки, где первая ячейка содержит дескриптор функции, а каждая последующая ячейка содержит входной аргумент.Например:

    set(delete_btn,'Callback',{@delete_graphic,A,B});
    

    Существует одно предупреждение: значения A и B, хранящиеся в массиве ячеек, фиксируются на том же уровне, что и при установке обратного вызова..Если вы измените A или B в своем коде, не изменит значения, сохраненные в обратном вызове массива ячеек.

Если вы этого не сделаетевозможность использовать вышеуказанное решение (т. е. если A и B необходимо изменить значение), есть несколько других вариантов того, как вы можете обмениваться данными между обратными вызовами графического интерфейса :

  • Вы можете переделать организацию своего кода, чтобы использовать вложенных функций .Это позволяет очень легко обмениваться данными между обратными вызовами.Несколько хороших примеров использования вложенных функций для создания графических интерфейсов можно найти в MathWorks File Exchange представление Примеры графических интерфейсов с использованием вложенных функций от Стивен Лорд .
  • Вы можете хранить данные в свойстве UserData объекта uicontrol.Чтобы получить к нему доступ или обновить его, вам просто нужен дескриптор объекта.
  • Вы можете использовать функции SETAPPDATA / GETAPPDATA , чтобы прикрепить данные к графическому объекту дескриптора (например, uicontrol).
  • Поскольку кажется, что ваш код был создан с использованием GUIDE, вы можете использовать структуру handles, которую GUIDE создает для хранения данных с использованием функции GUIDATA .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...