ihr habt mir schon oft hier weiter geholfen. Leider konnte ich diesmal kein Thema finden welches mein Problem lößt.
Ich versuche es mal zu erklären:
Wie in der Überschrift schon geschrieben versuche ich eine GUI zu erstellen. Ich bin da aber noch ein grober Anfänger. Ich habe die GUI mit GUIDE erstellt. Nun besteht mein Problem darin, dass ich zwischen verschiedenen Callbacks zwei Variablem hin und her geben möchte. Diese werden in der OpeningFcn mit 0 initialisiert.
die Callbacks von 4 Pushbuttons schreiben bei Betätigung den Wert der Variable auf entweder 1 oder 2 um und prüfen dann in einer if-Abfrage welchen Wert die andere Variable enthällt. Darauf folgt das füllen einer Listbox.
(Bsp.: einer der 4 Callbacks)
Code:
% --- Executes on button press in pushbutton15. function pushbutton15_Callback(hObject, eventdata, handles) % hObject handle to pushbutton15 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
handles.b=1;
listbox={};
if handles.a==1 [r_P_ally,r_P_allx] = size(handles.results_P_all);
for m=3:1:r_P_allx
listbox{m-2,1} = handles.results_P_all(1,m)*(24*60);
end set(handles.listbox1,'String', listbox);
end if handles.a==2 [r_liney,r_linex] = size(handles.results_line);
for m=3:1:r_linex
listbox{m-2,1} = handles.results_line(1,m)*(24*60);
end set(handles.listbox1,'String', listbox);
end
Und nun zum Kern des ganzen: Die Callbacks füllen die Listbox nicht. Ich habe die if-Abfrage zur Probe bei 2 der vier Schalter einmal mit 0 gemacht und da wurde die Listbox zumindest in zwei Fällen gefüllt. Demzufolge erhalten die Variablen nicht die richtige Zuweisung oder sie werden an einem Schritt stets mit 0 überschrieben. Jedoch werden sie ja nur in den Callbacks und in der OpeningFcn überhaupt genutzt.
Ich denke ich habe ein prinzipielles Verständnissproblem bezüglich der Wertübergabe und der Gültigkeit der Variablen in einer GUI. Könnt ihr mir weiterhelfen? Wäre euch sehr dankbar.
Ein grundlegendes Konzept der "handles" Methode ist, dass dieses Struct nach jeder Änderung und vor jeder Abfrage auf den neuesten Stand gebracht werden muss. Beispiel:
Jetzt wird bei jeder Betätigung des Buttons der Inhalt des Structs "handles" angezeigt. Alledings nur mit dem ersten Feld field1! Denn field2 und field3 werden erst später eingefügt, während der Aufruf des Callbacks immer noch den Wert des ersten "handles" enthält.
Besser:
Code:
handles = struct('field1', 1);
uicontrol('Style', 'pushbutton', 'String', 'Button', @myCallback);
handles.field2 = rand;
guidata(figureHandle, handles); % Store handles struct in fugure
function myCallback(ObjH, EventData)
handles = guidata(ObjH); % Get struct from the figure disp(handles)
handles.field3 = 'hello';
guidata(ObjH, handles); % Store new handles struct in the figure
vielen, vielen Dank für die so schnelle Hilfe. Echt super nett von euch:)
War ein grundsatzproblem, wie befürchtet...
Läuft alles jetzt dank eurem Tipp.
Wünsch euch noch nen schönen Abend.
P.S.: Mit ein bisschen Glück seht ihr mich nicht wieder;)
ich habe ein ähnliches Problem, bei dem ich so langsam verzweifle.
Ich hab ein Gui erzeugt, welches dazu dienen soll, alle eingegebenen Daten zu sammeln und auszugeben (mit dem Ziel, dass ein übergordnetes damit arbeiten soll)
Dabei rufe ich in der OpeningFcn eine Function auf
Code:
function setRequirements(hObject,eventdata,handles)
die vorab Initialisierungen bzw einstellungen vornimmt.
Am Ende der Function speichere ich alle hinzugefügten Felder in der handles struktur. Leider gehen nach Verlassen der Function die Werte ins Nirvana und ich weiß nicht warum!
Nachfolgend ein Auschnitt aus dem Code (Kommentare mal weggelassen)
Code:
function ReqKCH_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
% handles.reqKCH.kindReq = 'minimum';
handles.reqKCH.projectNr = ''; % Initialisierungswert
handles.regKCH.temperature = -1; % Initialisierungswert set(handles.radiobutton_minReq,'Value',1);
setRequirements(hObject,eventdata,handles); % Am Ende der Funktion ist alles wie erwartet
disp(handles); % hier sind die Werte verschwunden % disp(handles.reqKCH); guidata(hObject, handles);
function pushbutton_save_Callback(hObject, eventdata, handles)
frm_ReqKCH_CloseRequestFcn(hObject,eventdata,handles);
function frm_ReqKCH_CloseRequestFcn(hObject, eventdata, handles) uiresume(handles.frm_ReqKCH);
function setRequirements(hObject,eventdata, handles) if(get(handles.radiobutton_maxReq,'Value'))
% add field to struct
handles.reqKCH.technology = '';
handles.reqKCH.testequipment = '';
handles.reqKCH.testType = '';
% set variable to check min or max
handles.reqKCH.kindReq = 'maximum';
% Einblenden von Maximalbedingungen set(handles.text_technology,'Visible','on');
set(handles.text_testequipment,'Visible','on');
set(handles.text_testType,'Visible','on');
set(handles.edit_technology,'Visible','on');
set(handles.edit_testequipment,'Visible','on');
set(handles.edit_testType,'Visible','on');
else % remove fields, if available try
handles.reqKCH = rmfield(handles.reqKCH,'technology');
handles.reqKCH = rmfield(handles.reqKCH,'testequipment');
handles.reqKCH = rmfield(handles.reqKCH,'testType');
catch end % set variable to check min or max
handles.reqKCH.kindReq = 'minimum';
% Ausblenden von optionalen Maximalbedingungen set(handles.text_technology,'Visible','off');
set(handles.text_testequipment,'Visible','off');
set(handles.text_testType,'Visible','off');
set(handles.edit_technology,'Visible','off');
set(handles.edit_testequipment,'Visible','off');
set(handles.edit_testType,'Visible','off');
set(handles.edit_technology,'String','');
set(handles.edit_testequipment,'String','');
set(handles.edit_testType,'String','');
end disp(handles.reqKCH); % hier sind die Einträge wie erwartet
Das ist bestimmt etwas leichtes, nur bin ich grad etwas ratlos. Ich hoffe mein Problem ist etwas deutlicher. Freu mich über jede Hilfe und sag jetzt schon mal
Vielen Dank
super vielen dank für die schnelle antwort! das erzwingen hat funktioniert!
das handles eine lokale variable ist, war mir bisher nicht bekannt. man lernt nie aus! wird die in einer art call-by-reference behandelt?
Einstellungen und Berechtigungen
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
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.