Verfasst am: 15.06.2013, 14:38
Titel: Datenaustausch zwischen GUIs
Hallo zusammen bin neu hier.
Ich bin ein Anfänger auf dem Gebiet und habe eine Frage.
Ich habe eine GUI 1 erstellt in der soll eine Animation ablaufen. Dort möchte ich über ein Menu auf eine weitere GUI zugreifen um dort Parameter einzugeben. Sind nur Zahlenwert. Die zweite GUI habe ich auch grafisch erstellt und als x.fig abgespeichert. Ich rufe im Menu der ersten GUI die zweite mit uiwait(x.fig) auf und habe im vorfeld der GUI 2 die Option modal verpasst, sodass sie im Vordergund ist. Nachdem ich meine Parameter in die zweite GUI geschrieben habe möchte ich das Fenster einfach schließen und dass die Parameter nun auch in der ersten GUI bereit stehen. Das schließen mache ich mit close(x.fig). Aber ich weiß leider nicht genau wie ich die Parameter richtig übergen kann.
OK gerne:
also als erstes starte ich meine "Option" in dem ersten GUI(function varargout = haupt(varargin)) mit uiwait. Hier fehlt ja jetzt theoretisch der Empfang von den ankommenden Argumenten.
Code:
function menu_menu_1_Callback(hObject, eventdata, handles)
uiwait(option)
Zu GUI zwei, dort lese ich über eine editierbare Box viele Werte ein (nur zahlen) ich speichere sie in Arrays, Vektoren und Skalaren, Dieses geschieht wenn ich auf den einzigen Button klicke der dort existieren soll.:
Code:
function knopfdruck_Callback(hObject, eventdata, handles)
testwert(1)=str2num(get(handles.m1,'String'));
....hier kommen dann paar zeilen...
close(option)
Die Deklaration von "testwert" habe ich einfach zwischen den Funktionen gemacht ich hoffe es geht so. Jetzt muss ich sie irgendwie an an varargout übergeben denke ich.
Verstehe ich es richtig, wenn ich dieses Fenster schließe und dann meine erste GUI wieder geöffnet wird (die im Grunde wartet wegen uiwait), dass dann sich die Argumente in varargin befinden werden?
uiwait sollte stattdessen in die OpeningFcn von option.
Code:
function knopfdruck_Callback(hObject, eventdata, handles)
testwert(1)=str2num(get(handles.m1,'String'));
uiresume(handles.figure1)% oder was auch immer das Handle auf die GUI an sich ist. % close(option) <-- nicht hier, sonst kein geordneter Abschluss
Hmm, leider stimmt da was nicht. Ich habe deswegen ein Minimalbeispiel erstellt, wenn ich es da verstanden habe dann kann ich es meins übertragen. Könntest du es dir vielleicht angucken? Leider weiß nicht nicht wie ich den gesamten Quellcode bekomme also auch von der .fig datei sodass man nicht extra sie mitschicken muss.
Ehrlich gesagt versteht ich nicht genau den Ablauf des Programms. Ich starte meine Hauptfunktion von dort aus starte ich dann ein weiteres Fenster. Vor dem öffnen des neuen Fensters wird die OpeningMethode aufgerufen (dort muss also uiwait(kommt hier das Hauptfenster rein oder das neu geöffnete?) stehen). Nachdem ich nun damit gearbeitet habe und es schließen möchte wird die OutputMethode des neuen Aufgerufen und dort muss uiresume stehen.? Verstehe ich es richtig?
Leider weiß nicht nicht wie ich den gesamten Quellcode bekomme also auch von der .fig datei sodass man nicht extra sie mitschicken muss.
Das ist schon so gedacht und so in Ordnung.
Zitat:
Nachdem ich nun damit gearbeitet habe und es schließen möchte wird die OutputMethode des neuen Aufgerufen und dort muss uiresume stehen.?
Fast. Die OutputFcn wird erst ausgeführt, wenn das uiresume kommt (das uiwait sorgt dafür, dass die Eingabe-GUI nciht sofort beendet wird). Deswegen das uiresume in den Callback, damit nach Abschluss des Callbacks die OutputFcn ausgeführt wird, in der die Werte zurückgegeben und die Eingabe-GUI geschlossen wird.
Hallo, habe ein weiteres Problem, wenn ich das "unter" GUI öffne, also die Option dann kann ich dort ja meine Parameter festsetzen und wenn ich auf den Button drücke dann schließt er es richtig und übergibt die Parameter an die "Eltern". Wenn man aber oben auf das x (Schließen) in der Option klickt, dann kommt ein Fehler. Wie ich gelesen habe muss ich die closeFunction modifizieren.
Habe mich etwas an dieses hier gehalten, allerdings konnte ich dann nichts mehr schließen. Ich möchte, wenn man auf das x klickt, einfach genau das gleiche machen wie beim Button auch. Einfach alle Parameter einlesen und sie übergeben.
So sieht meine CloseFunction aus:
Code:
function figure1_CloseRequestFcn(hObject, eventdata, handles) delete(hObject);
Wenn man aber oben auf das x (Schließen) in der Option klickt, dann kommt ein Fehler.
Und wie lautet die Fehlermeldung?
Zitat:
So sieht meine CloseFunction aus: [...]
Das bringt ja aber gerade nichts, da es ohnehin das Standardverhalten ist.
Wenn beim Schließen das Gleiche gemacht werden soll wie beim Button, dann musst du in der CloseRequestFcn schon dafür sorgen, dass der selbe Code ausgeführt wird.
Zitat:
Greift der beim Button(zum beenden) in dem folgendes steht:
Nein, warum auch? Woher soll MATLAB denn wissen, dass dieser Button zum Schließen gedacht ist?
Zitat:
Oder wird die CloseFcn nur beim Beenden über das X aufgerufen?
Wann die CloseRequestFcn ausgeführt wird, steht in deinem Link beschrieben.
Ich habe festgestellt, dass die figure1_CloseRequestFcn immer ganz am Ende kommt. Ich dachte mir wenn ich Option starte, dann hält er sozusagen das Progamm (uiwait) bis ich auf den Button klicke (uiresume), dann springt er in die Output Funktion bis er auf close trifft. Und erst dann auf die figure1_CloseRequestFcn. Jetzt weiß ich leider nicht genau wo ich eingreifen soll.
in welcher GUI ist m1 denn? Möglicherweise in der anderen? Du kannst nur innerhalb einer GUI auf die Daten zugreifen, ansonsten musst du sie übergeben.
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.