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

Sub GUI verschwindet hinter Main GUI

 

Deniz
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 31.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2011, 12:17     Titel: Sub GUI verschwindet hinter Main GUI
  Antworten mit Zitat      
Hallo,
ich habe ja erst kürzlich nachgefragt bzgl der Erstellung eines Sub GUIs.
Jetzt ist es so, dass ich Daten aus der Main im Sub einlese. Das funktioniert an sich auch alles, jedoch gibt es 2 "Schönheitsfehler":

Nach dem Drücken des Pushbuttons im Sub GUI (um die Daten einzulesen aus der Main) ruckelt das Main zweimal und das Sub GUI verschwindet hinter der Main.
Mein Main GUI ist zentriert auf dem Bildschirm und füllt ihn vollkommen aus. Um im Sub GUI weiterarbeiten zu können, muss ich es erst wieder anklicken, was eigtl nicht sein sollte.

Hat jemand einen Tipp, um dieses Problem zu lösen?

Danke schon mal!

Gruß
Deniz
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: 14.04.2011, 13:01     Titel:
  Antworten mit Zitat      
Hey,

mmhh das hört sich ehr danach an als würdest du das m-file deiner MainGui nach betätigen des Buttons in der SubGui aufrufen. Denn weder wackelt eine GUI noch kommt sie automatisch nach vorne wenn man dies nicht irgendwo im Quelcode schreibt.

Fenster kannst du folgendermaßen nach vorne holen:
Code:

figure(figure_handle)
set(0,'CurrentFigure',figure_handle)
 


MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
Deniz
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 31.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2011, 13:11     Titel:
  Antworten mit Zitat      
Hey Marco,
Ich rufe zunächst mein MainGUI auf. Dort betätige ich einen Button, wodurch ich Werte an ein Simulink-Modell weiterleite und dann berechnete Werte in die Main zurückhole. In der Main befindet sich ein weiterer Button wodurch ich ein Sub GUI aufrufe.
In der Sub betätige ich wiederrum einen Button, um Werte aus der Main der Sub einzulesen.

MfG
Deniz
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: 14.04.2011, 13:17     Titel:
  Antworten mit Zitat      
Hey,

ja das habe ich schon verstanden. Nur nachdem du den Button deiner SubGui betätigst um handles in der MainGui zu verändern fängt diese nicht ohne Grund an zu wackeln wie dus oben geschrieben hast. Und schon garnicht wird diese zur Current Figure wenn dus nicht expliziet irgendwo programmiert hast... Dementsprechend denke ich, dass du das irgendwo in deinem Quellcode das so programmiert hast, dass nach betätigen des Pushbuttons der SubGui die MainGui die Current Figure wird...

MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
Deniz
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 31.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2011, 13:38     Titel:
  Antworten mit Zitat      
Hey,
also um meine Daten aus der Main (CR_Prozess) in der Sub einzulesen, steht in der pushbutton Callback folgeneder Code(nach einem Tutorial):

Code:

