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

Rückgabewert der CloseFunction

 

stealth_mx
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 05.02.2015, 14:16     Titel: Rückgabewert der CloseFunction
  Antworten mit Zitat      
Hallo zusammen, ich habe ein Problem mit dem Rückgabewert eines GUI.

Ich habe ein GUI in der ich ein neues Fenster öffne und diesem einen Wert übergebe.

Hier ist die Funktion in der MainGUI
Code:

function buttonStart_Callback(src,~)
h = guidata(src);
h.wert= Uebergabefunktion(h.wert);
guidata(src,h);


Dieser kann in dem neuen Fenster manipuliert werden und soll beim schließen des neuen Fensters zurückgebeben werden.
Das neue Fenster kann auf zwei Wege geschlossen werden. Einmal mit einem Button und einmal über das Kreuz. Wenn es über das kreuz geschlossen wird, soll der Wert sich nciht ändern.(dh. Manipulation ist zwecklos). Wird er hingegen über den Button geschlossen soll er den neuen Wert übergeben.

Das neue Fenster hat folgenden Aufbau:

Code:
function output = Uebergabefunktion(wert)
%Neues Fenster
f = figure(...);
%Neues Struct
lh = guihandles(f);

lh.wert = wert;

%Vorläufiger Rückgabewert
output = wert;

%Objekte
uicontrol('style','button',...'callback',@button);
lh.EditBox = uicontrol('Style','edit',...)

%Speichern des Structs
guidata(f,lh);

%warte auf das Schließen
uiwait(gcf);

%MEINE LOESUNG MIT FEHLER
lh = guidata(f);
output = lh.wert;

function button(src,~)
lh = guidata(src);
lh.wert = get(lh.EditBox,'String');
guidata(src,lh);
uiresume(gcf);
 


Damit kann ich erfolgreich den manipulierten Wert zurückgeben. Aber wenn ich nun das X drücke dann bekomme ich einen Fehler, "H must be the Handle of...". Ich kann diesen Fehler nachvollziehen. Denn wenn ich über X die CloseRequestFcn starte, dann wird die Löschung des Fensters eingeleitet, ohne uiresume zu setzen. (So denke ich das, ich weiß leider nicht wo ich die Default CloseRequestFcn ansehen kann.)

Ich denke ich muss die Wertübergabe auf jeden Fall erst in der Closefunction ausführen. Dann ist es theoretisch egal woher der Call kommt. Button oder X.

Weiß zufällig einer wie es richtig anstellen muss? Mit dem GUIDE wäre es kein Problem aber ich habe die Funktionen selbst programmiert.
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.02.2015, 14:40     Titel: Re: Rückgabewert der CloseFunction
  Antworten mit Zitat      
Hallo stealth_mx,

Ich habe noch nicht verstanden, was genau Deine Frage ist.

Zitat:

Damit kann ich erfolgreich den manipulierten Wert zurückgeben. Aber wenn ich nun das X drücke dann bekomme ich einen Fehler, "H must be the Handle of...". Ich kann diesen Fehler nachvollziehen.

Ist das ein Teil des Problems? dann poste bitte die vollständige Fehlermeldung. Was genau ist "X"?

Zitat:
(So denke ich das, ich weiß leider nicht wo ich die Default CloseRequestFcn ansehen kann.)

Code:
FigH = figure;
set(FigH)
get(FigH)


Zitat:
Ich denke ich muss die Wertübergabe auf jeden Fall erst in der Closefunction ausführen. Dann ist es theoretisch egal woher der Call kommt. Button oder X.

Das verstehe ich nicht.

Bitte erkläre das Problem nochmal genauer.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 05.02.2015, 15:22     Titel:
  Antworten mit Zitat      
Hallo das Problem ist ganz einfach.

Beispiel:

Rechte Maustaste auf irgendeinen Ordner. Dann Eigenschaften. Jetzt kann ich z.B Schreibgeschüzt anhacken. Wenn ich nun X drücke werden die Eigenschaften verworfen. Wenn ich OK oder übernehmen drücke werden sie hingegen gespeichert. Öffne ich das Fenste nocheinmal so sehe das Schreibgeschützt aktiviert ist. Das ist alles. Genau sowas will ich realisieren.

Meine Umsetzung ist:

Übergabe der alten Werte an das neue Fenster. Dieses Fenster ließt sie aus und gibt mir die akutellen Parameter auf dem Fenster aus. Diese können nun manipuliert werden. Wenn ich übernehmen klicke werden diese neuen an meinen Hauptgui zurückgegeben. Wenn ich hingegen X klicke möchte ich einfach die Manipulation verwerfen. Und da die Funktion etwas zurück liefern muss, übergebe ich halt genau die, die ich ihr auch beim Aufruf gegeben habe. D.h. ich speichere die Manipulation nicht.

