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

callback/ Variablen an Funktion übergeben und durchlaufen

 

DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 21.09.2014, 15:28     Titel:
  Antworten mit Zitat      
Warum änderst du denn den Namen der Funktion? Es heißt guidata und nicht guidate.

Code:

guidate(gcbo,handles);

%guidata(hObject, handles);
 


Und min ist eine Standard Matlab Funktion weshalb der Name als Variable keine gute Idee ist. Auch das Speichern von min macht so wieder keinen Sinn. Beim Verlassen der Funktion ist es unbekannt und kann daher in anderen Funktionen nicht genutzt werden. Lass es doch einfach mal handles.XXX. Teste erstmal den Code so wie ich es vorgeschlagen habe, bevor du daran weitere Änderungen vornimmst.

Code:
xlsread(fullfile(Dateipfad, Dateiname),-1);


Und wofür eigentlich das -1?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

wenn du min (bzw. die nach Vorschlag von DSP umbenannte Variable) später aus handles extrahieren willst, musst du es schon auch erst reinschreiben:
Code:


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 15.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2014, 17:15     Titel:
  Antworten mit Zitat      
oh, das mit guidate war keine Absicht. Danke, für den Hinweis.

Jetzt habe ich probiert, dass die ausgewählte Datei einfach nur angezeigt wird. Aber leider klappt es nicht.

Code:

