Handle aus Sub-GUI zurück ins Hauptprogramm übergeben
GoMatlab_Gast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 26.08.2011, 07:04
Titel: Handle aus Sub-GUI zurück ins Hauptprogramm übergeben
Hallo zusammen,
ich habe derzeit ein kleines Problem, bei dem ich Eure Hilfe brauche. Ich habe mit GUIDE eine inzwischen recht ansehnliche GUI erstellt. Dabei ist es notwendig geworden, dass ich aus dieser GUI heraus eine weitere starte, die nur ein Popup-Menü enthält. Die Auswahl des Popup-Menüs des Anwenders soll in Form eines Handles an das Hauptprogramm zurückgegeben werden. Leider klappt das nicht. Vielleicht könnt Ihr mir meine(n) Fehler zeigen und korrigieren.
Die relevanten Codeabschnitte sehen aus wie folgt:
Code:
function HAUPTGUI_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to Auswertungsprog (see VARARGIN)
% Choose default command line output for HAUPTGUI handles.output2 = [];
handles.auswahl = [];
functionvarargout = HAUPTGUI_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure varargout{1} = handles.output2;
function pushbutton2_Callback(hObject, eventdata, handles) % hObject handle to pushbutton2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
function SUB_Auswahl_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to PAK_Auswahl (see VARARGIN)
% Choose default command line output for SUB_Auswahl
handles.auswahlSUB = varargin{1};
handles.auswahlNEUPSUB= handles.auswahlSUB % Update handles structure guidata(hObject, handles);
% UIWAIT makes SUB_Auswahl wait for user response (see UIRESUME)
uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line. functionvarargout = SUB_Auswahl_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
handles.output2 = handles
% Get default command line output from handles structure varargout{1} = handles.output2
% --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
handles.auswahlNEUSUB = (get(handles.popupmenu1, 'Value'))
%handles.output = handles.auswahlNEUSUB assignin('base', 'SUBHANDLE', handles) guidata(hObject, handles) close(handles.figure1) assignin('base', 'output', handles.output)
%delete(hObject);
Das Ganze funktioniert ohne Fehlermeldung, doch leider wird der Handle nicht in die HAUPTGUI übertragen (entweder in den handle.output2 oder handle.auswahl).
Ich hatte mich an diesem Beispiel (http://www.gomatlab.de/variablen-aus-main-gui-in-sub-gui-uebertragen-t17665.html) versucht, zu orientieren, leider funktionierte das nicht...
Würde mich freuen, wenn Ihr mir helfen könnt!
Danke schon jetzt!
Verschoben: 26.08.2011, 08:03 Uhr von _Peter_ Von Programmierung nach GUIs
Verfasst am: 26.08.2011, 08:59
Titel: Re: Handle aus Sub-GUI zurück ins Hauptprogramm übergeben
Hallo GoMatlab_Gast,
Die Kommunikation zwisch GUIs per ASSIGNIN('base') ist fragil und führt oft zu Problemen. Wenn man z.B. mehrere Instanzen des GUIs geöffnet hat, überschreiben sich die Werte gegenseitig. Zudem wird der base-Workspace mit Daten "zugemüllt", deren Herkunft man nicht kontrollieren kann.
Effizienter und sicherer wäre es, bei der Erstellung des Sub-GUIs den Handle des Main-GUIs in den GUIDATA des Sub-GUIs abzuspeichern. Dann kann man vom Sub-GUI aus direkt per GUIDATA in die ApplicationData des Main-GUI schreiben. Der fehlerträchtige Umweg über den Base-Workspace entfällt dann.
Gruß, Jan
GoMatlab_Gast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 26.08.2011, 10:25
Titel:
Hallo Jan,
danke für die Antwort, das mit GUIDATA habe ich probiert.
Kannst du mir erklären, wie ich den handle des MAINGUI in die SUBGUI verschiebe und auch wieder zurück? Scheinbar mache ich hier einen ganz banalen Fehler, den ich nicht sehe.
Im Grunde ist es doch nichts weiter, als den Handle beim Aufruf der SUBGUI mit zu übergeben, richtig?
starte ich das Programm ja erneut, was ich ja nicht will...
Die Befehle mit ASSIGNIN interpretierst du allerdings hier falsch. Den Befehl nutze ich lediglich zu Kontrollzwecken, um die Zwischenberechnungen auslesen zu können. Den Weg über base vermeide ich ansonsten schon. Ich habe das jetzt lediglich nicht rausgelöscht.
Habe diese Möglichkeit gerade einmal probiert. Seltsamerweise enthält der "neue" Handle lediglich den Handle, der in der SUB verändert bzw. neu belegt wurde. Alle anderen vordefinierten aus dem MAIN sind nicht existent.
danke für deine Links. Einige kannte ich schon (haben mir aber leider nicht geholfen, vermutlich, weil mir einige Grundlagen fehlen).
Zum ersten Link, dort steht:
Code:
% get the main_gui handle (access to the gui)
mainGUIhandle = main_gui;
% get the data from the gui (all handles inside gui_main)
mainGUIdata = guidata(mainGUIhandle);
% --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
ich denke du hast das noch nicht ganz verstanden. In deinen oberen geposteten Beiträgen hast du die opening_fcn und output_fcn so geändert, dass du nicht das Handle der Figure zurückgibst. Darum meckert Matlab auch mit deinem beschriebenen Fehler. Versuchs mal mit:
Code:
function Bla_OpeningFcn(hObject, eventdata, handles, varargin) % letzten Zeilen in der Opening_fcn % Choose default command line output for Angebotsprogramm
handles.output = hObject;% = figure handle
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.