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

Gui Datenübergabe zwischen Funktionen

 

MasterofDesaster
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 17.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2009, 11:16     Titel: Gui Datenübergabe zwischen Funktionen
  Antworten mit Zitat      
Hallo,

ich habe mal wieder ein Problem und finde den Fehler nicht...

Code:
function Daten_Import_Callback(hObject, eventdata, handles)
   
    Datenpfad = 'C:\Dokumente und Einstellungen\';
    handles.Daten= xlsread([Datenpfad,'Werte.csv'],'a2:a50000');
       
Ergebnis1 = handles
guidata(hObject, handles);


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)

  Daten_Import_Callback(hObject, eventdata, handles);
  a = handles.Daten;

Ergebnis2 = handles


An der Stelle Ergebnis1 sind noch alle handles vorhanden, aber an der Stelle Ergebnis2 nicht.

Warum werden die Daten nicht übergeben bzw. warum gibt es das Feld nicht mal? Es wird doch erstellt somit müsste es existieren und ich sollte es abfragen können.

Ich muss dazu sagen, dass ich diese Funktion in eine Callback-Funktion geschrieben habe, diese aber nur mit einer anderen Funktion aufrufe und nicht durch einen Button. Nur weiß ich ansonsten nicht, wie ich die Werte in die handels schreiben soll.

Ich finde den Fehler einfach nicht. Könnt ihr mir bitte helfen?

Gruß
Axel
Private Nachricht senden Benutzer-Profile anzeigen


MasterofDesaster
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 17.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.05.2009, 06:38     Titel:
  Antworten mit Zitat      
Ich habe bisher nur raus gefunden, dass wenn ich das Gesamtskript mehrfach laufen lasse, es nach dem zweiten Mal funktioniert.
Auch funktioniert es, wenn ich die Callback Funktion über einen Knopf auslösen.
Habt ihr vielleicht noch eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen
 
Dagnabit
Forum-Century

Forum-Century


Beiträge: 244
Anmeldedatum: 23.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.05.2009, 07:12     Titel:
  Antworten mit Zitat      
Guten Morgen

Funktionieren sollte das Ganze so:

Code:
function Daten = Daten_Import
   
    Datenpfad = 'C:\Dokumente und Einstellungen\';
    Daten= xlsread([Datenpfad,'Werte.csv'],'a2:a50000');



% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)

  handles.Daten = Daten_Import;
  guidata( hObject, handles);


Warum Dein Ansatz nicht läuft, kann ich mir z.Z. auch nicht erklären...

lg
Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
MasterofDesaster
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 17.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.05.2009, 11:34     Titel:
  Antworten mit Zitat      
Ich würde deinen Ansatz gerne verwenden, allerdings muss ich mehrere Datensätze in Arrays schreiben. Daher habe ich die Handles verwendet, weil ich damit mehrere globale Variable mit Inhalt erzeugen kann ohen jedesmal eine neue Funktion aufzurufen.
Oder funktioniert das auch mit Funktionen?
Wie müsste dann deren Struktur aussehen?

Gruß
Axel
Private Nachricht senden Benutzer-Profile anzeigen
 
Dagnabit
Forum-Century

Forum-Century


Beiträge: 244
Anmeldedatum: 23.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.05.2009, 12:00     Titel:
  Antworten mit Zitat      
Servus Axel

