Verfasst am: 05.02.2013, 10:29
Titel: Close button funktioniert nicht
Hallo allerseits
Es tut mir leid euch mit meinen Dummheiten von der Arbeit abzubringen, aber ich habe wieder Verständnis Problem ;
Ich habe das Programm geschrieben, was, für die Eingabe, das GUI aufruft. GUI ist mit GUIDE erstellt und hat ein close button, um das Fenster zu beenden wenn man, zum Beispiel, anderes überleg hat und das Programm einfach beenden will.
Das Problem ist; mit dem Code:
Code:
function Exit_Callback(hObject, ~, handles) delete(handles .figure1)
Kriege ich Fehlermeldung von OutputFcn; Attempt to reference field of non-structure array.
Was nichts anderes bedeutet, dass das GUI beim Schließen die Nutzer-Eingaben dem Hauptprogram übergeben will. Es sind aber keine gemacht. Wenn ich aber die Eingaben gemacht habe und dann auf Exit drücke, wird die Auswertung regulär gestartet. Dafür sollte aber nur Start-Taste zuständig sein.
Ich füge hier nicht gesamt GUI-Code, zu viele Zeilen.
Code:
%% --- Executes just before gui is made visible function OpeningFcn(hObject, ~, handles, varargin) % paths initialisation
initpath = pwd;
handles.path = initpath;
handles.testprofpath = initpath;
handles.analysepath = initpath;
handles.resultspath = initpath;
handles.AddText = get(handles.AddTxt,'String');
set(handles.pathtestprof,'String',fullfile(handles.path,'StdP'));
set(handles.pathdatanls,'String',handles.path);
set(handles.pathresults,'String',handles.path);
% axes(hObject); imshow('Conti_logo.jpg');
guidata(hObject, handles);
uiwait(hObject)
%% --- Outputs from this function are returned to the command line. functionvarargout = OutputFcn(hObject, eventdata, handles)
i = 1;
ifisfield(handles, 'path') varargout{i} = handles.analysepath; % return path info to comand line
i = i + 1;
end ifisfield(handles, 'sID') varargout{i} = handles.sID; % return sensor IDs to comand line
i = i + 1;
end ifisfield(handles, 'param') varargout{i} = handles.param; % return parameter setings for alnalysis
i = i + 1;
end ifisfield(handles, 'resultspath') varargout{i} = handles.resultspath; % return parameter setings for alnalysis
i = i + 1;
end ifisfield(handles, 'AddText') varargout{i} = handles.AddText; % return addition text
i = i + 1;
end delete(handles.figure1)
%% --- Executes when user attempts to close figure1. function CloseRequestFcn(hObject, ~,handles)
ifisequal(get(hObject, 'waitstatus'), 'waiting') % The GUI is still in UIWAIT, us UIRESUME uiresume(hObject);
setappdata(hObject,'waiting',0) else % The GUI is no longer waiting, just close it delete(hObject);
end
Verfasst am: 05.02.2013, 10:50
Titel: Re: Close button funktioniert nicht
Hallo FeLe,
Bitte erkläre noch, in welcher Zeile der Fehler erscheint.
Welchen Wert und Typ hat denn handles, wenn der Fehler auftritt? Ein einfaches DISP oder "dbstop if error" erlauben dies genau herauszufinden.
Häufig wird "handles" nicht vollständig an die Callbacks übergeben, da hier der Wert des Structs zu dem Zeitpunkt der Erstellung des Callbacks verwendet wird. Dann wäre ein Update sinnvoll:
Code:
function Exit_Callback(hObject, ~, handles)
handles = guidata(hObject)
Verfasst am: 05.02.2013, 11:13
Titel: Close button funktioniert nicht
Der Fehler tritt in der Zeile; delete(handles.figure1) in OutputFcn. Irgendwie ist die figure, zu dem Zeitpunkt des Aufrufs von OutputFcn, schon gelöscht .
Verfasst am: 05.02.2013, 11:22
Titel: Close button funktioniert nicht
Ich verstehe nicht das ganze Mechanismus dahinter. Ich dachte, dass OutputFcn wird nur dann aufgerufen, wenn ich mein GUI regulär, mit Start-Taste, beende. In der Matlab-Hilfe steht; at each iteration. Wie baue das Ganze um, dass die OutputFcn nur dann aufgerufen wird, wenn ich tatsächlich Rückgabe-Wert habe und in allen anderen Fällen das Fenster einfach geschlossen wird?
dann dürften zumindest die anderen Callbacks nicht abgefragt werden, solange du nicht auf den Pushbutton drückst. Ob das mit der Outputfunction auch funktioniert, weiß ich nicht. Probier es mal aus.
das testet, ob es ein "handles.m" File im Matlab Pfad gibt, eine Java Funktion, ein Ordner im aktuellen Pfad, eine Variable, etc. Einerseits kann das Suchen sehr lagnsam sein, andererseits liefert es oft unerwartete Treffer. Besser:
Prinzipiell wollte ich sage: Figure schon weg? > So what?
Try-Catch - Block ohne Fehlerbehandlung tuts zum Beispiel auch.
Bei höherer Komplexität sollte man der Sache dann schon auf den Grund
gehen aber um das schnell zu richten gehts.
Gruß
Blues
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.