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

Wie übergebe ich handles von einem zum anderen GUI?

 

clustering_n00b
Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 25.11.2012, 14:19     Titel: Wie übergebe ich handles von einem zum anderen GUI?
  Antworten mit Zitat      
Hallo zusammen! Smile


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! Very Happy
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: 25.11.2012, 22:16     Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 26.11.2012, 09:06     Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
  Antworten mit Zitat      
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.
Code:

% --- Executes on button press in button
function button_Callback(hObject, eventdata, handles)

SettingsGUI
 


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?
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: 26.11.2012, 09:38     Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
  Antworten mit Zitat      
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:
Code:
handles = guidata(ObjectH);
MainGUIH = handles.MainGUIH;
if ~ishandle(MainGUIH)
  error('Main GUI has been closed already!');
end
handlesMain = guidata(MainGUIH);
handlesMain.XYZ = get(handles.Edit1, 'String');
guidata(MainGUIH, handlesMain);

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
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 26.11.2012, 12:24     Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
  Antworten mit Zitat      
Hallo nochmals! Smile

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:

Code:
handles = guidata(ObjectH);
MainGUIH = handles.MainGUIH;
if ~ishandle(MainGUIH)
  error('Main GUI has been closed already!');
end
handlesMain = guidata(MainGUIH);
handlesMain.XYZ = get(handles.Edit1, 'String');
guidata(MainGUIH, handlesMain);



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?
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: 26.11.2012, 14:38     Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 26.11.2012, 15:13     Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
  Antworten mit Zitat      
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 Very Happy

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.
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: 27.11.2012, 14:03     Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



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

die Lösung heißt GCBF, einfach in der OpeningFcn einbauen

Code:

Parent= gcbf;
handles.Parent= guidata(Parent);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 27.11.2012, 21:37     Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
  Antworten mit Zitat      
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! Smile


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?
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: 28.11.2012, 09:27     Titel: Re: Wie übergebe ich handles von einem zum anderen GUI?
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 28.11.2012, 10:36     Titel:
  Antworten mit Zitat      
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:

Code:
function SettingsGUI_OpeningFcn(hObject, eventdata, handles, varargin)

% Regular stuff
handles.output = hObject;
guidata(hObject, handles);


% Get handles structure from MainGUI
MainGUI = gcbf;
global MainGUIhandles;
MainGUIhandles = guidata(MainGUI);
 


Jetzt habe ich einfach nur den handles des MainGUI gespeichert in einer Variable, die global benutzt werden kann.


Jetzt ist hier eine Beispielmanipulation:


Code:

function chk_funktion1_Callback(hObject, eventdata, handles)

global MainGUIhandles;
settings = get(MainGUIhandles.settingspalette, 'UserData');


if  get(hObject, 'Value') == 1
   
    settings.funktion1 = 1;
    set(MainGUIhandles.settingspalette, 'UserData', settings)
   
else

    settings.funktion1 = 0;
    set(MainGUIhandles.settingspalette, 'UserData', settings)
   
end



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? Question
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 28.11.2012, 15:13     Titel:
  Antworten mit Zitat      
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


Code:

function SettingsGUI_OpeningFcn(hObject, eventdata, handles, varargin)

% Regular stuff
handles.output = hObject;
guidata(hObject, handles);


% Get handles structure from MainGUI
handles.MainGUI = gcbf;
handles.MainGUIhandles = guidata(MainGUI);
 




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


Code:

function chk_funktion1_Callback(hObject, eventdata, handles)

MainGUIhandles = handles.MainGUIhandles ;
settings = get(MainGUIhandles.settingspalette, 'UserData');


if  get(hObject, 'Value') == 1
   
    settings.funktion1 = 1;
    set(MainGUIhandles.settingspalette, 'UserData', settings)
   
else

    settings.funktion1 = 0;
    set(MainGUIhandles.settingspalette, 'UserData', settings)
   
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 28.11.2012, 16:29     Titel:
  Antworten mit Zitat      
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! Mad
Private Nachricht senden Benutzer-Profile anzeigen
 
clustering_n00b
Themenstarter

Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 05.09.11
Wohnort: ---
Version: R2011a, R2012b
     Beitrag Verfasst am: 28.11.2012, 22:32     Titel:
  Antworten mit Zitat      
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 Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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 - 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.