Ich schreibe gerade meine erste GUI (mit GUIDE, auch wenn ich mir mittlerweile mehr und mehr der Nachteile bewusst werde).
Dabei bin ich auf ein Problem gestoßen, welches mit mittlerweise schon eine Weile beschäftigt.
Ich habe eine globale Variable "v_station" im Workspace mit variierender Größe. Dieser gibt die x-Koordinate eines Koordinatensystems an.
Nun möchte ich den Nutzer meiner GUI einen bestimmten Wertebereich von v_station auswählen lassen. Dazu möchte ich zwei Dropdownbuttons erstellen, deren Inhalt vom Inhalt der Variable "v_station" abhängt und jeweils den ausgewählten Wert als Variable speichern. v_station ist ein n x 1 double. Diesen konvertiere ich per num2str in text.
Wie kann ich dies nun als dynamische Auswahlmöglichkeiten einstellen?
Alle Tutorien/Videos zum Thema arbeiten nur mit statischen Auswahlmöglichkeiten
bisheriger Code:
Code:
% --- Executes on selection change in popup_startstation. function popup_startstation_Callback(hObject, eventdata, handles) % hObject handle to popup_startstation (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
contents = cellstr(get(hObject,'String'));
start=get(contents,'String');
transfer=str2num(start);
assignin('base','startstation',transfer);
% Hints: contents = cellstr(get(hObject,'String')) returns popup_startstation contents as cell array % contents{get(hObject,'Value')} returns selected item from popup_startstation
% --- Executes during object creation, after setting all properties. function popup_startstation_CreateFcn(hObject, eventdata, handles) % hObject handle to popup_startstation (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called global v_station;
set(handles.popup_startstation, 'String', num2str( v_station ));
% Hint: popupmenu controls usually have a white background on Windows. % See ISPC and COMPUTER. ifispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white');
end
>> Edit_strecke
Struct contents reference from a non-struct array object.
Error in Edit_strecke>popup_startstation_CreateFcn (line 128)
set(handles.popup_startstation, 'String', num2str( v_station ))
Error in gui_mainfcn (line 95)
feval(varargin{:});
Error in Edit_strecke (line 42)
gui_mainfcn(gui_State, varargin{:});
Error in
matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)Edit_strecke('popup_startstation_CreateFcn',hObject,eventdata,guidata(hObject))
Ich habe eine globale Variable "v_station" im Workspace mit variierender Größe.
Globale Variablen sind immer ein Schuss ins Knie. Sowie Proghramme umfangreicher werden oder man mehrere Toolboxen gemeinsam verwendet, führen globale Variablen dazu, dass der Code kaum debugt werden kann. Im Falle von Fehlern ist es extrem schwierig herauszufinden, welcher Programmteil für die letzte Änderung des Wertes verantowrtlich ist. Und sowie ein Global mehrfach deklariert wird, z.B. wenn man mehrere Instanzen eines GUIs öffnet, ist das Chaos perfekt.
Nebenbei: "globale" Variablen liegen eben gerade nicht in einem bestimmten WorkSpace, das ist ja die Definition von "global".
Es gibt immer eine bessere Möglichkeit, alle Daten nur lokal zu speichern und per Inputs/Outputs mit anderen Funktionen auszutauschen. Bei einem GUI kann man die Werte per
setappdata / getappdata
oder
guidata
speichern, oder alternativ in den UserData des Objektes, zu dem die Daten gehören.
Als professioneller Programmierer ist dieser erste Satz also bereits ein Alarmsignal, dass das Design Deines Codes ein grundätzliches Problem hat.
Ich sehe im Code ein
assignin
, das Variablen ferngesteuert im Base WorkSpace. Das zieht Bugs an.
Zitat:
Wie kann ich dies nun als dynamische Auswahlmöglichkeiten einstellen?
Ich habe die eigentliche Frage nicht verstanden.
Zitat:
Alle Tutorien/Videos zum Thema arbeiten nur mit statischen Auswahlmöglichkeiten
:?
Das glaube ich nicht.
Ich arbeite nicht mit GUIDE, aber der Debugger sollte Dir helfen:
Ich vermute, innerhalb der CreateFcn des GUIs ist "handles" nocht nicht existent, oder? Die globale Variable existiert vielleicht auch noch nicht.
Vermutlich sollte dieser Code erst in der OpeningFcn ausgeführt werden, wenn das GUI also bereits erstellt wurde.
Hallo Jan,
vielen Dank für die schnelle und so ausführliche Antwort. Du hast mir viel Input gegeben, der mich eine Weile beschäftigen wird, danke dafür!
Zitat:
Zitat:
Wie kann ich dies nun als dynamische Auswahlmöglichkeiten einstellen?
Ich habe die eigentliche Frage nicht verstanden.
Ich möchte diese Frage nocheinmal konkretisieren.
Ziel ist, dass meine GUI ein Dropdownmenü enthält, welches vorher vom Nutzer eingelesene Daten enthält.
Diese Daten werden werden per xlsread in der Variablen v_station (beispielhaft lassen wir das mal ein 1000x1 double sein) gespeichert.
Ich bin dazu einfach bisher nicht fündig geworden, vermutlich aufgrund falscher Suchbegriffe.
Liebe Grüße
Toni
Wie lassen sich nun die Variableninhalte in die Auswahl des Dropdownmenüs einfügen?
Fragen sind sehr oft zu umständlich gestellt, weil der Fragende ja noch gar nicht weiß, welche Details für die Lösung relevant sind. Die Lösung ist oft trivial, wenn man erstmal die richtige Frage gefunden hat. Das liegt in der Natur der Dinge - oder vielleicht am menschlichen Gehirn. :-)
Gruß, Jan
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.