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

Variablen aus Main Gui in Sub Gui übertragen

 

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:39     Titel: Variablen aus Main Gui in Sub Gui übertragen
  Antworten mit Zitat      
Hey,

diese Tuto befasst sich damit, wie man 2 GUIs interaktiv "verlinken" kann. Es gibt eine GUI1 (Maingui) und eine GUI2 (Subgui). Soll heißen, dass die Subgui nur aus der Maingui gestartet werden kann. Der Datentransfer geschieht in beide Richtungen. Natürlich ist dies nur ein kleines Beispiel, welches man noch beliebig erweitern kann.

Das Wichtigste ist, dass sowohl der Maingui wie auch der Subgui die jeweiligen figurehandle bekannt sein müssen. In diesem Fall besitzt die Mauingui den Tag GUI1 und die Subgui den Tag GUI2. Weil in den Handlestrukturen der jeweiligen figures die Tags als Feld gespeichert sind (von allen garfischen Objekten) ist dies wichtig zu Wissen.

Faustregeln:
1. Beim Aufruf der Subgui (GUI2) aus der Maingui (GUI1) das Handle der Maingui übergeben und als Rückgabewert das Handle der Subgui zurückverlangen. Diese dann mittels guidata in die Handlestrukturenle der jeweiligen andern mittels guidata speichern.
2. Jeder Callback enthält die Handlestruktur (handles). Somit ist in jedem Callbackworkspace (jede Funktion hat ihren eigen WS mit Ausnahme von nested Funktionen, die auch auf den WS der unterliegenden Funktion zugreifen können aber nicht andersherum) alles bekannt was man braucht. In diesem Fall kann man sich die Handlestruktur des jeweiligen figures mit guidata(handles.GUI1) bzw. guidata(handles.GUI2) laden.
3. Es ist natürlich wichtig immer abzufragen, ob die jeweilige andere figure offen ist, weil es sonst zu Fehlermeldungen kommt. Und das Geräusch der Fehlermeldung geht einem ja auf Dauer auch auf den Keks (nur nebenbei: man kann dieses auch ausschalten...). Für die Abfrage sind ishandle und isfield sehr nützlich.
4. guidata (zum Abspeichern) muss nur benutzt werden, wenn sich das Handlestruct ändert. Soll heißen, wenn
Code:

handles.NeueVariable = 'Peterchen';
% oder
handles.x = handles.x+1;
 

erweitert oder geändert wurde. Alle grafischen oder selbstgeschriebenen Handles (z.B. String vom Textobjekt ändern) müssen nicht mittels guidata geupdatet werden, weil es Instanzen aus Handleklassen sind und nicht aus Valueklassen (nachzulesen in der Matlabhilfe).

So nun ein paar Zeilen zum Nachvollziehen (Anbei sind noch die m & fig Files). Wegen des Wiederkennungswertes (oder falls Matlab gerade nicht installiert ist) habe ich die GUIDE- Kommentare und den Quellcode im Folgenden gepostet.

GUI1
Code:

