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

m_file in einer Gui Callbackfunction aufrufen

 

Harald
Forum-Meister

Forum-Meister


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

Zitat:
Wenn ich das File separat ausführe funktioniert alles wunderbar, wenn ich es aber mit dem Pushbutton über den callback ausführen will dann passiert gar nix.

Wenn du den Debugger nutzen würdest, würdest du vermutlich feststellen, dass sehr wohl etwas passiert - nur dass die Variable in den Funktions-Workspace geschrieben wird und nach Beendigung des Callbacks nicht mehr zur Verfügung steht.

Zitat:
Ich bin mir nicht sicher ob ich das mit Application Data richtig verstanden habe, könntest du es mir mit deinen Worten erklären und vielleicht ein Beispiel machen?

In der verlinkten Doku findest du an sich Beispiele.

Nach dem run-Befehl:
Code:
setappdata(handles.figure1, 'Sudoku', SudokuMatrix);


Wenn du die Matrix an anderer Stelle wieder verwenden möchtest:
Code:
SudokuMatrix = getappdata(handles.figure1, 'Sudoku');


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


Thomas123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 09.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2016, 22:46     Titel:
  Antworten mit Zitat      
Hey Leute

Vielen Dank für den Tipp mit der Funktion Breakpoint.

Die Variable wird mir soweit normal geschrieben dann aber direkt wieder gelöscht und zwar bevor ich zu diesem Code hier komme: und zwar springt mir der Breakpoint zu feval(varargin{:}); in der sechsten Linie.


Code:
   % evaluate the callback now
    varargin{1} = gui_State.gui_Callback;
    if nargout
        [varargout{1:nargout}] = feval(varargin{:});
    else      
        feval(varargin{:});
    end
   
    % Set serializable of objects created in the above callback to off in
    % design time. Need to check whether figure handle is still valid in
    % case the figure is deleted during the callback dispatching.
    if designEval && ishghandle(fig)
        set(setdiff(findall(fig),beforeChildren), 'Serializable','off');
    end
else
    if gui_State.gui_Singleton
        gui_SingletonOpt = 'reuse';
    else
        gui_SingletonOpt = 'new';
    end



mfg

Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 09.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2016, 22:53     Titel:
  Antworten mit Zitat      
Hey Harald

für was steht figure1 in dem Code?

Code:
setappdata(handles.figure1, 'Sudoku', SudokuMatrix);


Muss da der Name des Files stehen Sudoku_Einlesen?


mfg

Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas123
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 09.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2016, 23:12     Titel:
  Antworten mit Zitat      
Hey Leute

Dies ist der Code:

Code:
handles=guidata(hObject);
set(handles.Sofortloesung, 'Enable','On');
set(handles.Lehrer, 'Enable','On');
set(handles.ZahlUmZahlMitTaste, 'Enable','On');
set(handles.ZahlUmZahlMitTimer, 'Enable','On');

run ('Sudoku_Einlesen')
setappdata(handles.SudokuMatrix, xlsread('Sudoku_Excel_Sheet.xlsx','A1:I9'), SudokuMatrix);
 


schreibe ich das setappdata richtig?

setappdata(f,'Daten',val);

f: handles.SudokuMatrix
val=Daten (in meinem Fall xlsread('Sudoku_Excel_Sheet.xlsx','A1:I9'))

Ich habe ebenfalls mal probiert mit handles.figure1 wie du es geschrieben hast Harald.

Die Fehlermeldung dazu:

Reference to non-existent field 'SudokuMatrix'.

Error in Gui_1_0>SudokuEinlesen_Callback (line 8Cool
setappdata(handles.SudokuMatrix, xlsread('Sudoku_Excel_Sheet.xlsx','A1:I9'), SudokuMatrix);

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

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

Error in
matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)Gui_1_0('SudokuEinlesen_Callback',hObject,eventdata,guidata(hObject))

Error while evaluating UIControl Callback
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Vielen Dank für den Tipp mit der Funktion Breakpoint.

Schön, dass du ihn nun auch umgesetzt hast.

Zitat:
schreibe ich das setappdata richtig?

Nein, und deswegen bekommst du die Fehlermeldung.

Du solltest wirklich das Tag der Figure angeben, und das ist figure1, wenn du es nicht geändert hast.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 09.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2016, 23:36     Titel:
  Antworten mit Zitat      
Hey Harald

Ich habe es mal wieder geschafft keine Fehlermeldung zu kriegen Very Happy
es springt aber wieder zu: feval(varargin{:}); und löscht mir die Variable.