% --- Executes on selection change in listbox.
function listbox_Callback(hObject, eventdata, handles)
% hObject    handle to listbox (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: contents = cellstr(get(hObject,'String')) returns listbox contents as cell array
%        contents{get(hObject,'Value')} returns selected item from listbox
[Dateiname, Dateipfad]=uigetfile('*.xls','Waehle Aufträge.xls file:');
minimal=xlsread(fullfile(Dateipfad, Dateiname),-1);

handles.minimal=get(handles.minimal,'String');
guidata(gcbo,handles);

%guidata(hObject, handles);

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

% Hint: listbox 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.
function pushbutton_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
handles=guidata(gcbo, handles);

result=get(handles.minimal, 'String');
set(handles.pushbutton,'String',num2str(result));
 


der folgende Fehler kommt

Code:

GUI_02
Warning: Interactive selection cannot be used in 'basic' mode.  First sheet will be
loaded.
> In xlsread at 205
  In GUI_02>listbox_Callback at 85
  In gui_mainfcn at 96
  In GUI_02 at 42
  In @(hObject,eventdata)GUI_02('listbox_Callback',hObject,eventdata,guidata(hObject))
Error using handle.handle/get
Invalid or deleted object.

Error in GUI_02>listbox_Callback (line 87)
handles.minimal=get(handles.minimal,'String');

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

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

Error in @(hObject,eventdata)GUI_02('listbox_Callback',hObject,eventdata,guidata(hObject))

 
Error while evaluating uicontrol Callback

 
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 21.09.2014, 17:30     Titel:
  Antworten mit Zitat      
Was versuchst du denn hier eigentlich?

Code:

minimal=xlsread(fullfile(Dateipfad, Dateiname));

handles.minimal=get(handles.minimal,'String');
 


Was soll handles.minimal sein? xlsread speichert dir die eingelesenen Daten aus deinem ausgewählten file in minimal. Die willst du doch weiter verwenden? Warum also nicht...

Code:

handles.minimal=xlsread(fullfile(Dateipfad, Dateiname),-1);
 


Wozu die get Funktion von einem handle das nicht vorhanden ist? Was soll denn überhaupt in der Callback listbox Funktion passieren und durch welche Aktion des Nutzers der GUI wird sie aufgerufen?

Code:

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

% vollkommen ausreichend, damit kennt die Funtion pushbutton die struct  handle und kann drauf zugreifen
guidata(gcbo, handles);
% Ausgabe...aber wo?
% sicherlich nicht in einem Pushbutton...dazu brauchst es doch ein Textfeld in deiner GUI. Diesem Textfeld musst du das Ergebnis übergeben und  nicht dem Button.
set(handles.textfeld,'String',num2str(handles.minimal));
 


Was steht denn in handles.minimal, also was liest du aus der Excel Datei?

Beschreibe doch mal bitte deine GUI, oder besser hänge ein Bild der GUI an und schreibe was bei welcher Interaktion des Nutzer passieren soll.
Private Nachricht senden Benutzer-Profile anzeigen
 
Nikki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 15.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2014, 19:19     Titel:
  Antworten mit Zitat      
ja, das sieht natürlich viel besser aus Smile
die minusEins kann doch auch weg, oder?

Code:

handles.minimal=xlsread(fullfile(Dateipfad, Dateiname));
 


Wenn ich ein Element aus der listbox anklicke, öffnet sich das excel-Fenster, was auch gewünscht ist.
Die Exceldateien (insgesamt 3) sind Matrizen. Die sollen mit anderen Eingabedaten, vier Zahlen, in meineFunktion eingefügt werden. Beim klicken des pushbuttoms "lade" sollen die Daten in meineFunktion geladen und ausgewertet werden.
Als Ergebnis (ein Vektor) soll das Ergebnis aus meinerFunktion rauskommen, samt Plot.

ich hoffe es ist verständlich,
Nikki

GUI_02.fig
 Beschreibung:

Download
 Dateiname:  GUI_02.fig
 Dateigröße:  2.37 KB
 Heruntergeladen:  364 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 21.09.2014, 20:35     Titel:
  Antworten mit Zitat      
Ehrlich gesagt ist mir damit immer noch nicht klar was die Listbox machen soll.

Zitat:
Wenn ich ein Element aus der listbox anklicke, öffnet sich das excel-Fenster, was auch gewünscht ist.


Wie denn das? Es wird ein excel sheet geöffnet oder meinst du die uigetfile box, wo man den excel file auswählen sollen?

Soll man eine "Funktion" aus der Listbox auswählen? Also musst du doch erfassen und abspeichern welches Element in der ListBox gewählt wurde.

Danach gibt man etwas in ein Textfeld ein und drückt dann auf Laden? Es muss also eine Funktion geben, welche die Eingabe aus dem Textfenster erfasst. Mit dem pushbutton "Laden" soll dann eine Funktion zum Verarbeiten der Daten aufgerufen werden. Was aber ist listDaten, min und max?
Private Nachricht senden Benutzer-Profile anzeigen
 
Nikki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 15.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2014, 21:45     Titel:
  Antworten mit Zitat      
Sorry, für die ungenaue Beschreibung… ja, ich meinte, dass beim anklicken von min oder max sich die uigetfile box öffnet und dann sollen die excel Dateien ausgesucht werden. Falls keins ausgesucht wird, soll eine initialisierung =0 erfolgen.

min und max das sind Anweisungen die einzuhalten sind.

Wie kann ich diese erfassen und speichern?

In den Textfeldern sollen Zahlen eingegeben werden und dann auch abgespeichert werden.

Und dann mit dem pushbutton sollen die ganzen Daten an eine Funktion überführt werden.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 22.09.2014, 06:54     Titel:
  Antworten mit Zitat      
Damit ist mir immer noch nicht klar, was bei Max, Min und ListDaten passieren soll.

Schau dir mal folgendes Bsp ein, welches ich aus den schon vorhandenen Bsp. von GUIDE genommen, etwas abgeändert und ergänzt habe. Vielleicht hilft dir das ja weiter.

GUIexample.m
 Beschreibung:

Download
 Dateiname:  GUIexample.m
 Dateigröße:  8.17 KB
 Heruntergeladen:  359 mal
GUIexample.fig
 Beschreibung:

Download
 Dateiname:  GUIexample.fig
 Dateigröße:  6.03 KB
 Heruntergeladen:  352 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Nikki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 15.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2014, 09:42     Titel:
  Antworten mit Zitat      
hallo DSP,

ja, das Beispiel ist hilfreich! danke Smile

Grundsätzlich kann man sagen, dass nach jeder User Eingabe die Daten mit

Code:

get(handles.user_eingabe, 'String');
guidata(gcbo,handles);
 


gespeichert werden, hab ich das richtig verstanden?

Und nach jeder Auswahl aus der listbox auch mit

Code:

[Dateiname, Dateipfad]=uigetfile('*.xls','Waehle aus:');
handles.user_auswahl=xlsread(fullfile(Dateipfad, Dateiname));
guidata(gcbo,handles);
 


die Daten geladen und unter handels.user_auswahl gespeichert werden, oder?

Beim drücken des pushbuttons soll meine Funktion mit den gespeichert Daten ausgeführt werden. Wie gebe ich es ein? und wo genau?

Insgesamt möchte ich einen genetischen Algorithmus benutzen. min und max sind dabei Vorschriften, eine Art Regeln die von Objekten einzuhalten sind. Und diese Vorschriften können sich ändert, deshalb soll der Nutzer in Abhängigkeit von den Wahl des Users die passenden Vorschriften auswählen können. Es kann sein das min, max und/oder eine Kombi davon zu beachten ist. Oder aber auch nur eins oder zwei der Vorschriften einzuhalten sind.
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 22.09.2014, 10:47     Titel:
  Antworten mit Zitat      
Nikki hat Folgendes geschrieben:
hallo DSP,

ja, das Beispiel ist hilfreich! danke Smile

Grundsätzlich kann man sagen, dass nach jeder User Eingabe die Daten mit

Code:

get(handles.user_eingabe, 'String');
guidata(gcbo,handles);
 


gespeichert werden, hab ich das richtig verstanden?


Was ist denn nun schon wieder handles.user_eingabe? Ist das mein handles.user_input? Es ist schwer dir zu helfen wenn du ständig die Namen der Variablen änderst und ich dann raten muss was das nun wieder ist.

Nein, eben nicht. handles.user_input wird doch nur als Variable in dem struct handles abgelegt. Wenn du die Eingabe im Textfenster holen willst, musst du auch den Namen des Objekts benutzen. Get und set brauchst du nur um die aktuellen Werte von Objekten (Buttons/Textfeld etc.) aus deiner GUI abzufragen bzw. zu setzen. In meinen code heißt das Textfeld edit1...daher auch:

Code:
% Eingabe in Textfeld holen und speichern
    handles.user_input = get(handles.edit1,'string');


handles.user_input kannst du hingegen einfach so ohne get oder set verwenden. Der Wert ist doch dort schon gespeichert und muss deshalb nicht abgefragt werden.

Zitat:
Und nach jeder Auswahl aus der listbox auch mit

Code:

[Dateiname, Dateipfad]=uigetfile('*.xls','Waehle aus:');
handles.user_auswahl=xlsread(fullfile(Dateipfad, Dateiname));
guidata(gcbo,handles);
 


die Daten geladen und unter handels.user_auswahl gespeichert werden, oder?


Ja, handles.user_auswahl kann somit global verwendet werden. Andere Funktionen können es somit nutzen.

Zitat:
Beim drücken des pushbuttons soll meine Funktion mit den gespeichert Daten ausgeführt werden. Wie gebe ich es ein? und wo genau?


Schau dir bitte diese Funktion genauer an. Sie wird aufgrufen sobald der Button "Laden" gedrückt wird. Hier sollte also der Hauptteil deines Programms liegen. Die Switch Anweisung steuert nun die jeweilige Funktion, welche bei Max, Min oder ListLaden erfolgen soll.

Code:

function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
axes(handles.axes1);
cla;

% Button Laden wurde gedrückt...was nun?
% Hole Auswahl in Listbox
popup_sel_index = get(handles.popupmenu1, 'Value');
switch popup_sel_index
    case 1 % Auswahl ListDaten
        % Anweisung folgt hier...        
    case 2 % Auswahl Min
        % Anweisung folgt hier...
        % Auswahl und Lesen eines excel sheets
        [Dateiname, Dateipfad] = uigetfile('*.xls','Waehle Aufträge.xls file:');
        if isempty(Dateiname) || isempty(Dateipfad) % kein File gewählt
            % Anweisung folgt hier...
        else
            handles.minimal = xlsread(fullfile(Dateipfad, Dateiname));
            % save the changes to the structure
            guidata(gcbo,handles);
        end
        % Ausgabe in figure...so fern gewünscht
        plot(handles.minimal);
    case 3 % Auswahl Max
        % Anweisung folgt hier...    
end
 


Die Kommentare sollten doch eigentlich eindeutig sein, zu welchem case, Max, Min und ListDaten gehört. Ob bei case 2 wirklich das Excel sheet eingelesen werden soll, weiß ich nicht. Das war zur Verdeutlichung. Du siehst im Code wie du die Auswahl aus deiner Listbox holst und dann je nach Auswahl entsprechend weiter machst. Was dann dort passiert musst du schon selbst schreiben Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Nikki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 15.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2014, 14:36     Titel:
  Antworten mit Zitat      
hallo DSP,

vielen danke!!! die Variablen werden jetzt alle erkannt! Smile

Das einzige Problem was ich noch habe ist, dass mein GA für jede Generation ein Fitnesswert ausgibt. All diese sollen dann in einem text Feld erscheinen.
Im Moment wird mir noch der Fehler angezeigt

Code:

>> GUI_02
Error using genetic
Too many output arguments.

Error in GUI_02>lade_Callback (line 88)
result=genetic( handles.pop, handles.sel, ...

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

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

Error in @(hObject,eventdata)GUI_02('lade_Callback',hObject,eventdata,guidata(hObject))

 
Error while evaluating uicontrol Callback
 


bei meiner Funktion genetic habe ich aber kein Output an sich definiert. Die Fitnesswerte werden im Laufe des Programms nach jeder Generation angezeigt. Kommt deshalb der Fehler?

Nikki
Private Nachricht senden Benutzer-Profile anzeigen
 
Nikki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 15.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2014, 15:12     Titel:
  Antworten mit Zitat      
Hallo,

leider werden nur die ganzen Variablen erkannt. Sad

Dezimalzahlen (mit Punkt geschrieben) werden zwar eingelesen, aber komplett verändert.

Aus 0.5 wird z.B. 4.0013

Weiß jemand wo der Fehler ist?

Danke,
Nikki
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.09.2014, 16:06     Titel:
  Antworten mit Zitat      
Bitte mal den gesamten code posten oder hier als m-file anhängen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Nikki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 15.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2014, 16:31     Titel:
  Antworten mit Zitat      
Hallo,

das einlesen aus Excel klappt jetzt. Ganze zahlen werden auch normal eingelesen. Nur bei Kommazahlen haperts.
Und wenn ich dann in die GUI neue Werte eingebe, dann werden diese nicht aktualisiert.

Danke,
Nikki

GUI_03.m
 Beschreibung:

Download
 Dateiname:  GUI_03.m
 Dateigröße:  5.89 KB
 Heruntergeladen:  363 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 23.09.2014, 16:52     Titel:
  Antworten mit Zitat      
Da dies nur der m-file ist, kann ich nur raten Wink Geht es um diese Funktion...ist das ein Textfeld?

Code:

function selektion_Callback(hObject, eventdata, handles)
% hObject    handle to selektion (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 selektion as text
%        str2double(get(hObject,'String')) returns contents of selektion as a double
handles.textfeld = str2num(get(handles.selektion, 'String'));
guidata(gcbo,handles);
 


Du liest einen String ein...welcher je nach Eingabe zwar eine Zahl sein kann, aber der eben auch erst entsprechend umgewandelt werden muss. Falls ein spezielle Formatierung notwendig ist, sonst z.B.

Code:
statt str2num verwenden. Es ist mit Sicherheit auch gut die Eingabe auf ihre Gültigkeit zu überprüfen, bevor sie abgespeichert wird Wink

NIEMALS den Namen des Objects als Variable für die Speicherung eines Wertes verwenden.

Code:
handles.selektion = get(handles.selektion...


Verwende bitte eine andere Variable für die Zuweisung!

Code:
handles.XXX = get(handles.selektion...



Der Kommentar unter "Hints: " hätte dir aber schon weiterhelfen können Wink.

Was ist eigentlich?
Code:

handles.minimal, handles.maximal
 


Sie werden nur beim Starten der GUi mit 0 initialisert, aber sonst wird ihnen kein anderer Wert zugewiesen.

Zuletzt bearbeitet von DSP am 23.09.2014, 17:15, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2, 3  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.