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

Werte zwischen GUI's übergeben (ohne GUIDE)

 

MatlabErlerner
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.08.2015, 15:30     Titel: Werte zwischen GUI's übergeben (ohne GUIDE)
  Antworten mit Zitat      
Hallo zusammen,

ich melde mich mal wieder mit einem Problem. Und zwar möchte ich zwischen zwei GUI's Werte hin und her übergeben. Ich habe eine Hauptgui erstellt:
Code:
function Hauptfenster
scrsz = get(0,'ScreenSize');
%%
Hauptfenster = figure('Position',[0.01*scrsz(4),0.065*scrsz(4),0.99*scrsz(3),0.895*scrsz(4)],...
                    'Units','normalized',...
                    'Resize','off',...
                    'MenuBar','none',...
                    'Name','Test Datenübergabe Hauptfenster',...
                    'NumberTitle','off',...
                    'Tag','figure1');
%%                
handles.PopupmenuString = [{'Auswahl 1'},{'Auswahl 2'},{'Auswahl 3'}];
handles.popupmenu1 = uicontrol('Parent',Hauptfenster,...
                                             'Style','popupmenu',...
                                             'String',handles.PopupmenuString,...
                                             'Value',1,...
                                             'Units','normalized',...
                                             'Position',[.19,.96,.2,.025],...
                                             'BackgroundColor',[1 1 1],...
                                             'Tag', 'popupmenu1');                                      
setappdata(0,'PopupmenuString',handles.PopupmenuString);
%%
handles.pushbutton1 = uicontrol('Style', 'pushbutton',...
                                            'Parent',Hauptfenster,...
                                            'String','Zum Unterfenster',...
                                            'Units','normalized',...
                                            'Position',[.08,.951,.1,.035],...
                                            'Callback',@Zum_Unterfenster,...
                                            'Tag', 'pushbutton1');
                                       
function Zum_Unterfenster(~,~)
Unterfenster


und eine Untergui:
Code:
function Unterfenster
scrsz = get(0,'ScreenSize');
%%
Unterfenster = figure('Position',[0.01*scrsz(4),0.065*scrsz(4),0.99*scrsz(3),0.895*scrsz(4)],...
                    'Units','normalized',...
                    'Resize','off',...
                    'MenuBar','none',...
                    'Name','Test Datenübergabe Unterfenster',...
                    'NumberTitle','off',...
                    'Tag','figure2');

%%
handles.PopupmenuString = getappdata(0,'PopupmenuString');
handles.popupmenu2 = uicontrol('Parent',Unterfenster,...
                                             'Style','popupmenu',...
                                             'String',handles.PopupmenuString,...
                                             'Value',1,...
                                             'Units','normalized',...
                                             'Position',[.19,.96,.2,.025],...
                                             'BackgroundColor',[1 1 1],...
                                             'Tag', 'popupmenu2');                                      
setappdata(0,'PopupmenuString',handles.PopupmenuString);


Die Hauptgui besteht aus einem Popupmenü mit 3 Einträgen (Auswahl 1, Auswahl 2, Auswahl 3) und einem Button, der die Untergui aufruft. Über den Befehl:
Code:
setappdata(0,'PopupmenuString',handles.PopupmenuString);

schreibe ich die Einträge des Popupmenüs in die Untergui. Dort befindet sich lediglich ein Popupmenü, welches die Werte ebenfalls beinhalten soll.
Soweit klappt das ganze auch.
Jetzt möchte ich aber, dass, wenn ich in der Untergui im Popupmenü die Auswahl ändere (meinetwegen statt Auswahl 1, Auswahl 3 anklicke), diese Auswahl dann auch in der Hauptgui (NACH DEM SCHLIEßEN DER UNTERGUI) ausgewählt ist. Möchte ich dann die Auswahl in der Hauptgui doch noch einmal ändern, so soll diese Auswahl auch in der Untergui nach dem Klicken des Buttons ausgewählt sein.
Es soll sich quasi mit dem Ändern der Auswahl in einem der beiden Popupmenüs zeitgleich auch die Auswahl in dem jeweils anderen ändern. Allerdings weiß ich leider überhaupt nicht, wie ich dies hinbekommen soll, denn ich möchte nicht, dass beim Schließen der Untergui bspw. die Hauptgui 'neu' ausgeführt wird, sprich einfach 'nochmal das Bauen' der figure, des Popupmenüs und des Buttons durchlaufen wird. Es soll eher so sein, dass die Hauptgui quasi auf die Untergui 'wartet', bis diese geschlossen wird und dann der Wert der Untergui in der Hauptgui angezeigt wird (OHNE, DASS DIE HAUPTGUI NEU GEBAUT WERDEN MUSS!!!).
Hat da jemand eine Idee, wie ich das ganze Lösen kann? Was die Übergabe von Werte zwischen GUIS angeht, habe ich leider sehr wenig Ahnung.
Anbei habe ich die beiden Dateien (Hauptfenster und Unterfenster) gehangen.

