#matlab #user-interface
#matlab #пользовательский интерфейс
Вопрос:
Я использую вспомогательный графический интерфейс для открытия основного графического интерфейса. В вспомогательном графическом интерфейсе кнопка позволяет пользователю выбирать файлы данных, которые они хотели бы загрузить. Первый файл обрабатывается отдельно, а затем передается в основной графический интерфейс с помощью setappdata
и getappdata
. Вот код для кнопки в вспомогательном графическом интерфейсе:
% --- Executes on button press in ManualMultiple.
function ManualMultiple_Callback(hObject, eventdata, handles)
% hObject handle to ManualMultiple (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[FileName,PathName,FilterIndex] = uigetfile('*.txt*','MultiSelect','on');
numfiles = size(FileName,2);
setappdata(0,'files',numfiles)
FileData= cell(1,numfiles);
for ii = 1:numfiles
FileName{ii};
A=[];
entirefile =fullfile(PathName,FileName{ii});
fid = fopen(entirefile);
tline = fgets(fid);
while ischar(tline)
parts = textscan(tline, '%f;');
if numel(parts{1}) > 0
A = [ A ; parts{:}' ];
end
tline = fgets(fid);
end
fclose(fid);
FileData{ii} = A;
A = FileData{ii};
X1 = A(:,1);
Y1 = A(:,5);
DataToUse{ii} = [X1, Y1];
end
FirstLoopX1Y1 = DataToUse{1};
X = FirstLoopX1Y1(:,1);
Y = FirstLoopX1Y1(:,2);
setappdata(0,'XValue',X)
setappdata(0,'YValue',Y)
for i = 2:numfiles
OtherLoopsXY = DataToUse{i};
X3 = OtherLoopsXY(:,1);
Y3 = OtherLoopsXY(:,2);
DataUseLater{i} = [X3,Y3]
end
setappdata(handles.ManualMultiple,'Data',DataUseLater)
GUImainwindow
Затем, когда я нажимаю кнопку в главном графическом интерфейсе, я должен получить данные, отправленные из подсистемы, для предварительных вычислений по этим данным. Вот код:
% --- Executes on button press in CalculateIntensity.
function CalculateIntensity_Callback(hObject, eventdata, handles)
% hObject handle to CalculateIntensity (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Trapz function
starting_value = getappdata(0,'StartValue');
ending_value = getappdata(0,'EndValue');
StartingValue = str2num(starting_value);
EndingValue = str2num(ending_value);
A = getappdata(0,'XYarray');
%line 122 and 123 finds location of data in the entire spectrum
[~,indx1]=ismember(StartingValue,A,'rows');
[~,indx2]=ismember(EndingValue,A,'rows');
arrayfortrapz = A(indx1:indx2,1:2);
setappdata(0,'arraytapz',arrayfortrapz);
[value,index] = max(arrayfortrapz(:,2)); %finds max intensity / peak value
PeakValue = arrayfortrapz(index,1);
handles.Peak_Value = PeakValue;
guidata(hObject,handles);
X1 = arrayfortrapz(1:end,1);
Y1 = arrayfortrapz(1:end,2);
AUC = trapz(X1,Y1); %intergration
str = num2str(AUC);
[s,v] = listdlg('PromptString','Calculated Intensity:','SelectionMode','single','ListString',str,'ListSize',[200 200]);
IntensityValue = str(s,:);
setappdata(0,'IV',IntensityValue);
DataUseLater = getappdata(handles.ManualMultiple,'Data')
Но когда я нажимаю эту кнопку в главном графическом интерфейсе, я получаю ошибки:
Reference to non-existent field 'ManualMultiple'.
Error in MichelleLaycockGUImainwindow>CalculateIntensity_Callback (line 207)
DataUseLater = getappdata(handles.ManualMultiple,'Data')
Может кто-нибудь сказать мне, как я мог бы решить эту проблему или даже помочь мне понять, где я ошибаюсь? Заранее спасибо
Ответ №1:
Что, если вы добавите guidata(hObject, handles) после этой строки:
setappdata(handles.ManualMultiple,'Data',DataUseLater)
в вашем главном окне? Похоже, что структура дескрипторов не обновлялась после создания дескрипторов.ManualMultiple
Комментарии:
1. Спасибо за вашу помощь, но нет, это не помогло, я получил ту же ошибку, что и раньше.