Aus der Hüfte:
Code:
function Daten = Daten_Import( Datenpfad, Datei, Bereich)
   
    Daten= xlsread( fullfile(Datenpfad, Datei), Bereich);
   
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)

  handles.Daten = Daten_Import( 'C:\Dokumente und Einstellungen\', 'Werte.csv', 'a2:a50000');
  guidata( hObject, handles);


In diesem Fall wäre es aber sinnvoller, schöner und kürzer dies so zu lösen:
Code:
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)

  handles.Daten= xlsread( fullfile('C:\Dokumente und Einstellungen\','Werte.csv'),'a2:a50000');
  guidata( hObject, handles);



Beschreibe bitte Dein Anliegen etwas detaillierter, dann finden wir dazu sicher eine Lösung.

lg
Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
MasterofDesaster
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 17.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.05.2009, 13:28     Titel:
  Antworten mit Zitat      
Hallo Martin,

dann versuche ich es mal zu beschreiben:

Ich habe ein Hauptprogramm, welches bestimmte Berechnungen anhand von einigen Excellisten anstellst.
Ich muss 0 - 4 Listen einlesen, je nach Bedingungen die ich im gui gesetzt habe. Die Excellisten wollte ich über eine Function einlesen und Arrays zuweisen, damit sie nicht im Hauptprogramm steht und ich so etwas mehr Übersicht erhalte.
Anschließend wertet mir das Gui meine Berechnung aus und ich verändere nun in der Oberfläche einige Parameter, wie z.B. die Amplitude einer Schwingung. Darauf hin, soll er eine neue Berechnung anstellen, aber die Daten nicht neu laden, da diese sich ja nicht verändert haben und ich so Rechenzeit spare.

Außerdem muss er die Berechnung immer mehrfach durchlaufen lassen, weil ich statistische Werte erheben muss.

Ich habe zuerst einen weiteren Button gehabt über den ich die Daten eingeladen habe. Ich habe mir dann aber überlegt, dass es benutzerfreundlicher wäre, diesen Schritt zu automatisieren. Das habe ich dann auch getan und einfach den Button in der Oberfläche gelöscht. Anschließend habe ich in der Hauptfunktion einen Aufruf der Funktion, welche vorher über den Button gestartet wurde, eingebaut. In der Hauptfunktion ist vorher eine Abfrage ob die Daten schon eingelesen wurden oder nicht und anhand dessen wird entschieden wie vorgegangen wird.

Allerdings tut das ja nicht so ganz...

So, hoffe ich habe halbwegs verständlich erklärt was mein Problem ist -.-


Gruß
Axel
Private Nachricht senden Benutzer-Profile anzeigen
 
Scriptor
Forum-Century

Forum-Century


Beiträge: 217
Anmeldedatum: 22.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.05.2009, 21:56     Titel:
  Antworten mit Zitat      
Hallo MoD,

ich kenne mich mit dem GUIDE nicht aus, denn ich schreibe meine GUIs von Hand. Dort ist es so, dass du Variablen die du innerhalb einer Funktion (z.B. in einer Callback-fkt.) erstellt hast, auch dort bleiben. Wenn ich das richtig sehe, ist dass dein Problem. Mit den Befehlen setappdata und getappdata, kannst du das Problem lösen.

Mit setappdata kannst du deine in der Fkt erzeugte Variable in dein Figure abspeichern. Folgenden Befehl setzt du ans Ende deiner Funktion.
Code:

setappdata(Name_des_figures,'String_unter_der_du_die_Variable_im_Workspace_des_figures_abspeicherst',Name_der_Variable)
 


getappdata holt dir die benötigte Variable in eine andere neu aufgerufene Funktion.

Code:


Name_deiner_Variable=getappdata(Name_des_Figures,'String_unter_der_du_die_Variable_im_Workspace_des_figures_abgespeichert_hast',Name_der_Variable);

Es bietet sich an, alle Variablennamen gleich zu lassen, heißt wenn du es in den Fig lädst und wieder in eine Funktion reinlädst. Da wirst du besser mit klar kommen.

Mfg Scriptor
Private Nachricht senden Benutzer-Profile anzeigen
 
Dagnabit
Forum-Century

Forum-Century


Beiträge: 244
Anmeldedatum: 23.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.05.2009, 22:21     Titel:
  Antworten mit Zitat      
Servus Axel

Deine Beschreibung ist etwas zu allgemein. Cool

Zitat:
Ich muss 0 - 4 Listen einlesen, je nach Bedingungen die ich im gui gesetzt habe.

In diesem GUI kannst Du wählen welche/ wie viele .xls- files geladen werden?
Haben diese files immer den gleichen Namen und Inhalt, oder greifst Du auf eine Menge verschiedener files zu, die jeweils einer anderen "Behandlung" bedürfen?

Prinzipiell wäre es gut alle benötigten Daten mit GUI- Start zu laden und zu verspeichern (Opening_Fcn). Du hast somit immer Zugriff darauf.

Es ist nun Geschmackssache ob Du Deine Daten in "handles" speicherst, oder mit "appdata" arbeitest. Wenn Du jedoch mehrere Fenster verwendest, würde ich auch umbedingt "appdata" empfehlen.

lg
Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
MasterofDesaster
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 17.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2009, 08:06     Titel:
  Antworten mit Zitat      
Hallo Martin,

bzgl. der Listen:
Ich wähle im Gui die entsprechenden Dateien aus, die er danach einlesen soll. Je nach Versuch kann es sein, dass ich eine oder mehrere Listen einlesen muss. Diese haben fast immer einen anderen Namen und ein anderes Verzeichnis.
Daher kann ich sie nicht mit der Opening Funktion laden, denn ich muss sie danach ja noch entsprechend meinen Anforderungen auswählen.

Ich habe nur ein Fenster, aber ich kann gerne Appdata verwenden. allerdings irritiert es mich einfach, dass das Gui beim zweiten Lauf funktioniert...und keinen Fehler mehr hat.

@Scriptor: Ich werde das mal ausprobieren

Gruß und Dank
Axel
Private Nachricht senden Benutzer-Profile anzeigen
 
Dagnabit
Forum-Century

Forum-Century


Beiträge: 244
Anmeldedatum: 23.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2009, 08:18     Titel:
  Antworten mit Zitat      
Servus Axel

Zitat:
Ich wähle im Gui die entsprechenden Dateien aus, die er danach einlesen soll.

Das bedeutet, dass Du den Datenimport schon gelöst hast?

Zitat:
allerdings irritiert es mich einfach, dass das Gui beim zweiten Lauf funktioniert...und keinen Fehler mehr hat.

Poste doch bitte die betreffenden aktuellen Codeteile (Import- Funktion bzw. deren Aufruf).
Vielleicht kann man dann mehr dazu sagen.

lg
Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
MasterofDesaster
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 17.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2009, 10:10     Titel:
  Antworten mit Zitat      
Hallo Martin,

Zitat:
Das bedeutet, dass Du den Datenimport schon gelöst hast?

- Ja, er importiert die Daten. Innerhalb dieser Funktion sind die Daten auch in den handles vorhanden.
Nur in der Funktion die diese Importfunktion aufruft komischerweise nicht.
Dort existieren die handles dann angeblich nicht mal.

Der Code welcher bei mir reproduzierbare Ergebnisse liefert lautet:
Code:
function Daten_Import_Callback(hObject, eventdata, handles)
   
    handles.Daten= xlsread(['C:\Dokumente und Einstellungen\Werte.csv'],'a2:a50000');
       
Ergebnis1 = handles
guidata(hObject, handles);


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)

  Daten_Import_Callback(hObject, eventdata, handles);
  a = handles.Daten;

Ergebnis2 = handles


Unter Ergebnis1 wird das handle richtig ausgegeben und unter Ergebnis2 existiert es nicht.

Der Rest des Codes ist meines Erachtens nicht so wichtig, weil er funktioniert und ich den Fehler auf diese paar Zeilen eingrenzen konnte.

Mein Problem ist wie gesagt nur die handle-Übergabe die scheinbar nicht funktioniert. Sobald ich aber einen zweiten Durchlauf starte, funktioniert mein Programm, warum auch immer...da ich die handles sonst nirgends erstelle...

Gruß
Axel
Private Nachricht senden Benutzer-Profile anzeigen
 
Dagnabit
Forum-Century

Forum-Century


Beiträge: 244
Anmeldedatum: 23.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2009, 10:41     Titel:
  Antworten mit Zitat      
Servus Axel

Ich hab Deinen Code probiert und habe das "Phänomen" auch beobachten können.
Aber leider; 0 Ahnung was es da hat.

Es wird am vernünftigsten sein, wenn Du die Sache wie schon weiter oben erwähnt so löst:
Code:
Daten = function Daten_Import_Callback
   
    Daten= xlsread(['C:\Dokumente und Einstellungen\Werte.csv'],'a2:a50000');

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)

  handles.Daten = Daten_Import_Callback;
  guidata(hObject, handles)
 