% --- Executes on button press in Daten_einlesen.
function Daten_einlesen_Callback(hObject, eventdata, handles)
% hObject    handle to Daten_einlesen (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

%stores the figure handle of Main(CR_Prozess) GUI here
CR_ProzessFigureHandle  = CR_Prozess;
 
%stores the GUI data from Main GUI here

CR_ProzessData = guidata(CR_ProzessFigureHandle);
 
%store the input from Main GUI
CR_Prozess_input1 = get(CR_ProzessData.Temperatur2,'String');
 
set(handles.CR_Prozess_Temperatur2,'String',CR_Prozess_input1);
 


Ansonsten habe ich eigtl. keinen weiteren Code eingefügt.

Gruß
Deniz
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: 15.04.2011, 08:01     Titel:
  Antworten mit Zitat      
Hey,

ja da sieht man doch schon den Übeltäter.
Code:

CR_ProzessFigureHandle  = CR_Prozess;
 

Du rufst hier erneut die Mainfigure auf. Besser ist beim Aufruf der SubGui das handle der Maingui mitzuübergeben...
Code:

% Aufruf SubGui aus Maingui
DeineSubGui(handles.figure1)

function SubGuiOpeningFcn(hObject, eventdata, handles, varargin)
handles.CR_Prozess= varargin{1};
guidata(hObject,handles)

function Daten_einlesen_Callback(hObject, eventdata, handles)
CR_ProzessData = guidata(handles.CR_Prozess);
%store the input from Main GUI
CR_Prozess_input1 = get(CR_ProzessData.Temperatur2,'String');
set(handles.CR_Prozess_Temperatur2,'String',CR_Prozess_input1);
 


MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
Deniz
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 31.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.04.2011, 18:23     Titel:
  Antworten mit Zitat      
Hey Marco,
ich habe jetzt alles eingegeben, jedoch kommt folgende Fehlermeldung:

Code:

??? Reference to non-existent field 'CR_Prozess'.

Error in ==> sub_gui_Verdampfer>Daten_einlesen_Callback at 524
CR_ProzessData = guidata(handles.CR_Prozess);

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

Error in ==> sub_gui_Verdampfer at 43
    gui_mainfcn(gui_State, varargin{:});

Error in ==>
@(hObject,eventdata)sub_gui_Verdampfer('Daten_einlesen_Callback',hObject,eventdata,guidata(hObject))

 
??? Error while evaluating uicontrol Callback
 


Ich weiß nicht was ich falsch gemacht habe, jedoch hab ich das im allgemeinen mit den handles noch nicht 100%ig verstanden.
auch die Zeile mit dem varargin{1} kann ich nur blind abtippen, weil ich das bisher nicht gebraucht habe.

Ich hoffe die Fehlermeldung hilft dir weiter. Bzw. wenn du weitere Infos brauchst geb ich sie natürlich gerne.

Gruß
Deniz
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 17.04.2011, 01:33     Titel:
  Antworten mit Zitat      
Hallo,

was dir Matlab mitzuteilen versucht ist, dass es in:
Code:

sub_gui_Verdampfer>Daten_einlesen_Callback
 

es kein Struct filed mit dem Namen CR_Prozess gibt, d.h. es gibt "handles. CR_Prozess" nicht. Hasst du, wie Marco bereits beschrieben hat, in der SubGuiOpeningFcn "handles.CR_Prozess" definiert und die handles Struktur aktualisiert (guidata):
Code:

function SubGuiOpeningFcn(hObject, eventdata, handles, varargin)
handles.CR_Prozess= varargin{1};
guidata(hObject,handles)
 

Wie schon beschriben musst du beim Aufruf deines SubGUIs die Variablen aus der MainGUI übergeben:
Code:

SubGui(handles.figure1) % handes.figure1 ist i.d.R. das Maingui (insofern du nicht den Tag-namen manuell geändert hasst)
 

Das varargin bedeutet nur, dass eine variable Anzahl von Variablen an eine Funktion übergeben werden kann (falls du eben nicht davor weisst wie viele Variablen übergeben werden sollen). Kleines Beispiel:
Code:

Zahl = 1;
Farbe = 'blau';
Buchstabe = 'A';

BSP(Zahl,Farbe,Buchstabe) % Aufruf der Funktion

function BSP(varargin) % die Funktion
Zahl = varargin{1};
Farbe = varargin{2};
Buchstabe = varargin{3};
 

In der Regel wird bei variabler Anzahl von Eingangsvariablen einer Funktion mit:
Code:

überprüft wie viele Variablen übergeben wurden, und dementsprechend die Funktion ausgefürt. D.h. um bei obigen Bsp. zu bleiben, wird beispielsweise nur die Zahl übergeben (nargin==1) so wird eine Berechnung ausgeführt, wird Zahl und Farbe übergeben (nargin==2) wird z.B. ein Punkt mit dieser Farbe gezeichnet...usw.

Hoffe jetzt sind alle Unklarheiten beseitigt. Aber wie schon gesagt Marco sein Code ist genau das was du brauchst, ich hoffe eben nur das es jetzt alles ein wenig verständlicher ist.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Deniz
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 90
Anmeldedatum: 31.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.04.2011, 15:07     Titel:
  Antworten mit Zitat      
Hi Sco,
danke dir für die ausführliche Antwort. Und ja, ich habe es wirklich besser verstanden jetzt!
Aber das mit dem varargin ist mir doch nicht ganz klar. Also ich verstehe, dass ich damit Variablen aus der Main an die Sub übergebe.
Und da es bei mir nicht funktioniert ( Fehlerbeschreibung: Undefined Variable varargin{1}) verstehe ich das jetzt so, dass ich wie in deinem Zahlenbeispiel beschrieben varargin{1] definieren muss.
Wenn ich meiner Sub 5 Variablen übergebe, muss ich dann in der Callback der Sub
Code:

handles.CR_Prozess= varargin{5};
guidata(hObject,handles)
sub_gui_Zwischenueberhitzung(handles.figure1)
 

schreiben?

Mein Code schaut momentan aus wie folgt:
Callback der Sub(Zwischenueberhitzung)
Code:

function Zwischenueberhitzung_Starten_Callback(hObject, eventdata, handles)

handles.CR_Prozess= varargin{1};
guidata(hObject,handles)
sub_gui_Zwischenueberhitzung(handles.figure1)
 


Die opening function der Sub
Code:

function sub_gui_Zwischenueberhitzung_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;

handles.CR_Prozess= varargin{1};


% Update handles structure
guidata(hObject, handles);
 


Und hier die Callback der Daten_einlesen
Code:

function Daten_einlesen_Callback(hObject, eventdata, handles)

CR_ProzessData = guidata(handles.CR_Prozess);

CR_Prozess_input1 = get(CR_ProzessData.Temperatur2,'String');

set(handles.CR_Prozess_Temperatur2,'String',CR_Prozess_input1);


set(handles.CR_Prozess_Temperatur3,'String',num2str(T3));
 


Ich hätte jetzt aber gedacht, dass varargin{1} in der Callback der Sub bedeutet, dass ich alle benötigten Variablen für die Sub aus der Main übergebe, es kommt aber folgender Fehler:
Code:

??? Undefined variable varargin.

Error in ==> CR_Prozess>Zwischenueberhitzung_Starten_Callback at 1035
handles.CR_Prozess= varargin{1};

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

Error in ==> CR_Prozess at 17
    gui_mainfcn(gui_State, varargin{:});

Error in ==>
@(hObject,eventdata)CR_Prozess('Zwischenueberhitzung_Starten_Callback',hObject,eventdata,guidata(hObject))

 
??? Error while evaluating uicontrol Callback
 


Ich habe das Problem bis jetzt so umgangen, dass ich die Befehle load und save verwende, da ich meine Datei aber später in eine .exe umwandeln möchte, glaube ich nicht, dass das mit save und load noch funtionieren wird.

MfG
Deniz
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: 21.04.2011, 18:03     Titel:
  Antworten mit Zitat      
Hey,
Zitat:

Ich habe das Problem bis jetzt so umgangen, dass ich die Befehle load und save verwende, da ich meine Datei aber später in eine .exe umwandeln möchte, glaube ich nicht, dass das mit save und load noch funtionieren wird.

Auch solche Sachen gehen natürlich später nachdem man es kompiliert hat...

Aber nun zu deinen Problemen. Ich denke, ganz hast du das noch nicht verstanden. Die Callbacks in vom GUIDE erstellten Guis haben kein varargin sondern nur (hObject, eventdata, handles). Genau das sagt auch die Fehlermeldung. Das varargin taucht z.B. bei der Opening_fcn auf. Das einfachste wäre du debuggst mal in deiner Opening_fc z.B. in sub_gui_Zwischenueberhitzung_OpeningFcn. Einfach ein Breakpoint setzen und dann durch "next Step (F10)" weiter beobachten was passiert. Das gleiche kannst du auch in den Callbacks machen. Dann siehst du genau was im Workspace ist und welche Variablen vorhanden sind und welche nicht...
Beispiel:
Code:

% Aufruf deiner Sub Gui mit 3 Variablen
sub_gui_Zwischenueberhitzung(a,b,c)

function sub_gui_Zwischenueberhitzung_OpeningFcn(hObject, eventdata, handles, varargin)
handles.a =  varargin{1};
handles.b =  varargin{2};
handles.c =  varargin{3};
guidata(hObject,handles)% speichern der daten

function irgendein_Callback_von_sub_gui_Zwischenueberhitzung(hObject, eventdata, handles)
% deine beim Aufruf der gui sub_gui_Zwischenueberhitzung übergebenen Variablen
a = handles.a;
b = handles.b;
c = handles.c;
 


Ich hoffe dass es dir so weiterhilft. Ansonsten gibs darüber auch in der Hilfe massig Beispiele. Auch zu varargin, varargout, nargin, etc wirst du da fündig...

MfG Marco
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: 21.04.2011, 22:42     Titel:
  Antworten mit Zitat      
Hey,

so ich habe wegen der momentanen Nachfrage mal eine Tuto geschrieben -> http://www.gomatlab.de/variablen-au.....i-uebertragen-t17665.html

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.