WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

GUI---->speichern und laden

 

xPashAx
Forum-Guru

Forum-Guru


Beiträge: 294
Anmeldedatum: 18.05.09
Wohnort: Heidelberg
Version: ---
     Beitrag Verfasst am: 13.04.2011, 14:03     Titel: GUI---->speichern und laden
  Antworten mit Zitat      
Hi leute ein nächstes problem was bestimmt simple ist.
Code:
handles.punkte=[2 3 4 5 .....; 3 4 5 5......];

die möchte ich jetzt im ws durch einen button speichern
Code:

function SpeichernTag_Callback(hObject, eventdata, handles)
.......
 

... danach sollte ich wieder die möglichkeit haben, mit einem button die wieder zu laden
Code:

function LadenTag_Callback(hObject, eventdata, handles)
.......
 


wie geht das?

vielen dank
Private Nachricht senden Benutzer-Profile anzeigen


Peter Quint
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 95
Anmeldedatum: 21.02.11
Wohnort: Lübeck
Version: R2010b
     Beitrag Verfasst am: 18.04.2011, 14:31     Titel:
  Antworten mit Zitat      
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
Code:
guidata(hObject, handles);

eintippen damit die Veränderungen Deiner handles in der GUI erhalten bleiben.

Wenn Du die Daten speichern möchtest um sie z.B. beim Neustart Deines Programmes zu haben, gib doch einfach mal
Code:

und
Code:

in Matlab ein. So kannst Du z.B. .mat-Dateien erzeugen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Peter Quint
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 95
Anmeldedatum: 21.02.11
Wohnort: Lübeck
Version: R2010b
     Beitrag Verfasst am: 18.04.2011, 14:33     Titel:
  Antworten mit Zitat      
Ganz frisch, könnte Dich auch interessieren:
http://www.gomatlab.de/globale-vari.....-ws-schreiben-t11247.html
Private Nachricht senden Benutzer-Profile anzeigen
 
rumus001
Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 04.04.14
Wohnort: NRW
Version: R2013a 32Bit
     Beitrag Verfasst am: 21.05.2014, 15:03     Titel:
  Antworten mit Zitat      
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;

 

und beim Neustart meines GUI dann

Code:

