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

Handle aus Sub-GUI zurück ins Hauptprogramm übergeben

 

GoMatlab_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.08.2011, 07:04     Titel: Handle aus Sub-GUI zurück ins Hauptprogramm übergeben
  Antworten mit Zitat      
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               = [];

% Speichern des handle
guidata(hObject, handles);

function varargout = 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)

    handles.auswahl = [];
    name = SUBGUI(handles.auswahl)
    set(handles.auswahl, 'String', name)
    assignin('base', 'name', name)
    handles
 


Und in der SUBGUI:
Code:

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.
function varargout = 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


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.08.2011, 08:59     Titel: Re: Handle aus Sub-GUI zurück ins Hauptprogramm übergeben
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
GoMatlab_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.08.2011, 10:25     Titel:
  Antworten mit Zitat      
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?
Code:

...
SUBGUI(handles)
...
 


und in der SUB diesen dann unter OpeningFcn zu speichern:

Code:

guidata(hObject, handles)
 


Dann kann ich die handles.X nach meinen Wünschen dort aufrufen und weiter berechnen bzw. neue handle.Y definieren.

Am Ende der SUBGUI muss ich meinen veränderten handle aber wieder an MAIN zurückschicken. Wie mache ich das?
mit
Code:
MAIN(handle)
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.
 
BlackDread
Forum-Century

Forum-Century


Beiträge: 212
Anmeldedatum: 11.05.11
Wohnort: ---
Version: 2015a
     Beitrag Verfasst am: 26.08.2011, 10:39     Titel:
  Antworten mit Zitat      
wenn du die SUBGUI mit SUBGUI(handles) aufrufst, verwende doch
Code:
handles = SUBGUI(handles)


einfach handles als Rückgabeparameter

natürlich musst die die SUBGUI Fcn auch richtig definieren

Code:
function handles = SUBGUI(handles)


(oder irre ich mich da grad? Hab grad nicht die Möglichkeit das zu testen)

Gruß Chris
Private Nachricht senden Benutzer-Profile anzeigen
 
koffer-murphy
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 15.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.08.2011, 10:48     Titel:
  Antworten mit Zitat      
So. Login wiedergefunden Smile

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

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 26.08.2011, 10:53     Titel:
  Antworten mit Zitat      
Hallo

Schaue doch mal folgende Quellen an:

http://blinkdagger.com/matlab/matla.....anage-setting-parameters/

http://blinkdagger.com/matlab/matla.....etween-two-separate-guis/

http://www.gomatlab.de/2-guis-werte.....,highlight,zwei+guis.html

http://www.gomatlab.de/kommunikation-zwischen-2-guis-t11005.html

http://www.gomatlab.de/callback-fun.....10832,highlight,guis.html
Private Nachricht senden Benutzer-Profile anzeigen
 
koffer-murphy
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 15.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.08.2011, 13:02     Titel:
  Antworten mit Zitat      
Hallo Denny,

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);

 


dort (Zeile 3) wird der handle gleich dem Programmnamen gesetzt?
Daran stört sich Matlab offenbar, denn Matlab spuckt folgende Fehlermeldung aus:

Code:

??? Error while evaluating uicontrol Callback

??? Error using ==> guidata at 89
H must be the handle to a figure or figure descendent.

Error in ==> SUB_Auswahl>pushbutton1_Callback at 111
mainGUIData = guidata(mainGUIhandle)

Error in ==> gui_mainfcn at 96
        feval(varargin{:});

Error in ==> SUB_Auswahl at 42
    gui_mainfcn(gui_State, varargin{:});

Error in ==>
@(hObject,eventdata)SUB_Auswahl('pushbutton1_Callback',hObject,eventdata,guidata(hObject))

 
??? Error while evaluating uicontrol Callback
 
Private Nachricht senden Benutzer-Profile anzeigen
 
koffer-murphy
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 15.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.08.2011, 09:29     Titel:
  Antworten mit Zitat      
Kann mir hier vielleicht jemand nochmal einen Tip geben? Ich hab immer noch dieses Problem!

Diese Meldung hier muss m.E. des Pudels Kern sein:
Code:

H must be the handle to a figure or figure descendent.
 


Der Code meiner Sub-GUI lautet:

Code:

% --- 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)

mainGUIHandle = Auswertungsprog;
mainGUIData = guidata(mainGUIHandle);
%handles.auswahl = (get(handles.popupmenu1, 'Value'))
set(mainGUIData.auswahl, 'Value', get(handles.popupmenu1, 'Value'));

guidata(Auswertungsprog, mainGUIData);

close(SUB_Auswahl);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 29.08.2011, 13:36     Titel:
  Antworten mit Zitat      
Hey,

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

% Update handles structure
guidata(hObject, handles);

function varargout = Bla_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;% = figure handle
 

So wird das standardmäßig von GUIDE erzeugt und das Figurehandle wird mit dem Funktionsaufruf übergeben... In diesem Fall:
Code:

% aufruf der Subgui aus Maingui
hfigSub = Bla;% figurehandle subgui
SubGuiHandles = guidata(hfigSub);% handlestruct subgui
 

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