Как добавить свои собственные переменные в структуру дескрипторов из моей собственной функции? - PullRequest
0 голосов
/ 29 апреля 2011

У меня есть вопрос к гуру MATLAB здесь ..

Итак, вот мой код (здесь показаны только строки кода, которые имеют отношение к проблеме):

mainProcess(hObject, handles)

handles.Checkpoint2 =1;
guidata(hObject, handles);

function testGUI1_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;
handles.Checkpoint1 = 1;
mainProcess(hObject, handles);
handles.Checkpoint3 = 1; //EDIT: Checkpoint2 is also not visible at this line
guidata(hObject, handles);
handles.Checkpoint4 = 1;


function saveAndContinueButton_Callback(hObject, eventdata, handles)

(breakpoint here) --> faceDatabase(handles.currentImageIteration).lookingTowardsCamera=handles.lookingAtCamera;

Итак, в приведенном выше коде я создаю эти «контрольные точки» в разных частях кода и вижу, какие из них видны при отдельном нажатии кнопки «Сохранить и продолжить» ... Checkpoint1 создается ДО вызова моей пользовательской функции mainProcess, Checkpoint2 создается в коде mainProcess, а Checkpoint3 создается ПОСЛЕ того, как mainProcess завершает выполнение, и элемент управления возвращается с вызывающей его функцией, которая testGUI1_OpeningFcn ... И Checkpoint4 создан WITHIN testGUI1_OpeningFcn, но ПОСЛЕ того, как структура дескрипторов обновляется в коде testGUI1_OpeningFcn ..

Итак, мой вопрос заключается в следующем: когда кнопка нажата, и я вижу, что видно в этой точке, контрольные точки 1 и 3 видны для кода обратного вызова кнопки, но контрольные точки 2 и 4 НЕ видны ... Я понимаю, что Checkpoint4 не виден, потому что он был создан ПОСЛЕ того, как структура дескрипторов была обновлена ​​в коде testGUI1_OpeningFcn ... Но почему Checkpoint2 не виден, даже когда в конце кода mainProcess я поставил строку:

guidata(hObject, handles);

Я имею в виду, что функция mainProcess получает ссылки как на hObject, так и на дескрипторы, поэтому она должна иметь доступ к записи, верно?

Так почему же Checkpoint2 не виден для кода обратного вызова кнопки ..?

Есть какие-нибудь подсказки?

РЕДАКТИРОВАТЬ: Я только что попытался увидеть, видна ли Checkpoint2 даже в вызывающей функции mainProcess, сразу после того, как элемент управления возвращается вызывающей стороне, и даже там Checkpoint2 не видна (см. EDIT в приведенном выше коде) ..

Ответы [ 2 ]

3 голосов
/ 31 января 2012

Это верно, вам нужно вызвать guidata, чтобы обновить имеющуюся у вас переменную хэндлов.Однако guidata нуждается в аргументе.Я думаю, что правильная команда будет:

handles = guidata(hObject);  

. Вы можете найти эту ссылку полезной:

http://www.mathworks.com/matlabcentral/answers/10197-guidata-doesn-t-work-the-way-i-expected-it-to

0 голосов
/ 29 апреля 2011

Я полагаю, вам нужно добавить следующее сразу после вызова mainProcess ()

handles = guidata();

В общем случае структура 'handles' передается по значению в функцию guidata (),Следовательно, mainProcess () не может изменить структуру дескрипторов - просто присоедините существующую структуру к дескриптору.Прежде чем вносить дальнейшие изменения, вам необходимо вернуть его обратно (с помощью handles = guidata ()), обновить его и установить заново с помощью guidata (h, handles).

Дайте мне знать, если это недостаточно ясно (илипросто не работает:)

Редактировать

Вам нужно изменить код следующим образом:

function testGUI1_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;
handles.Checkpoint1 = 1;
mainProcess(hObject, handles);
handles = guidata();   // <--- new line

handles.Checkpoint3 = 1; //EDIT: now checkpoint2 will be visible here
guidata(hObject, handles);

handles.Checkpoint4 = 1;
guidata(hObject, handles); // Otherwise Checkpoint4 will not be bound to hObject
...