Ich sehe das Problem nicht.
Du hast doch die Daten in der Handles-stuctur gespeichert. Kann es sein, dass Du deine Structure nicht in Deiner GUI speicherst?
Am Ende Deiner Funktionen solltest Du
Ich habe ein ähnliches Problem wie der Threadstarter.
Allerdings möchte ich nicht die Variablen abspeichern und beim GUI Start wieder da haben sondern die Werte der vielen Editierfenster die ich in meinem GUI habe...
Bleibt mir nichts anderes übrig als für jedes Fenster manuell einen Code zu speichern etwa so (so würde ich es zumindest probieren wollen):
Code:
function edit_1Callback (hObject, eventdata, handles)
edit_1 = get(handles.edit_1, 'String');
edit_1 = num2str(edit_1);
save Dateiname;
Kann denn wenigstens jemand sagen wie man ein handle z.B. String eines edit-Objekts abspeichern kann um beim neustart des GUI den alten String wieder zu laden?
Hallo
ich würde das Abspeichern der Felder an einer Stelle machen und zwar beim Schließen der GUI(in eigenen GloseReqFcn) und das Laden in der OpeningFcn
Du kommst so oder so nicht rum eigene Routine fürs Einlesen und das Abspeichern zu schreiben. Deswegen kannst du als Variablen z.B. die Tags der Handle-Felder benutzen.
irgendwie so:
Code:
% Abspeichern z.B. in CloseRequest aber bevor das Fenster gelöscht wird
fields4save = {'edit1','edit2','edit3'} for k=1:length(fields4save )
savevalue.(fields4save{k}) = get(handles.(fields4save{k}), 'String')
X= load('hier_pfad_und_dateiname') ifisfield(X, 'savevalue') for k=1:length(fields4read ) ifisfield(handles, fields4read{k}) set(handles.(fields4read{k}), 'String', savevalue.(fields4read{k})) end end end
ich würde statt eines Callbacks für jedes edit-Fenster einen Pushbutton erstellen (alternativ: Menüführung, Kontextmenü, CloseRequestFcn).
Im Callbacks dieses Pushbuttons werden alle relevanten Infos wie Strings in editierbaren Textfeldern ausgelesen und in einer .mat-Datei gespeichert.
Bei Bedarf (Neustart der GUI, Knopfdruck, was auch immer) werden die Informationen aus der .mat-Datei geladen und in die entsprechenden Elemente der GUI geschrieben.
Eine automatisierte Lösung dafür ist mir nicht bekannt.
Ungefähr wie Harald es vorgeschlagen habe ich es auch vor umzusetzen.
Habe dafür zwei Pushbttons zum Laden und Speichern im GUI angelegt.
Die codes sehen so aus, zum Abspeichern:
Code:
function BUTTON_BENUTZERDATEN_SPEICHERN_Callback(hObject, eventdata, handles) % hObject handle to BUTTON_BENUTZERDATEN_SPEICHERN (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Abspeichern z.B. in CloseRequest aber bevor das Fenster gelöscht wird
fields4save = {'a_horizontal','b_horizontal'} for k=1:length(fields4save )
savevalue.(fields4save{k}) = get(handles.(fields4save{k}), 'String') end save('Benutzerdaten', 'savevalue')
function BUTTON_BENUTZERDATEN_LADEN_Callback(hObject, eventdata, handles) % hObject handle to BUTTON_BENUTZERDATEN_LADEN (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Wiedereinlesen in der OpeningFcn
fields4read = {'a_horizontal','b_horizontal'}
X= load('Benutzerdaten') ifisfield(X, 'savevalue') for k=1:length(fields4read ) ifisfield(handles, fields4read{k}) set(handles.(fields4read{k}), 'String', savevalue.(fields4read{k})) end end end
Es wird beim Abspeichern eine Datei namens "Benutzerdaten.mat" (wie vorgesehen) angelegt. Darin befindet sich ein Struct namens savevalue ist es so gewollt von dir danny? Im savevalue sind die beiden handles "a_horizontal" und "b_horizontal" mit entsprechenden Strings so wie ich diese auch im GUI eingegeben habe. Also schon mal i.O. wie ich denke oder?!
Sorry ich habe sehr wenig Erfahrung mit Matlab-Programmierung und wenn ich ehrlich bin verstehe ich nicht 100% was der von "denny" vorgeschlagener Code macht.
Jedenfalls habe ich folgende Fehlermeldungen im Command Window:
ifisfield(X, 'savevalue') % diese Zeile habe ich vergessen
savevalue = X.savevalue;
for k=1:length(fields4read ) ifisfield(handles, fields4read{k}) set(handles.(fields4read{k}), 'String', savevalue.(fields4read{k})) end end end
Darin befindet sich ein Struct namens savevalue ist es so gewollt von dir danny?
Ja ich wollte nicht zig Variablen haben, sondern diese beim Speichern erstmal in einer Struct sammeln, SAVE ist dann einfacher zu formulieren.
Beim Laden kann ich dann auch prüfen ob ich die Datei mit richtigen Variablen geladen habe, Das ist auch einfacher als wieder viele Variablen zu haben.
vom typ cell ist, kann man in einer Zelle alles mögliche speichern.
MfG
Ich habe nun in einem anderen Projekt deinem Rat gefolgt und die vielen Benutzerdaten einer GUI in eine "uitable" abgelegt.
Die Daten werden ohne Probleme gespeichert, das prüfe ich durch Abrufen der gespeicherten Datei manuell durch Doppelclick auf diese im Explorer. Darauf hin habe ich im Workspace die variable data mit entsprechenden Werten.
Das laden funktioniert leider nicht.
Folgende Meldung wird angezeigt:
Na klar, diese Zeile fehlte natürlich bei meinem Code noch.
Danke Harald!
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.