Grüße
Max

Unterfenster.m
 Beschreibung:

Download
 Dateiname:  Unterfenster.m
 Dateigröße:  1.13 KB
 Heruntergeladen:  333 mal
Hauptfenster.m
 Beschreibung:

Download
 Dateiname:  Hauptfenster.m
 Dateigröße:  1.74 KB
 Heruntergeladen:  326 mal
Private Nachricht senden Benutzer-Profile anzeigen


MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.08.2015, 08:56     Titel:
  Antworten mit Zitat      
Hat denn niemand eine Idee? Ich bin hier wirklich am verzweifeln und komme einfach nicht weiter. Auch google konnte mir bisher nicht helfen. Ich hoffe es gibt diese Möglichkeit überhaupt und irgendwer von euch hat einen Lösungsvorschlag für mich. Wäre echt super.

Grüße
Max
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: 13.08.2015, 12:43     Titel: Re: Werte zwischen GUI's übergeben (ohne GUIDE)
  Antworten mit Zitat      
Hallo MatlabErlerner,

Der Umweg, die Daten im Root-Objekt zu speichern, ist unnötig und birgt die gleichen Probleme wie globale Variablen. Speichere die Daten besser im Haupt-GUI.
Code:
function Hauptfenster
Hauptfenster = figure('Position', ...

% Das ist nicht hübsch:
% handles.PopupmenuString = [{'Auswahl 1'},{'Auswahl 2'},{'Auswahl 3'}];
% Besser:
handles.PopupmenuString = {'Auswahl 1', 'Auswahl 2', 'Auswahl 3'};
...
handles.pushbutton1 = uicontrol('Style', 'pushbutton',...
                                            ...
                                            'Callback', {@Zum_Unterfenster, Hauptfenster,...
                                            'Tag', 'pushbutton1');
setappdata(Hauptfenster, 'Handles', handles);
                                       
function Zum_Unterfenster(ObjectH, EventData, Hauptfenster)
Unterfenster(Hauptfenster)

function Unterfenster(Hauptfenster)
HauptHandles = getappdata(Hauptfenster, 'Handles);

...
setappdata(Hauptfenster, 'Handles', HauptHandles);

Nun kannst Du aus dem Unter-GUI alles im "Handles"-Struct des Hauptfensters verändern, was Du möchtest. Du kannst so auf "ferngesteuert" einen ausgewählten String des Popups setzen und ihn wieder auslesen. So teilen sich beide GUIs den Struct mit Handles und Benutzer-Daten.

Und da die Daten nicht im Root-Objekt gespeichert werden, kann man sogar mehrere Fenster gleichzeitig öffnen ohne dass es Probleme gibt.

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

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.08.2015, 19:38     Titel:
  Antworten mit Zitat      
Hallo Jan,
danke für deine sehr hilfreiche Antwort. Jetzt klappt es genau so, wie ich es mir vorstelle! Vielen, vielen Dank. Wink
Allerdings hätte ich noch eine etwas allgemeinere Frage, um weiter in Matlab und der GUI-Programmierung zu lernen. Und zwar hast du geschrieben:
Zitat:
Der Umweg, die Daten im Root-Objekt zu speichern, ist unnötig und birgt die gleichen Probleme wie globale Variablen.

Welche Probleme meinst du genau? Was für Probleme können mit globalen Variablen konkret entstehen?

Beste Grüße
Max
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2015, 13:43     Titel:
  Antworten mit Zitat      
Hallo Jan,
ich habe das ganze Beispiel jetzt noch einmal versucht nachzuvollziehen. Es läuft auch soweit, es gibt keine Fehlermeldungen, allerdings wird der von mir gewünschte Effekt noch nicht erzielt. Ich möchte gerne im Hauptfenster im Popupmenu Auswahl 2 auswählen. Dann soll Auswahl 2 im Unterfenster im Popupmenü dort auch ausgewählt sein. Dies funktioniert leider nicht. Umgekehrt genauso. Funktioniert leider auch nicht. Ich verstehe nur irgendwie nicht wieso. Ich setzte ja z.B. am Ende der function Unterfenster(Hauptfenster) die aktualisierte Handles-Struktur zu den appdata:
Code:
setappdata(Hauptfenster, 'Handles', handles);

Allerdings woher weiß denn jetzt das Hauptfenster, dass ich im Popupmenü des Unterfensters die Auswahl geändert habe und ändert diese Auswahl in 'Echtzeit' auch im Hauptfenster, so dass diese dann dort auch im Popupmenü nach schließen des Unterfensters erscheint? Weil selbst wenn ich getappdata zu Beginn der function Hauptfenster setzten würde, würde diese ja niemals ausgeführt werden, da die function Hauptfenster ja nicht erneut durchlaufen wird.
Also du siehst, irgendwo ist bei mir gerade eine Blockade drin. Wäre super, wenn du mir weiterhelfen könntest!

Grüße Max
Anbei habe ich noch schnell die jeweiligen Matlabcodes der aktuellen Version gehangen, sowohl als Datei, wie auch hier im Thread:
function Hauptfenster:
Code:
function Hauptfenster
scrsz = get(0,'ScreenSize');
%%
Hauptfenster = figure('Position',[0.01*scrsz(4),0.065*scrsz(4),0.99*scrsz(3),0.895*scrsz(4)],...
                    'Units','normalized',...
                    'Resize','off',...
                    'MenuBar','none',...
                    'Name','Test Datenübergabe Hauptfenster',...
                    'NumberTitle','off',...
                    'Tag','figure1');
%%
handles.PopupmenuString = {'Auswahl 1', 'Auswahl 2', 'Auswahl 3'};
handles.popupmenu1 = uicontrol('Parent',Hauptfenster,...
                                             'Style','popupmenu',...
                                             'String',handles.PopupmenuString,...
                                             'Value',1,...
                                             'Units','normalized',...
                                             'Position',[.19,.96,.2,.025],...
                                             'BackgroundColor',[1 1 1],...
                                             'Tag', 'popupmenu1');                                      
%%
handles.pushbutton1 = uicontrol('Style', 'pushbutton',...
                                            'Parent',Hauptfenster,...
                                            'String','Zum Unterfenster',...
                                            'Units','normalized',...
                                            'Position',[.08,.951,.1,.035],...
                                            'Callback',{@Zum_Unterfenster, Hauptfenster},...
                                            'Tag', 'pushbutton1');
setappdata(Hauptfenster, 'Handles', handles);                                        
function Zum_Unterfenster(~, ~, Hauptfenster)
Unterfenster(Hauptfenster)


function Unterfenster(Hauptfenster)
Code:
function Unterfenster(Hauptfenster)
handles = getappdata(Hauptfenster, 'Handles');
scrsz = get(0,'ScreenSize');
%%
Unterfenster = figure('Position',[0.01*scrsz(4),0.065*scrsz(4),0.99*scrsz(3),0.895*scrsz(4)],...
                    'Units','normalized',...
                    'Resize','off',...
                    'MenuBar','none',...
                    'Name','Test Datenübergabe Unterfenster',...
                    'NumberTitle','off',...
                    'Tag','figure2');

%%
handles.PopupmenuString = getappdata(0,'PopupmenuString');
handles.popupmenu2 = uicontrol('Parent',Unterfenster,...
                                             'Style','popupmenu',...
                                             'String',handles.PopupmenuString,...
                                             'Value',1,...
                                             'Units','normalized',...
                                             'Position',[.19,.96,.2,.025],...
                                             'BackgroundColor',[1 1 1],...
                                             'Tag', 'popupmenu2');                                      
setappdata(Hauptfenster, 'Handles', handles);


Unterfenster.m
 Beschreibung:

Download
 Dateiname:  Unterfenster.m
 Dateigröße:  1.18 KB
 Heruntergeladen:  326 mal
Hauptfenster.m
 Beschreibung:

Download
 Dateiname:  Hauptfenster.m
 Dateigröße:  1.75 KB
 Heruntergeladen:  330 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2015, 14:15     Titel:
  Antworten mit Zitat      
Habe gerade eben noch eine kleine Änderung vorgenommen, allerdings ohne Wirkung. Verstehe nur leider nicht wieso. Und zwar habe ich die function Unterfenster ein wenig erweitert:
Code:
function Unterfenster(Hauptfenster)
handles = getappdata(Hauptfenster, 'Handles');
scrsz = get(0,'ScreenSize');
%%
Unterfenster = figure('Position',[0.01*scrsz(4),0.065*scrsz(4),0.99*scrsz(3),0.895*scrsz(4)],...
                    'Units','normalized',...
                    'Resize','off',...
                    'MenuBar','none',...
                    'Name','Test Datenübergabe Unterfenster',...
                    'NumberTitle','off',...
                    'Tag','figure2');

%%
valUnter = get(handles.popupmenu1, 'Value');
handles.popupmenu2 = uicontrol('Parent',Unterfenster,...
                                             'Style','popupmenu',...
                                             'String',handles.PopupmenuString,...
                                             'Value',valUnter,...
                                             'Units','normalized',...
                                             'Position',[.19,.96,.2,.025],...
                                             'BackgroundColor',[1 1 1],...
                                             'Callback', {@popupmenu2_callback, handles},...
                                             'Tag', 'popupmenu2');                                                                                


function popupmenu2_callback(object_handle, handles)
val = get(object_handle, 'Value');
set(handles.popupmenu1, 'Value',val);
setappdata(Hauptfenster, 'Handles', handles);


Speziell der letzte Teil:
Code:
%%
valUnter = get(handles.popupmenu1, 'Value');
handles.popupmenu2 = uicontrol('Parent',Unterfenster,...
                                             'Style','popupmenu',...
                                             'String',handles.PopupmenuString,...
                                             'Value',valUnter,...
                                             'Units','normalized',...
                                             'Position',[.19,.96,.2,.025],...
                                             'BackgroundColor',[1 1 1],...
                                             'Callback', {@popupmenu2_callback, handles},...
                                             'Tag', 'popupmenu2');                                                                                


function popupmenu2_callback(object_handle, handles)
val = get(object_handle, 'Value');
set(handles.popupmenu1, 'Value',val);
setappdata(Hauptfenster, 'Handles', handles);


wurde von mir erweitert. Damit wollte ich erzielen, dass beim Ändern der Auswahl im popupmen2 auch automatisch im popupmenu1 in der function Hauptfenster der Wert gesetzt wird. Allerdings mit mäßigem Erfolg, ich erhalte immer folgende Fehlermeldung:
Code:
>> Hauptfenster
Error using Unterfenster>popupmenu2_callback
Too many input arguments.
 
Error while evaluating UIControl Callback


Weiß wirklich nicht mehr weiter. Habt ihr irgendwelche konstruktiven Vorschläge? Brauch wirklich dringend Hilfe
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2015, 16:42     Titel:
  Antworten mit Zitat      
Hallo zusammen,
ich habe es jetzt mit viel Rumprobiererei hinbekommen. Allerdings weiß ich nicht, ob das ganze eine 'saubere' Lösung darstellt:
Hier mal der Programmcode für die function Unterfenster:
Code:
function Unterfenster(Hauptfenster)
handles = getappdata(Hauptfenster, 'Handles');
scrsz = get(0,'ScreenSize');
%%
Unterfenster = figure('Position',[0.01*scrsz(4),0.065*scrsz(4),0.99*scrsz(3),0.895*scrsz(4)],...
                    'Units','normalized',...
                    'Resize','off',...
                    'MenuBar','none',...
                    'Name','Test Datenübergabe Unterfenster',...
                    'NumberTitle','off',...
                    'Tag','figure2');

%%
valUnter = get(handles.popupmenu1, 'Value');
handles.popupmenu2 = uicontrol('Parent',Unterfenster,...
                                             'Style','popupmenu',...
                                             'String',handles.PopupmenuString,...
                                             'Value',valUnter,...
                                             'Units','normalized',...
                                             'Position',[.19,.96,.2,.025],...
                                             'BackgroundColor',[1 1 1],...
                                             'Callback', {@popupmenu2_callback, Hauptfenster},...
                                             'Tag', 'popupmenu2');                                                                                
setappdata(Hauptfenster, 'Handles', handles);
function popupmenu2_callback(object_handle,~, Hauptfenster)
handles = getappdata(Hauptfenster, 'Handles');
val = get(object_handle, 'Value');
set(handles.popupmenu1, 'Value',val);
setappdata(Hauptfenster, 'Handles', handles);


Meine erste Frage hierzu wäre: Wieso kann ich das letzte
Code:
setappdata(Hauptfenster, 'Handles', handles)
in der function popupmenu2_callback(object_handle,~, Hauptfenster) weglassen und die Übergabe funktioniert trotzdem?

Als zweites habe ich eine Frage zu den Popupmenüs. Und zwar habe ich mir einen weiteren Button Test in die function Hauptfenster gebastelt, über den ich mir sowohl die handles-Struktur zum Workspace ausgeben lassen kann als auch den Wert des popupmenu2 aus der function Unterfenster, um sie mir genauer anzuschauen. Mache ich das, ergibt sich folgendes Bild:

Es sind also sowohl das Popupmenü 1 als auch das Popupmenü 2 gespeichert.
Hier die einzelnen Popupmenüs:
Popupmenu1

Popupemnu2


Was ich nicht verstehe ist, warum der Wert des 2. Popupmenüs nicht ausgegeben werden kann. Es müsste doch eigentlich funktionieren, auch wenn es nicht mehr exisitert, weil es nach dem Schließen 'gelöscht' wurde. Aber ich hab es doch vorher extra via setappdata gespeichert. Und anzeigen, dass es in der handels-struct liegt, tut Matlab ja schließlich auch. Also warum kann ich dann nicht mehr auf den Wert zurück greifen? Und warum werden mir Popupmenu 1 und Popupmenu 2 in der handlesstruct so 'komisch' angezeigt? ich kann dort beispielsweise für beide Popupmenüs nicht den eintrag 'Value' finden?! Dies ist anders, wenn ich mir die Struktur noch vor dem ersten Öffnen und erstellen des 2. Popupmenüs angucke!

Kann mir jemand diese Frage vllt. beantworten? Vorausgesetzt, er versteht, was ich meine/was meine Fragen sind und weiß eine Antwort Smile

Grüße und besten Dank im Voraus
Max
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: 18.08.2015, 19:19     Titel:
  Antworten mit Zitat      
Hallo MatlabErlerner,

Zitat:
Meine erste Frage hierzu wäre: Wieso kann ich das letzte
Code:
setappdata(Hauptfenster, 'Handles', handles)
in der function popupmenu2_callback(object_handle,~, Hauptfenster) weglassen und die Übergabe funktioniert trotzdem?

Was ist "die Übergabe"?

Zitat:
Es sind also sowohl das Popupmenü 1 als auch das Popupmenü 2 gespeichert.

Nein, es werden nicht die Menüs gespeichert, sondern nur die handles zu ihnen. Wenn die Menüs selbst gelöscht sind, ist der handle nur ein Zeiger auf ein gelöschtes Element. Dann kann natürlich keine Werte mehr abgefragt werden.

Zitat:
Aber ich hab es doch vorher extra via setappdata gespeichert.

Was hast Du genau gespeichert?

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

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.08.2015, 19:19     Titel:
  Antworten mit Zitat      
Hallo Jan,
danke für deine Antwort Smile
Zitat:
Zitat:

Meine erste Frage hierzu wäre: Wieso kann ich das letzte
Code:
setappdata(Hauptfenster, 'Handles', handles)
Funktion ohne Link?
in der function popupmenu2_callback(object_handle,~, Hauptfenster) weglassen und die Übergabe funktioniert trotzdem?


Was ist "die Übergabe"?


Mit 'die Übergabe' ist das Weitergeben der geänderten handles, die man in der funct4ion Unterfenster geändert hat, an die function Hauptfenster gemeint, wo ja dann alle geänderten handles (bspw. der Wert des popupmenu2) verwendet werden.

Zitat:
Zitat:

Aber ich hab es doch vorher extra via setappdata gespeichert.


Was hast Du genau gespeichert?

Ich meinte damit alle Eigenschaften des Popupmenu2. Aber ich glaube ich habe da etwas verwechselt. Ich habe nicht die Eigenschaften des Popupmenus2 gespeichert (wie bspw. den ausgewählten Value oder String etc.), sondern nur den handle, also Zeiger, zu eben jenem Popupmenu. Ist das richtig?
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.