Wenn ich ohne Übergabe arbeite (d.h mit guidata oder setappdata etc) dann ist das kein Problem. Dann habe ich den eindeutigen Fall, dass wenn ich auf den Button Übernehmen klicke, die Einstellungen gespeichert werden, wenn ich einfach so das Fenster schließe, dann werden sie nicht gespeichert. Ich möchte es aber mit dem Übergeben lösen. Ich weiß leider nicht wie man es sauber allgemein löst. Also ob man lieber die Werte übergibt oder das sich das Fenster einfach die Einstellungen selbst aus dem Speicher holt.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 05.02.2015, 16:00     Titel:
  Antworten mit Zitat      
Hallo

da muss du die CloseRequestFcn mit deiner eigener Funktion überlagern,
also so

Code:

function output = Uebergabefunktion(wert)
%Neues Fenster
f = figure(...);
set(f, 'CloseRequestFcn', @my_close)
...
...

function my_close(src, ~)
uiresume(gcf);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.02.2015, 16:06     Titel:
  Antworten mit Zitat      
Hallo stealth_mx,

Zitat:
Rechte Maustaste auf irgendeinen Ordner. Dann Eigenschaften.

Lass mich raten: Du arbeitest also mit Windows? Und unter Windows meinst Du mit "X" den "Schließen"-Button des Fensters?
Für Dich ist das offensichtlich, aber die Leser können ja nicht durch Deine Augen gucken.

Zitat:
Übergabe der alten Werte an das neue Fenster.

Und hier verstehe ich schon die Frage nicht mehr. Wie soll das übergeben werden? In Deinem Beispiel wird das Flag ja im File-System gespeichert. Wo soll die Einstellung in Deinem Fall gespeichert werden? Es gäbe da z.B. Matlab's PREFDIR, wo man ein File für den aktuellen Benutzer speichern kann. Oder soll das auch für andere Benutzer gelten? Und soll es nur in der akutellen Matlab-Session erhalten bleiben, oder auch nach einem Neustart des Rechners?

Zitat:
Wenn ich übernehmen klicke

Ich nehme an, Du meinst einen Button, auf dem "Übernehmen" steht.

Zitat:
Und da die Funktion etwas zurück liefern muss, übergebe ich halt genau die, die ich ihr auch beim Aufruf gegeben habe.

Unklar.

Zitat:
Wenn ich ohne Übergabe arbeite (d.h mit guidata oder setappdata etc) dann ist das kein Problem.

Auch unklar. Wenn es kein Problem ist, mache es doch einfach so.
Zitat:
Ich möchte es aber mit dem Übergeben lösen.

Was meinst Du mit "Übergeben"? Und wieso ist das nützlicher?

Mir wird das eigentliche Problem immer noch nicht klarer.
Könntest Du einfach ein UIRESUME in die CloreRequestFcn und/oder DeleteFcn Callbacks der Figure schreiben?

Viele Grüße, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 05.02.2015, 16:09     Titel:
  Antworten mit Zitat      
Hi, ja das kenne,

allerdings funktioniert dann der button nicht mehr. Wenn ich in Myclose uiresume mache dann mache ich doch nach dem uiwait weiter? Nach dem uiwait würde ich meinen output "bedaten" also:

ich würde mein Struct aktualisieren und anschließen in den output schreiben.

Code:

lh = guidata(f);
output = lh.wert;
%Hier dann delete?
delete(gcf);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 05.02.2015, 16:32     Titel:
  Antworten mit Zitat      
Hallo
Zitat:

Code:
lh = guidata(f);
output = lh.wert;
%Hier dann delete?
delete(gcf);


Ja genau DELETE kommt nach dem UIWAIT nachdem du den Wert holst;
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 05.02.2015, 16:51     Titel:
  Antworten mit Zitat      
Ja genau da war mein Fehler, ich hatte den Delete hinter dem uiresume in der Closefunction. Führt er eigentlich nach dem uiresume die Funktion weiter aus? oder springt er direkt auf den uiwait?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 05.02.2015, 19:36     Titel:
  Antworten mit Zitat      
Nach UIRESUME wird zuerst die Funktion zu Ende ausgeführt, und danach zu UIWAIT gesprungen. Deswegen kam es bei dir auch zu einem Fehler, weil das Figure-Handle bereits gelöscht wurde und GUIDATA noch auf dieses Handle zugreifen möchte.
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.