|
|
Wie übergebe ich handles von einem zum anderen GUI? |
|
clustering_n00b |
Forum-Century
|
|
Beiträge: 129
|
|
|
|
Anmeldedatum: 05.09.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2011a, R2012b
|
|
|
|
|
|
Verfasst am: 25.11.2012, 14:19
Titel: Wie übergebe ich handles von einem zum anderen GUI?
|
|
Hallo zusammen!
Ich stecke gerade an einem kleinen GUI-Problem fest, und zwar habe ich 2 GUI's erstellt:
1) MainGUI
2) SettingsGUI
SettingsGUI wird über einen Button-Klick in MainGUI aufgerufen.
Jetzt möchte ich, dass der User im SettingsGUI gewisse Parameter auswählen kann, welche bestimmte Funktionen im MainGUI ausführen.
Dabei werden alle Parameter natürlich im handles struct abgespeichert.
Nun habe ich 2 Fragen:
1) Wie übergebe ich die handles-Struktur von SettingsGUI zu MainGUI?
2) Ist es nötig das SettingsGUI - Fenster zu öffnen, damit die Übergabe stattfindet? Kann ich nicht einfach eine Hintergrund-Instanz kreieren, die handles übergibt, aber nur DANN sichtbar wird, wenn der User dies EXPLIZIT im MainGUI anwählt?
Freue mich auf eure Vorschläge!
|
|
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 25.11.2012, 22:16
Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
|
|
Hallo clustering_n00b,
Ich verstehe die Fragen noch nicht.
Den handles Struct "übergibt" man am besten, in dem man ein Unterprogramm des MainGUI aufruft und dort das handles Struct geeignet verarbeitet.
Wenn das SettingsGUI-Fenster nicht geöffnet ist, kann es auch keinen handles Struct haben, und von wo sollte dann etwas wohin übergeben werden?
Ich glaube, Du solltest Das Problem nochmal konkreter beschreiben.
Gruß, Jan
|
|
|
clustering_n00b |
Themenstarter
Forum-Century
|
|
Beiträge: 129
|
|
|
|
Anmeldedatum: 05.09.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2011a, R2012b
|
|
|
|
|
|
Verfasst am: 26.11.2012, 09:06
Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
|
|
|
|
|
Jan S hat Folgendes geschrieben: |
Den handles Struct "übergibt" man am besten, in dem man ein Unterprogramm des MainGUI aufruft und dort das handles Struct geeignet verarbeitet.
Wenn das SettingsGUI-Fenster nicht geöffnet ist, kann es auch keinen handles Struct haben, und von wo sollte dann etwas wohin übergeben werden?
|
Hi JanS!
Erstmals - Danke fürs Antworten!
Ich erkläre vielleicht nochmals die Applikation, dann wird die Funktionalität klarer.
Im MainGUI werden gewisse Sachen abgearbeitet, z.B. Plots dargestellt.
Im SettingsGUI kann der User seine Präferenzen angeben, z.B. xmin/xmax, die zu plottende Funktion, die Strings für die Legenden, usw.
Folglich müssen Userpräferenzen vom SettingsGUI zum MainGUI übertragen werden können, damit der Plot entsprechend verändert wird, und das geht, soweit ich weiss, nur über den handles struct.
Zu Punkt 1)
Könntest du vielleicht deine Idee konkretisieren?
Ich habe einen Button im MainGUI erstellt - beim Klick darauf wird das Fenster des SettingsGUI aufgemacht.
Nehmen wird an, der User wählt einen Checkbutton aus im SettingsGUI (der zugehörende Tag: handles.checkbutton; der zugehörige Callback: function checkbutton_Callback(hObject, eventdata, handles))
Wie kann ich jetzt den Wert des Checkbuttons (0 oder 1) an das MainGUI weiterleiten?
Zu Punkt 2)
Es ist möglich (sehr wahrscheinlich sogar), dass der User zu Beginn das Button nicht anklickt, welches das SettingsGUI hervorruft.
Dennoch soll das MainGUI seine Funktion ausüben (Funktion plotten).
Daher sind Default-Werte für die Plots nötig.
Diese Default-Werte möchte ich aber auch im SettingsGUI abspeichern und vom MainGUI benutzen lassen, auch wenn das SettingsGUI nicht 'OFFIZIELL' aktiviert wurde.
Geht das wirklich nicht?
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 26.11.2012, 09:38
Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
|
|
|
|
|
Hallo clustering_n00b,
Kann das SettingsGUI auch gestartet werden, ohne dass man dafür im MainGUI auf einen Button drücken muss?
Es ist sinnvoll, hier in Objekt-orientierten Ansaätzen zu denken: Wessen Eigenschaft sind die Default-Werte? Die gehören zum MainGUI, also werden sie auch dort gespeichert z.B. in "handles.Default.<JeweiligesFeld>". Die ausgesuchten Werte stehen in "handles.Settings.<JeweiligesFeld>".
Wenn nun das SettingsGUI aufgerufen wird, liefert man den Handle des MainGUI als Argument mit. Es wird im dortigen handles Struct gespeichert. Bei jeder Aktion, also z.B. wenn eine Avriable neu definiert wird, wird das handles struct des MainGUI modifiziert:
Eigentlich naheliegend, oder?
Die Strategie ist zunächst zu bestimmen, welchem Objekt (also welcher GUI in Deinem Fall) welche Daten gehören, und dann die Daten sauber zu trennen. Wenn ein Unter-GUI Daten des Haupt-GUI ändert, werden diese auch im Haupt-GUI geändert und nicht in irgendeiner Funktion, die diese Daten eigentlich gar nicht besitzt.
Gruß, Jan
|
|
|
clustering_n00b |
Themenstarter
Forum-Century
|
|
Beiträge: 129
|
|
|
|
Anmeldedatum: 05.09.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2011a, R2012b
|
|
|
|
|
|
Verfasst am: 26.11.2012, 12:24
Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
|
|
|
|
|
Hallo nochmals!
Jan S hat Folgendes geschrieben: |
Kann das SettingsGUI auch gestartet werden, ohne dass man dafür im MainGUI auf einen Button drücken muss?
|
Nein, das SettingsGUI soll wirklich nur per Userklick aufgerufen werden.
Jan S hat Folgendes geschrieben: |
Es ist sinnvoll, hier in Objekt-orientierten Ansaätzen zu denken: Wessen Eigenschaft sind die Default-Werte? Die gehören zum MainGUI, also werden sie auch dort gespeichert z.B. in "handles.Default.<JeweiligesFeld>". Die ausgesuchten Werte stehen in "handles.Settings.<JeweiligesFeld>".
|
Okay, das leuchtet mir eigentlich ein. Deine Idee gefällt mir gut!
Ich denke aber nicht, dass es nötig ist handles.Default und handles.Setting zu erstellen. Eines genügt dafür nämlich, handles.settings
Jan S hat Folgendes geschrieben: |
|
Ich verstehe diesen Code nicht ganz. Mit handlesMainGUI = guidata(MainGUI) wird die handles-Struktur des MainGUI's gespeichert - soweit ist es klar.
Aber wie wird das SettingsGUI aufgerufen? Und wie wird handlesMainGUI übergeben?
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 26.11.2012, 14:38
Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
|
|
Hallo clustering_n00b,
Ich gebe zu, mein Beispiel war kontextfrei.
Also: Beim Öffnen des Unter-GUI wird der handle der Main-GUI mit übergeben und dort lokal gespeichert. Beim Aufrud der Callbacks des Unter-GUI werden dann die Inhalte des handle-Structs aus dem Main-GUI gelesen, geändert und wieder gespeichert. Dann sind sie im Main-GUI wieder verfügbar, wenn dort das Plotten nochmals gestartet wird oder wofür auch immer.
Gruß, Jan
|
|
|
clustering_n00b |
Themenstarter
Forum-Century
|
|
Beiträge: 129
|
|
|
|
Anmeldedatum: 05.09.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2011a, R2012b
|
|
|
|
|
|
Verfasst am: 26.11.2012, 15:13
Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
|
|
Jan S hat Folgendes geschrieben: |
Also: Beim Öffnen des Unter-GUI wird der handle der Main-GUI mit übergeben und dort lokal gespeichert. Beim Aufrud der Callbacks des Unter-GUI werden dann die Inhalte des handle-Structs aus dem Main-GUI gelesen, geändert und wieder gespeichert. Dann sind sie im Main-GUI wieder verfügbar, wenn dort das Plotten nochmals gestartet wird oder wofür auch immer. |
Hi Jan!
Das ist mir natürlich schon klar
Meine Frage war aber mehr, WIE übergibt man den handlesMainGUI = guidata(MainGUI) an SettingsGUI bzw. welcher MATLAB Befehl tut das?
Bisher musste ich keine Argumente übergeben und habe daher mit einem einfach SettingsGUI den SettingsGUI augerufen.
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 27.11.2012, 14:03
Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
|
|
Hallo clustering_n00b,
Du kannst einfach mal "SettingsGUI(MainGUIHandle)" aufrufen. Dann setze einen Breakpoint in die Hauptfunktion von SettingGUI und schaue Dich dort um, ob man die Inputs irgendwie benutzen und im lokalen handles Struct speichern kann, etwa in der CreateFcn oder OpeningFcn.
Ich selbst benutze niemals GUIDE, da der automatisch erstellte Code viel zu kompliziert ist. Bei einer selbstgeschriebenen Funktion wäre es viel einfacher ein Input-Argument zu verarbeiten.
Gruß, Jan
|
|
|
denny |
Supporter
|
|
Beiträge: 3.853
|
|
|
|
Anmeldedatum: 14.02.08
|
|
|
|
Wohnort: Ulm
|
|
|
|
Version: R2012b
|
|
|
|
|
|
Verfasst am: 27.11.2012, 14:32
Titel:
|
|
Hallo
die Lösung heißt GCBF, einfach in der OpeningFcn einbauen
|
|
|
clustering_n00b |
Themenstarter
Forum-Century
|
|
Beiträge: 129
|
|
|
|
Anmeldedatum: 05.09.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2011a, R2012b
|
|
|
|
|
|
Verfasst am: 27.11.2012, 21:37
Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
|
|
Jan S hat Folgendes geschrieben: |
Du kannst einfach mal "SettingsGUI(MainGUIHandle)" aufrufen. Dann setze einen Breakpoint in die Hauptfunktion von SettingGUI und schaue Dich dort um, ob man die Inputs irgendwie benutzen und im lokalen handles Struct speichern kann, etwa in der CreateFcn oder OpeningFcn. |
Habe es gerade gemacht - und tatsächlich. Im ersten Argument von varargin, nämlich varargin{1} ist der handles des MainGUI zu finden.
Danke!
denny hat Folgendes geschrieben: |
Parent= gcbf; handles.Parent= guidata(Parent); |
Das hat auch funktioniert!
Jetzt stellt sich aber die Frage - wenn ich am handles.Parent eine Änderung vornehme, wird diese aber NICHT im MainGUI registriert, sondern nur lokal gespeichert.
Wie soll man das dem MainGUI jetzt noch übergeben?
|
|
|
Jan S |
Moderator
|
|
Beiträge: 11.057
|
|
|
|
Anmeldedatum: 08.07.10
|
|
|
|
Wohnort: Heidelberg
|
|
|
|
Version: 2009a, 2016b
|
|
|
|
|
|
Verfasst am: 28.11.2012, 09:27
Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
|
|
Hallo clustering_n00b,
Zitat: |
Jetzt stellt sich aber die Frage - wenn ich am handles.Parent eine Änderung vornehme, wird diese aber NICHT im MainGUI registriert, sondern nur lokal gespeichert. |
Bitte poste den entsprechenden Code. Ich kann mir unter "wenn ich am handles.Parent eine Änderung vornehme" nicht konkretes vorstellen. Und was genau heißt "im MainGUI registrieren"?
Gruß, Jan
|
|
|
clustering_n00b |
Themenstarter
Forum-Century
|
|
Beiträge: 129
|
|
|
|
Anmeldedatum: 05.09.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2011a, R2012b
|
|
|
|
|
|
Verfasst am: 28.11.2012, 10:36
Titel:
|
|
|
|
|
Jan S hat Folgendes geschrieben: |
Bitte poste den entsprechenden Code. Ich kann mir unter "wenn ich am handles.Parent eine Änderung vornehme" nicht konkretes vorstellen. Und was genau heißt "im MainGUI registrieren"? |
Hi Jan!
Die OpeningFcn Funktion sieht folgendermassen aus:
Jetzt habe ich einfach nur den handles des MainGUI gespeichert in einer Variable, die global benutzt werden kann.
Jetzt ist hier eine Beispielmanipulation:
Fall der Checkbutton 'Funktion1' disabeld/enabeld wird, wird der Settings struct von MainGUIhandles.settingspalette extrahiert und der Wert der entsprechenden Funktion manipuliert (auf = 0 oder = 1 gesetzt). Danach wird der struct settings wieder in seine alte Stelle im MainGUIhandles zurückgesetzt.
Im MainGUI wird nun dieser Wert (settings.funktion1) abgefragt und danach etwas ausgeführt (je nachdem was dieser Wert ist - 0 oder 1).
Zitat: |
Das Problem ist aber, dass diese Änderung von funktion1 nur innerhalb von SettingsGUI stattfindet (lokal). Ich kann keine Änderung von funktion 1 im MainGUI ausmachen (bzw. sie wird dort nicht registriert). |
Wie kann ich dieses Problem nun beheben?
|
|
|
denny |
Supporter
|
|
Beiträge: 3.853
|
|
|
|
Anmeldedatum: 14.02.08
|
|
|
|
Wohnort: Ulm
|
|
|
|
Version: R2012b
|
|
|
|
|
|
Verfasst am: 28.11.2012, 15:13
Titel:
|
|
hallo
erstmals brauchst du nicht MainHandles GLOBAL zu deklarieren
das kann man alles schön über GUIDATA lösen. Man kann nämlich so die handles auch zurückschreiben und in MainGUI über GUIDATA wieder aktuelle handles erhalten
Zweitens wenn du die Daten in USERDATA von Graphischen Objekt schreibst, muss daraus auch in MainGUI auslesen
Also muss in Deiner Hauptgui handles zu settingspallete suchen und daraus wieder USERDATA auslesen
|
|
|
clustering_n00b |
Themenstarter
Forum-Century
|
|
Beiträge: 129
|
|
|
|
Anmeldedatum: 05.09.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2011a, R2012b
|
|
|
|
|
|
Verfasst am: 28.11.2012, 16:29
Titel:
|
|
Hi Denny!
Danke für die Vorschläge!
denny hat Folgendes geschrieben: |
erstmals brauchst du nicht MainHandles GLOBAL zu deklarieren das kann man alles schön über GUIDATA lösen. Man kann nämlich so die handles auch zurückschreiben und in MainGUI über GUIDATA wieder aktuelle handles erhalten. |
Okay - das kann ich machen.
denny hat Folgendes geschrieben: |
Zweitens wenn du die Daten in USERDATA von Graphischen Objekt schreibst, muss daraus auch in MainGUI auslesen
Also muss in Deiner Hauptgui handles zu settingspallete suchen und daraus wieder USERDATA auslesen |
Das habe ich auch so gemacht, aber es scheint, dass der handles von SettingsGUI und handles von MainGUI getrennt sind.
Eine Änderung im SettingsGUI wird nicht vom MainGUI registriert bzw. 'bemerkt'.
Somit sind beide handles lokale Variablen für jedes der 2 GUI's!
|
|
|
clustering_n00b |
Themenstarter
Forum-Century
|
|
Beiträge: 129
|
|
|
|
Anmeldedatum: 05.09.11
|
|
|
|
Wohnort: ---
|
|
|
|
Version: R2011a, R2012b
|
|
|
|
|
|
Verfasst am: 28.11.2012, 22:32
Titel:
|
|
Okay - habe das Problem nun selber gelöst.
Lokal war das Stichwort. Da beide handles nur lokal gültig waren habe ich den settings Struct als globale Variable definiert.
Ich muss also MainGUIhandles nicht an SettingsGUI übergeben und auch nichts zurückholen müssen.
Vielleicht hilft diese Antwort jemand anderen weiter
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
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.
|
|