Code:
   % evaluate the callback now
    varargin{1} = gui_State.gui_Callback;
    if nargout
        [varargout{1:nargout}] = feval(varargin{:});
    else      
        feval(varargin{:});
    end



Code:
setappdata(handles.figure1, 'Sudoku', SudokuMatrix);


Vielen Dank und einen schönen Sonntag^^


mfg

Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.12.2016, 01:20     Titel:
  Antworten mit Zitat      
Hallo,

hast du auch an geeigneter Stelle die getappdata-Zeile eingefügt?

Bitte lies das Beispiel zu setappdata / getappdata aus dem Link ggf. nochmal.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 09.11.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.12.2016, 15:02     Titel:
  Antworten mit Zitat      
Hallo

Code:
function button_callback(hObject,eventdata)
   currentval = getappdata(hObject.Parent,'slidervalue');
   diffval = getappdata(hObject.Parent,'difference');
   % For R2014a and earlier:
   % parentfig = get(hObject,'Parent');
   % currentval = getappdata(parentfig,'slidervalue');
   % diffval = getappdata(parentfig,'difference');

   display([currentval diffval]);
end


Das ist das einzige was ich gefunden habe Betreff getappdata, ich will die Daten aber nicht im Callback benützen sondern erstmal speichern am besten so das sie immer abrufbar sind das wollte ich erreichen mit der globalen Variable.

Ist mit hObject.Parent das Gui1 gemeint?

So habe ich setappdata eingebunden:

Code:
% --- Executes on button press in SudokuEinlesen.
function SudokuEinlesen_Callback(hObject, eventdata, handles)
% hObject    handle to SudokuEinlesen (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
handles=guidata(hObject);
set(handles.Sofortloesung, 'Enable','On');
set(handles.Lehrer, 'Enable','On');
set(handles.ZahlUmZahlMitTaste, 'Enable','On');
set(handles.ZahlUmZahlMitTimer, 'Enable','On');

run ('Sudoku_Einlesen')
setappdata(handles.figure1, 'Sudoku', SudokuMatrix);


Mit dem Breakpoint sehe ich das die Daten eingelesen werden die Variable SudokuMatrix wird geschrieben, wird dann aber wieder entfernt sobald der Pfeil bei setappdata landet.

wo gehört denn getappdata hin? Ich blicke da überhaupt nicht mehr durch, das kann doch nicht so schwer sein ein anderes M.File über einen Pushbutton auszuführen und die darin vorhandenen Daten im Workspace zu speichern.


mfg

Thomas
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.12.2016, 17:53     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
ich will die Daten aber nicht im Callback benützen sondern erstmal speichern am besten so das sie immer abrufbar sind das wollte ich erreichen mit der globalen Variable.

Nimm doch bitte mal Tipps an. An jeder erdenklichen Stelle, so auch hier, wird von globalen Variablen abgeraten - und so eben auch hier.
Wenn die Daten zur GUI gehören (und warum würdest du das sonst aus der GUI heraus aufrufen), dann ist es nicht sinnvoll, die Daten irgendwo anders abzulegen.

Zitat:
wo gehört denn getappdata hin?

Da, wo du innerhalb der GUI mit den Daten weiterarbeiten möchtest.

Zitat:
das kann doch nicht so schwer sein ein anderes M.File über einen Pushbutton auszuführen und die darin vorhandenen Daten im Workspace zu speichern.

Das ist an sich auch nicht schwer. Inzwischen weiß ich aber offen gesagt nicht, wie ich es noch erklären soll.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.12.2016, 18:53     Titel:
  Antworten mit Zitat      
Hallo Thomas123,

Zitat:
Das ist das einzige was ich gefunden habe Betreff getappdata, ich will die Daten aber nicht im Callback benützen sondern erstmal speichern am besten so das sie immer abrufbar sind das wollte ich erreichen mit der globalen Variable.

Höre auf unsere magischen Worte:

Lass das sein mit den globalen Variablen!

Wirklich! Man bohrt sich damit nur ein Loch ins Knie.
Generationen von Programmierern versuchen den Programmier-Anfängern diese Unsitte auszutreiben, weil sie schon so viele Software-Projekte haben scheitern sehen, die wegen des Spaghetti-GLOBAL-GOTO-Sumpfs einfach unwartbar und undebugbar geworden sind.

"Erstmal speichern" ist der falsche Ansatz.

Funktionen sind deutlich eleganter und zuverlässiger als Scripts. Versuche Sudoku_Einlesen inm eine Funktion umzuwandeln und lass Dir die Outputs zurückgeben. Dann kannst Du sich einfach im GUI-Callback wieder in die entsprechenden Felder schreiben.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.