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

Guidata - Variablaustausch GUI und m

 

Palina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.02.2014, 22:29     Titel: Guidata - Variablaustausch GUI und m
  Antworten mit Zitat      
Hallo Leute,

ich habe m.M.n. ein recht einfaches Problem, dass mir schon eine Weile Kopfzerbrechen bereitet. Ich würde gerne Variablen und structs mittels Guidata beliebig zwischen einer/mehreren GUIS und Files austauschen. Ersteinmal meine GUI (Test_GUI):

Code:

function varargout = Test_Gui(varargin)
% TEST_GUI MATLAB code for Test_Gui.fig
%      TEST_GUI, by itself, creates a new TEST_GUI or raises the existing
%      singleton*.
%
%      H = TEST_GUI returns the handle to a new TEST_GUI or the handle to
%      the existing singleton*.
%
%      TEST_GUI('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in TEST_GUI.M with the given input arguments.
%
%      TEST_GUI('Property','Value',...) creates a new TEST_GUI or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before Test_Gui_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to Test_Gui_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 Test_Gui

% Last Modified by GUIDE v2.5 24-Feb-2014 21:36:19

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @Test_Gui_OpeningFcn, ...
                   'gui_OutputFcn',  @Test_Gui_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 Test_Gui is made visible.
function Test_Gui_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 Test_Gui (see VARARGIN)

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

% Update handles structure
guidata(hObject, handles);

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


% --- Outputs from this function are returned to the command line.
function varargout = Test_Gui_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;
% varargout{2} = handles.Jahre;


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


Jahre = str2double(get(handles.Eingabe,'String'));
handles.Jahre = Jahre;
guidata(hObject,handles);

Test_differenz;

set (handles.Ausgabe,'String', num2str(Loesung, '%.2f'));

% Plot
axes(handles.axes1);
Grafik_GUI = plot(handles.Grafik,'r','LineWidth',2);
handles.Grafik_GUI=Grafik_GUI;
guidata(handles.axes1,handles);




function Eingabe_Callback(hObject, eventdata, handles)
% hObject    handle to Eingabe (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 Eingabe as text
%        str2double(get(hObject,'String')) returns contents of Eingabe as a double


% --- Executes during object creation, after setting all properties.
function Eingabe_CreateFcn(hObject, eventdata, handles)
% hObject    handle to Eingabe (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

 


und nun die File namens Test_differenz in welcher die Rechnung stattfindet:

Code:

function [Loesung,Grafik]= Test_differenz(Jahre)

%% Inputargument
% Jahre = 7;
guidata(hObject,handles.Jahre);

%% Rechnung
Raten=[-10 3 5 3 4 5 2 4 0 0 2 0 9];
Raten = Raten(1,1:Jahre);

Grafik = plot (Raten);

handles.Grafik = Grafik;

%% Outputargument
Loesung = irr(Raten);

handles.Loesung = Loesung;

guidata(hObject,handles);
 


Wie schnell zu erkennen ist möchte ich sowohl die Variable (Jahre - welche aus der GUI zur File geht) in die File bekommen, als auch die Variable Loesung (Aus File zur GUI) und einen Plot (Grafik) wieder zurückgeben. Wahrscheinlich habe ich einen Fehler in der Nutzung des GUIDATA. Denn der Fehler ist folgender:

Code:

Undefined function or variable 'hObject'.

Error in Test_differenz (line 5)
guidata(hObject,handles.Jahre);

Error in Test_Gui>Berechnen_Callback (line 88)
Test_differenz;

Error in gui_mainfcn (line 96)
        feval(varargin{:});

Error in Test_Gui (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in @(hObject,eventdata)Test_Gui('Berechnen_Callback',hObject,eventdata,guidata(hObject))

 
Error while evaluating uicontrol Callback
 


Was mache ich falsch? Und wie kann ich es besser machen mit GUIDATA?

Grüße
Palina


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.02.2014, 22:55     Titel:
  Antworten mit Zitat      
Hallo,

du musst die Variablen zwischen den Funktionen übergeben und das dann entsprechend aufrufen.

Ändere also die Funktionssignatur in
Code:
function [Loesung,Grafik]= Test_differenz(hObject, handles)


und den Aufruf in
Code:
[Loesung,Grafik]= Test_differenz(hObject, handles)


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Palina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.02.2014, 23:17     Titel:
  Antworten mit Zitat      
@ Harald: Herzlichen Dank für die Hilfe - doch nun zeigt er mir:

Code:

Undefined function or variable 'Jahre'.

Error in Test_differenz (line 9)
Raten = Raten(1,1:Jahre);

Error in Test_Gui>Berechnen_Callback (line 88)
[Loesung,Grafik]= Test_differenz(hObject, handles);

Error in gui_mainfcn (line 96)
        feval(varargin{:});

Error in Test_Gui (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in @(hObject,eventdata)Test_Gui('Berechnen_Callback',hObject,eventdata,guidata(hObject))

 
Error while evaluating uicontrol Callback
 


bei der angepassten GUI:

Code:

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


Jahre = str2double(get(handles.Eingabe,'String'));
handles.Jahre = Jahre;
guidata(hObject,handles.Jahre);

[Loesung,Grafik]= Test_differenz(hObject, handles);

set (handles.Ausgabe,'String', num2str(Loesung, '%.2f'));

% Plot
axes(handles.axes1);
Grafik_GUI = plot(handles.Grafik,'r','LineWidth',2);
handles.Grafik_GUI=Grafik_GUI;
guidata(handles.axes1,handles);
[...]
 


und der angepassten file:
Code:

function [Loesung,Grafik]= Test_differenz(hObject,handles)

%% Inputargument

guidata(hObject,handles.Jahre);

%% Rechnung
Raten=[-10 3 5 3 4 5 2 4 0 0 2 0 9];
Raten = Raten(1,1:Jahre);

Grafik = plot (Raten);

handles.Grafik = Grafik;

%% Outputargument
Loesung = irr(Raten);

handles.Loesung = Loesung;

guidata(hObject,handles);
 


Muss das handles anders übergeben werden?

Grüße
Palina
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.02.2014, 23:30     Titel:
  Antworten mit Zitat      
Hallo,

du musst in deiner Funktion schon Jahre aus handles herausholen, also
Code:
handles.Jahre


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Palina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.02.2014, 00:52     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke erstmal für deine Antwort, trotz der späten Stunde.
Ich verstehe halt einfach noch nicht, was das Programm macht. Du sagst Jahre muss ich aus handles holen. Gut nun nochmal das aktuelle file:

Code:

function [Loesung,Grafik]= Test_differenz(hObject,handles)

%% Inputargument
% Jahre = 7;
% guidata(hObject,handles.Jahre); %% warum?
 
 Jahre = str2double(get(handles.Jahre,'String')); %% besser Jahre = handles.Jahre?

%% Rechnung
Raten=[-10 3 5 3 4 5 2 4 0 0 2 0 9];
Raten = Raten(1,1:Jahre);

Grafik = plot (Raten);

handles.Grafik = Grafik;

%% Outputargument
Loesung = irr(Raten);

handles.Loesung = Loesung;

guidata(hObject,handles);
 


und die GUI:

Code:

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


Jahre = str2double(get(handles.Eingabe,'String'));
handles.Jahre = Jahre;
guidata(hObject,handles.Jahre);

[Loesung,Grafik]= Test_differenz(hObject, handles.Jahre);

set (handles.Ausgabe,'String', num2str(Loesung, '%.2f'));

% Plot
axes(handles.axes1);
Grafik_GUI = plot(handles.Grafik,'r','LineWidth',2);
handles.Grafik_GUI=Grafik_GUI;
guidata(handles.axes1,handles);
 


Er zeigt mir - je nachdem was ich mache, einen Fehler bei handles.Eingabe

Code:

Reference to non-existent field 'Eingabe'.

Error in Test_Gui>Berechnen_Callback (line 84)
Jahre = str2double(get(handles.Eingabe,'String'));

Error in gui_mainfcn (line 96)
        feval(varargin{:});

Error in Test_Gui (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in @(hObject,eventdata)Test_Gui('Berechnen_Callback',hObject,eventdata,guidata(hObject))

 
Error while evaluating uicontrol Callback
 


oder einen Fehler bei handles.Jahre an:
Code:

Attempt to reference field of non-structure array.

Error in Test_differenz (line 7)
 Jahre = str2double(get(handles.Jahre,'String'));

Error in Test_Gui>Berechnen_Callback (line 88)
[Loesung,Grafik]= Test_differenz(hObject, handles.Jahre);

Error in gui_mainfcn (line 96)
        feval(varargin{:});

Error in Test_Gui (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in @(hObject,eventdata)Test_Gui('Berechnen_Callback',hObject,eventdata,guidata(hObject))

 
Error while evaluating uicontrol Callback
 


Ich verstehe das Vorgehen im Programm gerade absolut nicht Sad
 
Palina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.02.2014, 01:20     Titel:
  Antworten mit Zitat      
Okay, ich habs hinbekommen - Danke Harald, der Einsatz von GUIDATA und die Verwendung der handles ist bei mir jedoch immer noch ein GLücksspiel. Weiteres Problem ist, nur die Grafik übernimmt er nicht mit. Bzw. sie wird nicht in der GUI dargestellt. Ein Fehler tritt nicht auf, wenn der Code wie folgt aussieht:

GUI

1.
Code:

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


Jahre = str2double(get(handles.Eingabe,'String'));
handles.Jahre = Jahre;
guidata(hObject,handles.Jahre);

[Loesung,Grafik]= Test_differenz(hObject, handles);

set (handles.Ausgabe,'String', num2str(Loesung, '%.2f'));

% Plot
handles.Grafik = Grafik; %% hier ist das Problem

axes(handles.axes1);
Grafik_GUI = plot(handles.Grafik1,'r','LineWidth',2);
handles.Grafik_GUI=Grafik_GUI;
guidata(handles.axes1,handles);
 


2. Wenn man dann die Zeile
Code:

handles.Grafik = Grafik
 


weglässt, wird mir zwar die Grafik übergeben, aber auf folgender Fehler:

Code:

Reference to non-existent field 'Grafik'.

Error in Test_Gui>Berechnen_Callback (line 94)
Grafik_GUI = plot(handles.Grafik,'r','LineWidth',2);

Error in gui_mainfcn (line 96)
        feval(varargin{:});

Error in Test_Gui (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in @(hObject,eventdata)Test_Gui('Berechnen_Callback',hObject,eventdata,guidata(hObject))

 
Error while evaluating uicontrol Callback

 


Muss ich die Grafik hier ebenfalls rausholen aus dem handles? Und wenn ja, warum funktioniert das nicht - siehe 1.

Danke,
die verzweifelte PAlina
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.02.2014, 09:07     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Weiteres Problem ist, nur die Grafik übernimmt er nicht mit.

Und das bedeutet was?

Eine solche Zeile ist vermutlich nicht sinnvoll:
Code:
guidata(hObject,handles.Jahre);

Stattdessen muss es heißen:
Code:
guidata(hObject,handles);


Im Zweifelsfall sollte auch die Doku helfen - ich würde die Befehle nur in der Form verwenden, wie sie vorgesehen sind.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Palina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.02.2014, 12:24     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

Zitat:
Weiteres Problem ist, nur die Grafik übernimmt er nicht mit.

Und das bedeutet was?

Grüße,
Harald


Hallo Harald, herzlich Dank für deine 24h Hilfe! Schön das es noch so hilfsbereite Menschen hier im Forum zu gibt.

Wenn ich in der Funktion, die Grafik plote, übergebe ich das an die Variable Grafik, siehe hier:
Code:

%% Rechnung
Raten=[-10 3 5 3 4 5 2 4 0 0 2 0 9];
Raten = Raten(1,1:Jahre);

Grafik = plot (Raten); % plot an Variable Grafik

handles.Grafik = Grafik; % Variable Grafik an handles

%% Outputargument
Loesung = irr(Raten);

handles.Loesung = Loesung;

guidata(hObject,handles); % handles speichern
 


In der GUI wird Sie dann aufgerufen und dargestellt:
Code:

[Loesung,Grafik]= Test_differenz(hObject, handles);

% Plot
axes(handles.axes1);
Grafik_GUI = plot(handles.Grafik,'r','LineWidth',2);
handles.Grafik_GUI=Grafik_GUI;
guidata(handles.axes1,handles);
 


Das funktioniert soweit (Plot erscheint in GUI!?), nur zeigt er mir entsprechend dessen, wie oben genannt folgenden Fehler an:
Code:

Reference to non-existent field 'Grafik'.

Error in Test_Gui>Berechnen_Callback (line 94)
Grafik_GUI = plot(handles.Grafik,'r','LineWidth',2);

Error in gui_mainfcn (line 96)
        feval(varargin{:});

Error in Test_Gui (line 42)
    gui_mainfcn(gui_State, varargin{:});

Error in @(hObject,eventdata)Test_Gui('Berechnen_Callback',hObject,eventdata,guidata(hObject))

 
Error while evaluating uicontrol Callback
 


Wie kann das denn nicht vorhanden sein, aber trotzdem geplottet werden?
Grüße
Palina
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.02.2014, 12:51     Titel:
  Antworten mit Zitat      
Hallo,

bitte mal die komplette GUI anhängen und die Aktionen darin schildern, die die Fehlermeldung zur Folge haben.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Palina

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.02.2014, 13:48     Titel:
  Antworten mit Zitat      
Hallo Harald,

anbei die GUI und die file.

Grüße
Palina

Test.rar
 Beschreibung:

Download
 Dateiname:  Test.rar
 Dateigröße:  6.48 KB
 Heruntergeladen:  342 mal
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.02.2014, 16:28     Titel:
  Antworten mit Zitat      
Hallo,

du erweiterst handles in Testdifferenz, das ist aber nur eine lokale Variable. Dann aktualisierst du die GUI-Daten. In der Hauptfunktion wird aber noch immer handles verwendet, also inzwischen veraltete GUI-Daten.

Eine Möglichkeit: Füge nach Zeile 88 folgendes ein:
Code:
handles = guidata(hObject);


Ich persönlich bevorzuge getappdata/setappdata zu guidata, da es meines Erachtens klarer und sicherer ist.

Grüße,
Harald
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.