2012-06-11 2 views
1

Я пишу программу OO gui, и у меня возникают проблемы с использованием функции set() для изменения свойств элемента GUI. Я просто пытаюсь сменить кнопки, чтобы включить свойство from off to on. Я приложил сокращенный код, показывающий ту же проблему ниже. То, как Matlab обрабатывает классы и т. Д., Кажется довольно странным, поэтому проблема может быть просто вызвана моим непониманием системы. Во всяком случае, когда я пытаюсь использовать функцию set() на handle AD.buttonExit, она работает как ожидалось, когда я выполняю команду в функции initUI(). Если я попытаюсь сделать то же самое в другой функции, он терпит неудачу. Я проверил стеки, просто распечатав контенты AD. В функции initUI оно явно показывает значение дескриптора для buttonExit, оно не находится в функции конструктора (или любой другой функции-члена). Я чувствую, что делаю элементарную ошибку, но я не вижу ее, и я надеюсь, что кто-то сможет мне помочь.GUI-дескрипторы в классах

- rfhigler

код (сокращенный для ясности):

classdef test 

    properties 
     AppUI; 
     buttonExit; 
    end 

    methods 
     function AD = test() 
      %draws UI 
      AD.initUI(); 
      set(AD.buttonExit, 'Enable', 'on') 
      AD.test2() 
     end 
     function initUI(AD) 
      AD.AppUI = figure('Visible','off','Position',[520,321,695,482], 'MenuBar', 'none', 'Name', '3D Particle Tracking',... 
       'NumberTitle', 'off', 'Resize', 'off', 'Color', [0.94,0.94,0.94]); 
      AD.buttonExit = uicontrol('Enable', 'off', 'Style', 'pushbutton', 'Visible', 'on', 'Position', [35,29,181,31], 'String', 'Exit'); 
      set(AD.AppUI, 'Visible', 'on'); 
      %1 set(AD.buttonExit, 'Enable', 'on') 
     end 
     function test2(AD) 
      set(AD.buttonExit, 'Enable', 'on') 
     end 
    end 
end 
+0

Не могли бы вы добавить образец кода, где странное поведение имеет место? Кстати. как первое предположение, у меня был бы класс, наследующий класс 'handle'. – bdecaf

ответ

1

классы Matlab немного странный: по умолчанию, они "значение" классы вместо "осилить" классы. Разница описана here.

Вкратце, чтобы ваш класс расширял класс handle, он будет вести себя так, как вы ожидали бы от других языков OO. Просто измените строку определения класса на

classdef test < handle 
0

Поскольку вы обновили AD в initUI, вы должны вывести обновленную переменную. Итак, вам необходимо изменить следующие строки:

function initUI(AD) в function AD = initUI(AD)

и, в рамках теста функции():

AD.initUI(); к AD = AD.initUI();

Смежные вопросы