load Dateiname;
set(handles.edit_1, 'String', edit_1);

 
usw ..... es sind aber sehr viele Editierfenster und der Code wird irgendwann immer unübersichtlicher :(

oder gibt es da elegantere Varianten ähnlich dem Befehl
Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
rumus001
Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 04.04.14
Wohnort: NRW
Version: R2013a 32Bit
     Beitrag Verfasst am: 23.05.2014, 12:09     Titel:
  Antworten mit Zitat      
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?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 23.05.2014, 12:41     Titel:
  Antworten mit Zitat      
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')
 
end
save('hier_pfad_und_dateiname', 'savevalue')



% Wiedereinlesen in der OpeningFcn

fields4read = {'edit1','edit2','edit3'}

X= load('hier_pfad_und_dateiname')
if isfield(X, 'savevalue')
  for k=1:length(fields4read )
     if isfield(handles, fields4read{k})
       set(handles.(fields4read{k}), 'String', savevalue.(fields4read{k}) )
     end
  end
end


 


Zuletzt bearbeitet von denny am 23.05.2014, 12:46, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.05.2014, 12:43     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
rumus001
Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 04.04.14
Wohnort: NRW
Version: R2013a 32Bit
     Beitrag Verfasst am: 23.05.2014, 15:12     Titel:
  Antworten mit Zitat      
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')

 


zum Laden so:
Code:

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')
if isfield(X, 'savevalue')
  for k=1:length(fields4read )
     if isfield(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:
Code:

fields4read =

    'a_horizontal'    'b_horizontal'

X =

    savevalue: [1x1 struct]

Undefined variable "savevalue" or class
"savevalue.a_horizontal".

Error in GUI>BUTTON_BENUTZERDATEN_LADEN_Callback (line
1912)
       set(handles.(fields4read{k}), 'String',
       savevalue.(fields4read{k}) )

Error in gui_mainfcn (line 96)
        feval(varargin{:});

Error in GUI (line 20)
    gui_mainfcn(gui_State, varargin{:});

Error in
@(hObject,eventdata)GUI('BUTTON_BENUTZERDATEN_LADEN_Callback',hObject,eventdata,guidata(hObject))

 
Error while evaluating uicontrol Callback

 


Was mache ich falsch?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 23.05.2014, 15:58     Titel:
  Antworten mit Zitat      
Hallo

nein, da hast du nichts falsch gemacht, ich habe einen Fehler gemacht, habe eine Zeile vergessen

Code:

fields4read = {'a_horizontal','b_horizontal'}

X= load('Benutzerdaten')

if isfield(X, 'savevalue')
 % diese Zeile habe ich vergessen
 savevalue = X.savevalue;
 for k=1:length(fields4read )
     if isfield(handles, fields4read{k})
       set(handles.(fields4read{k}), 'String', savevalue.(fields4read{k}) )
     end
  end
end
 



Zitat:
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
draussen
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 26.11.10
Wohnort: DE
Version: 2010b,2020a
     Beitrag Verfasst am: 23.05.2014, 21:39     Titel:
  Antworten mit Zitat      
Hallo,

ggf. macht es Sinn die gui umzustricken und die vielen editierfenster durch eine
Code:
zu ersetzen?

Dann könnte man das so machen:

Code:
[file,path]=uiputfile('Save data');

data=get(handles.uitable,'data');


save(fullfile(path,file),'data');


und zum laden entsprechend

Code:
[file,path]=uigetfile('Load data');

set(handles.uitable,'data',data);

 


Da
Code:
vom typ cell ist, kann man in einer Zelle alles mögliche speichern.

MfG
_________________

Der Einäugige ist unter den Blinden der König!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
rumus001
Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 04.04.14
Wohnort: NRW
Version: R2013a 32Bit
     Beitrag Verfasst am: 18.07.2014, 14:41     Titel:
  Antworten mit Zitat      
draussen hat Folgendes geschrieben:
Hallo,

ggf. macht es Sinn die gui umzustricken und die vielen editierfenster durch eine
Code:
zu ersetzen?

Dann könnte man das so machen:

Code:
[file,path]=uiputfile('Save data');

data=get(handles.uitable,'data');


save(fullfile(path,file),'data');


und zum laden entsprechend

Code:
[file,path]=uigetfile('Load data');

set(handles.uitable,'data',data);

 


Da
Code:
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:
Code:

Undefined function or variable 'data'.

Error in
LightSim>MENU_DATEI_BENUTZER_LADEN_Callback (line
1241)
set(handles.uitable1,'data',data);

Error in gui_mainfcn (line 96)
        feval(varargin{:});

Error in LightSim (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in
@(hObject,eventdata)LightSim('MENU_DATEI_BENUTZER_LADEN_Callback',hObject,eventdata,guidata(hObject))

 
Error while evaluating uimenu Callback
 


Mein Code sieht dabei so aus:

Code:

function MENU_DATEI_BENUTZER_SPEICHERN_Callback(hObject, eventdata, handles)
[file,path]=uiputfile('Save data');
data = get(handles.uitable1,'data');
save(fullfile(path,file),'data');
% --------------------------------------------------------------------


% --------------------------------------------------------------------
function MENU_DATEI_BENUTZER_LADEN_Callback(hObject, eventdata, handles)

[file,path]=uigetfile('Load data');
set(handles.uitable1,'data',data);

% Alle GUI-Daten aktualisieren:
    guidata(hObject, handles);
 



Hat jemand einen Tipp für mich wie es klappen könnte?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.07.2014, 16:24     Titel:
  Antworten mit Zitat      
Hallo,

uigetfile gibt nur den Dateinamen und -pfad zurück, laden musst du die Daten dann noch selbst:

Code:


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
rumus001
Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 04.04.14
Wohnort: NRW
Version: R2013a 32Bit
     Beitrag Verfasst am: 22.07.2014, 08:11     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

uigetfile gibt nur den Dateinamen und -pfad zurück, laden musst du die Daten dann noch selbst:

Code:


Grüße,
Harald


Na klar, diese Zeile fehlte natürlich bei meinem Code noch.
Danke Harald!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.