lg
Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
MasterofDesaster
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 17.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2009, 11:35     Titel:
  Antworten mit Zitat      
Hallo Martin,
das funktioniert so, aber wie bekomme ich es hin, dass ich in der Funktion mehr als einen Array übergebe? Und diesen dann hinterher verwenden kann?
Denn nur einen Array pro Funktion ist in meinem Fall unsinnig, ich würde dann eher den Import direkt durchführen.

Gruß und Dank
Axel
Private Nachricht senden Benutzer-Profile anzeigen
 
Dagnabit
Forum-Century

Forum-Century


Beiträge: 244
Anmeldedatum: 23.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.05.2009, 11:54     Titel:
  Antworten mit Zitat      
Servus Axel

Wie gefällt dir folgendes?

Code:
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)

    [filename, pathname] = uigetfile( {'*.xls'}, 'Wähle Excel-files',  'MultiSelect', 'on');
   
    for i = 1 : length(filename)
        Daten{i}= xlsread(fullfile(pathname,filename{i}),'a2:a50000');
    end
   
    handles.Daten = Daten;
    guidata(hObject, handles)


oder alternativ
Code:
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)

    [filename, pathname] = uigetfile( {'*.xls'}, 'Wähle Excel-files',  'MultiSelect', 'on');
   
    for i = 1 : length(filename)
        Daten{i}= xlsread(fullfile(pathname,filename{i}),'a2:a50000');
    end
   
    setappdata( gcf, 'Daten', Daten);

_________________

lg
Martin
Private Nachricht senden Benutzer-Profile anzeigen
 
MasterofDesaster
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 60
Anmeldedatum: 17.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2009, 08:17     Titel:
  Antworten mit Zitat      
Hallo Martin,

da ich diesen Code auch wieder in eine zweite Funktion schreibe habe ich wieder den gleichen Fehler -.-
Er übergibt die handels einfach nicht!

Scheinbar ist es nicht möglich ein Callbackfunktion über eine andere Funktion aufzurufen. Sie kann nur direkt über einen Button aufgerufen werden und übergibt dann die handles.
Bei einem zweiten Durchlauf allerdings sind die handles vorhanden und der Fehler existiert nicht mehr!

Gibt das irgendeinen Sinn?

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

Gehe zu Seite 1, 2  Weiter

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.