2014-10-21 2 views
0
function pushbutton8_Callback(hObject, eventdata, handles) 
EndDate = handles.EndDate 
StartDate = handles.StartDate 
if exist('EndDate') 
    if exist('StartDate') 
     if(datenum(EndDate,'yyyy/mm/dd')<datenum(StartDate,'yyyy/mm/dd')) 
      StartDateEarlierThanEndDate 
     else 
      Correct 
     end 
    else 
     makesureboth 
    end 
end 

EndDateStartDate이 사용자에 의해 선택 될 uicontrol에 존재 말할 수 있습니다. EndDateStartDate보다 빠른 경우 "StartDate가 EndDate보다 이전이어야합니다"라는 GUI가 나타납니다. 사용자가 EndDate 또는 StartDate만을 선택하면 "StartDate와 EndDate를 모두 선택하십시오"라는 GUI가 나타납니다. EndDateStartDate은 또 다른 uicontrol에서 유래합니다.matlab에 GUI는 어떻게 변수 모두

사용자가 StartDateEndDate을 모두 선택하지 않으면 오류 Reference to non-existent field 'EndDate' 또는 Reference to non-existent field 'StartDate'가 표시됩니다. 나는이 오류의 원인을 알고 있지만 그것을 해결하는 방법을 모른다.

+0

논리적 인 단락과 함께 isfield입니다. – chappjc

답변

1

EndDate=handles.EndDate을 수행하기 전에 handles.EndDate이 있는지 확인한 후 EndDate이 없으면 실패합니다. 어쩌면 다음의 라인을 따라 뭔가 : @ 데이비드의 대답하는 대신

function pushbutton8_Callback(hObject, eventdata, handles) 
if ~isfield(handles,'EndDate') || ~isfield(handles,'StartDate') 
    % if either EndDate or StartDate do not exist, call makesureboth 
    makesureboth 
else % both variables exist 
    if(datenum(handles.EndDate,'yyyy/mm/dd')<datenum(handles.StartDate,'yyyy/mm/dd')) 
     StartDateEarlierThanEndDate 
    else 
     Correct 
    end 
end 
+0

나는 단지 '존재한다'라고 말하려고했다. ;) +1 지금! – chappjc

+0

당신의 의견을보기 전까지는'exist'가 구조체에서 작동하지 않는다는 것을 깨닫지 못했습니다! 왜 안된다 고 확신 할 수 있습니까? – David

+0

'exist'에 뭔가를 넘겨 주면 문자열입니다. 즉, "."앞에 구조체의 이름을 구문 분석해야합니다. 'isfield'를 단독으로 실행하십시오. 중첩 된 구조체 또는 비 스칼라 구조체에 대해 생각하기 시작할 때 웜이 될 수 있기 때문에 아마 구현하지 않았을 것입니다. 또한 모든 것을 전달하는 데 약간의 오류가 발생할 수 있습니다. false가 다시 발생하면 struct가 존재하지 않았거나 필드 또는 둘 중 하나를 의미합니까? – chappjc

0

은 또한 STARTDATE 및 종료 날짜를 입력하는 데 사용되는 uicontrol에 직접 확인하여 필드의 존재 여부를 확인하는 수고를 덜 수있다 (나는 그것이 편집 상자라고 생각한다?).

푸시 버튼의 콜백 시작 부분에 확인 단계를 추가하고 입력 한 날짜가 유효한지, 계속 진행 중인지 확인하십시오. 나중에 사용자가 올바른 값을 입력했는지 확인하는 데 문제가 생길 수 있습니다. 그건 당신의 질문에 직접 대답하지 않지만 그것은 논평의 길이 너무 길었습니다 :)