function varargout = GUI1(varargin)
% GUI1 MATLAB code for GUI1.fig
%      GUI1, by itself, creates a new GUI1 or raises the existing
%      singleton*.
%
%      H = GUI1 returns the handle to a new GUI1 or the handle to
%      the existing singleton*.
%
%      GUI1('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in GUI1.M with the given input arguments.
%
%      GUI1('Property','Value',...) creates a new GUI1 or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before GUI1_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to GUI1_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help GUI1

% Last Modified by GUIDE v2.5 21-Apr-2011 21:41:38

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @GUI1_OpeningFcn, ...
                   'gui_OutputFcn',  @GUI1_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before GUI1 is made visible.
function GUI1_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 GUI1 (see VARARGIN)

% Choose default command line output for GUI1
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes GUI1 wait for user response (see UIRESUME)
% uiwait(handles.GUI1);


% --- Outputs from this function are returned to the command line.
function varargout = GUI1_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.output;



function edit1_Callback(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit1 as text
%        str2double(get(hObject,'String')) returns contents of edit1 as a double


% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in pushbutton_neuer_text.
function pushbutton_neuer_text_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_neuer_text (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if ~isfield(handles,'press')
    if ~isempty(get(handles.edit1,'String'))
        handles.press = numel(get(handles.edit1,'String'))+1;
        str = get(handles.edit1,'String');
        str(end+1) = {sprintf('Pressed %0.0f',handles.press)};
        set(handles.edit1,'String',str);
    else
        handles.press = 1;
        set(handles.edit1,'String',{sprintf('Pressed %0.0f',handles.press)})
    end
else
    str = get(handles.edit1,'String');
    handles.press = handles.press + 1;
    str(end+1) = {sprintf('Pressed %0.0f',handles.press)};
    set(handles.edit1,'String',str);
end
guidata(hObject,handles);


% --- Executes on button press in pushbutton_in_gui2_uebernehmen.
function pushbutton_in_gui2_uebernehmen_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_in_gui2_uebernehmen (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if isfield(handles,'GUI2')% check ob GUI2 in handles entahlten ist
    hadnlesGUI2 = guidata(handles.GUI2);% handlesstruktur der Gui2 laden
    set(hadnlesGUI2.edit1,'String',get(handles.edit1,'String')) % Sring der editbox der Gui2 setzen
    figure(handles.GUI2) % bringt GUI2 zur front
else
    msgbox('Bitte öffnen Sie erst GUI 2!','GUI 2 existiert nicht!','help','modal')
end

% --- Executes on button press in pushbutton_open_gui2.
function pushbutton_open_gui2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_open_gui2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if ~isfield(handles,'GUI2') % check ob GUI2 in handles entahlten ist
    handles.GUI2 = GUI2(handles.GUI1); % handlesstruktur der Gui1 laden
    guidata(handles.GUI1,handles) % speichern der handlestruktur (guidata(hObject,handles) würde auch gehen)
else
   figure(handles.GUI2); % bringt GUI2 zur front
end


% --- Executes when user attempts to close GUI1.
function GUI1_CloseRequestFcn(hObject, eventdata, handles)
% hObject    handle to GUI1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if isfield(handles,'GUI2')
    delete(handles.GUI2)
end
% Hint: delete(hObject) closes the figure
delete(hObject);
 


GUI2
Code:

function varargout = GUI2(varargin)
% GUI2 MATLAB code for GUI2.fig
%      GUI2, by itself, creates a new GUI2 or raises the existing
%      singleton*.
%
%      H = GUI2 returns the handle to a new GUI2 or the handle to
%      the existing singleton*.
%
%      GUI2('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in GUI2.M with the given input arguments.
%
%      GUI2('Property','Value',...) creates a new GUI2 or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before GUI2_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to GUI2_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help GUI2

% Last Modified by GUIDE v2.5 21-Apr-2011 21:13:52

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @GUI2_OpeningFcn, ...
                   'gui_OutputFcn',  @GUI2_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before GUI2 is made visible.
function GUI2_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 GUI2 (see VARARGIN)
try
    handles.GUI1 = varargin{1}; % handle des figures GUI1 in handlestruktur der GUI2
   
    % Choose default command line output for GUI2
    handles.output = hObject;
   
    % Update handles structure
    guidata(hObject, handles);
catch %#ok
    uiwait(msgbox('Bitte erst GUI1 starten!','GUI1 Starten','error','modal'))
    delete(hObject)
end

% UIWAIT makes GUI2 wait for user response (see UIRESUME)
% uiwait(handles.GUI2);


% --- Outputs from this function are returned to the command line.
function varargout = GUI2_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
try
varargout{1} = handles.output;
catch %#ok  
end



function edit1_Callback(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit1 as text
%        str2double(get(hObject,'String')) returns contents of edit1 as a double


% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in pushbutton_neuer_text.
function pushbutton_neuer_text_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_neuer_text (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if ~isfield(handles,'press')
    if ~isempty(get(handles.edit1,'String'))
        handles.press = numel(get(handles.edit1,'String'))+1;
        str = get(handles.edit1,'String');
        str(end+1) = {sprintf('Pressed %0.0f',handles.press)};
        set(handles.edit1,'String',str);
    else
        handles.press = 1;
        set(handles.edit1,'String',{sprintf('Pressed %0.0f',handles.press)})
    end
else
    str = get(handles.edit1,'String');
    handles.press = handles.press + 1;
    str(end+1) = {sprintf('Pressed %0.0f',handles.press)};
    set(handles.edit1,'String',str);
end
guidata(hObject,handles);


% --- Executes on button press in pushbutton_in_GUI1_uebernehmen.
function pushbutton_in_GUI1_uebernehmen_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_in_GUI1_uebernehmen (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if ishandle(handles.GUI1) % abfrage ob GUI1 noch offen ist (also valid ist)
    hadnlesGUI1 = guidata(handles.GUI1);% handlestruktur der GUI1 laden
    set(hadnlesGUI1.edit1,'String',get(handles.edit1,'String')) % setzen des editfeldes der GUI1
    figure(handles.GUI1) % bringt GUI1 zur front
else
    uiwait(msgbox('GUI1 wurde geschlossen! GUI 2 wird auch geschlossen!','GUI 1 existiert nicht mehr!','help','modal'))
    delete(handles.GUI2)
end

% --- Executes when user attempts to close GUI2.
function GUI2_CloseRequestFcn(hObject, eventdata, handles)
% hObject    handle to GUI2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
handlesGUI1 = guidata(handles.GUI1); % laden der handlestruktur der GUI1
handlesGUI1 = rmfield(handlesGUI1,'GUI2');% feld löschen GUI2 aus handlestruktur GUI1
guidata(handlesGUI1.GUI1,handlesGUI1)% update handlestruktur GUI1

% Hint: delete(hObject) closes the figure
delete(hObject);

 


Es gibt natürlich auch noch andere Methoden soetwas zu Realisieren (setappdata/getappdata/rmappdata, Nested Funktionen (benötigt keine Handlestruktur aber wär sinniger selbst zu Programmieren, bzw. die Layout_fc vom GUIDE zu exportieren und dann alle Callbacks in Nested Funktionen zu packen), Userdata zu benutzen).
Auch Javaobjekte sind leicht zu integrieren, insofern die standard Matlab uicontrols etc nicht genügen. Hierfür ist z.B. eine Seite zu empfehlen -> http://undocumentedmatlab.com/ . Ich glaube damit schließe ich jetzt ersteinmal ab.

Ich hoffe Ihr könnt hiermit etwas anfangen...

Frohe Ostern und Grüße aus Dortmund

Marco

GUI2.m
 Beschreibung:
m-File GUI2 (Subgui)

Download
 Dateiname:  GUI2.m
 Dateigröße:  6.02 KB
 Heruntergeladen:  1454 mal
GUI2.fig
 Beschreibung:
fig-File GUI2 (Subgui)

Download
 Dateiname:  GUI2.fig
 Dateigröße:  2.55 KB
 Heruntergeladen:  1429 mal
GUI1.m
 Beschreibung:
m-File GUI1 (Maingui)

Download
 Dateiname:  GUI1.m
 Dateigröße:  6.15 KB
 Heruntergeladen:  1447 mal
GUI1.fig
 Beschreibung:
Fig File GUI1 (Maingui)

Download
 Dateiname:  GUI1.fig
 Dateigröße:  2.66 KB
 Heruntergeladen:  1383 mal
Private Nachricht senden Benutzer-Profile anzeigen


ms1080
Forum-Century

Forum-Century


Beiträge: 203
Anmeldedatum: 02.12.09
Wohnort: ---
Version: R2009
     Beitrag Verfasst am: 04.05.2011, 07:07     Titel:
  Antworten mit Zitat      
Hi

schön erklärt und schönes Beispiel, auch wenn ich es leider noch nicht bei mir hinbekommen habe, aber ist es mit den beiden Programmen, wenn ich Sie mit Hilfe des deploxment-tool weitergeben will. wird das GUI2 bei der Anwedung mit dem deploymenttool automatisch mitgenommen?

MfG

Nitram Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 04.05.2011, 07:58     Titel:
  Antworten mit Zitat      
Hey Nitram,
Zitat:

auch wenn ich es leider noch nicht bei mir hinbekommen habe

was genau macht dir denn Probleme?

Mit dem Deploytool sollte es kein Problem sein. Einfach Gui1.m als Mainfunktion hinzufügen, den Rest sollte er von selber finden. Achte bitte darauf, dass auch beide fig- Files hinzugefügt werden (das siehst du während des Kompelierens). Alle Files sollten natürlich im Current Path liegen...

MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 01.02.2012, 11:02     Titel:
  Antworten mit Zitat      
Mein Beispiel von oben ist ein GUIDE Beispiel. Auf der folgenden Seite gibt es eine sehr umfangreiche Beschreibung von GUI- Programmierung in Matlab und einen kurzen Ausflug zu Javaobjekten in Matlab.

-> http://www.mathworks.com/matlabcent.....-41-complete-gui-examples

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