Verfasst am: 12.09.2017, 00:48
Titel: GUI mit Popupmenu
Hallo zusammen,
ich versuche mich seit ein paar Wochen an Matlab und konnte mich mit der Hilfe von Dokumentationen einigermaßen zurechtfinden. Jetzt komme ich jedoch bei der Programmierung eines GUI einfach nicht weiter.
(Ich bin mit Fachbegriffen noch nicht so vertraut und bitte um Verständnis, falls ich den falschen verwende)
Ich lese aus einer Datei Überschriften aus, die in das cell array "name2" durch einen Druck auf "databutton" übergeben werden. Diesen Überschriften füllen dann das popupmenu1.
Code:
% --- Executes on button press in databutton. function databutton_Callback(hObject, eventdata, handles)
Bei der Auswahl im "popupmenu1" von z.B. Bahn soll der entsprechende Indexwert 3 an handles.current_data übergeben werden, da ich damit später die entsprechende Spalte mit den Daten auslesen möchte.
Ich habe mich dabei an einem Beispiel orientiert und mir ist noch nicht ganz klar, was die ersten drei Zeilen genau machen.
Code:
function popupmenu1_CreateFcn(hObject, eventdata, handles)
str = get(hObject, 'String'); % ?
val = get(hObject,'Value'); % ? switch str{val}; % ?
name2=handles.name2; % name2 aus handle structure
case 'Auto';
handles.current_data=find(strcmp(name2,'Auto')); % Index an current_data übergeben
case 'Bahn';
handles.current_data=find(strcmp(name2,'Bahn'));
case 'Fahrrad';
handles.current_data=find(strcmp(name2,'Fahrrad'));
case 'Bus';
handles.current_data=find(strcmp(name2,'Bus'));
CreateFcn werden bei der Erzeugung der GUI aufgerufen, also noch bevor eine GUI auf Monitor angezeigt wird. Hier kann nur einige Parameter für Erscheinungsbild von Popupmenu ändern, so was wie Farbe, Font....
Das was du erreichen möchtest, sollte dagegen in CallbackFcn von Popumenu gemacht werden. Dann sollte es auch funktionieren.
Zitat:
Ich habe mich dabei an einem Beispiel orientiert und mir ist noch nicht ganz klar, was die ersten drei Zeilen genau machen.
hObject erster Parameter bei Callback oder CreateFct, zeigt handle(es ist ein Zeiger/eine Adresse) den Graphischen Objekt welcher diese Funktion aufgerufen hat.z.B dein Popupmenu
JanK
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.09.2017, 21:53
Titel:
Hallo denny,
vielen Dank für Deine Antwort. Ich hatte garnicht bemerkt, dass ich in CreateFcn gelandet bin und hätte den Fehler alleine wohl nie gefunden. Jetzt bin ich wieder ein Stück weitergekommen.
Meine Frage zu den ersten drei Zeilen bezog sich auf.
Code:
str = get(hObject, 'String');
val = get(hObject,'Value');
switch str{val};
% Gibt eine Liste mit Menueinträgen. Das ist eine Cell mit Strings % kannst z.B disp(str) schreiben, da wirst in der Konsole sehen die Ausgabe
str = get(hObject, 'String');
% jetzt muss mit dem Index, den aktuell selektierten Eintrag holen % das wird mit den geschweiften Klammern gemacht str{val} % und in der switch wird Bedingungen abgefragt, wenn Eintrag z.B Max lautet, dann mache folgendes, wenn Joh dann etwas anderes usw. switch str{val} case 'Max'
case 'Joh'
end
Ich hoffe, ich konnte es dir verständlich erklären. Du kannst z.B ein Breakpoint in der Funktion setzen und in der Konsole die Werte sich genauer anschauen. Einfach im Editor am Linken Rand die Zeile direkt nach Zeilennummer anklicken, wo Strich steht(das bedeutet das dort Breakpoint setzen kann). Und dann einfach dein Programm laufen lassen, etwas in Popupmenu auswählen und das Programm haltet dann an der Stelle.
JanK
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 14.09.2017, 23:22
Titel:
Hallo denny,
vielen Dank für die ausführliche Erklärung. Jetzt kann ich das besser nachvollziehen und das Experimentieren macht sogar ein bischen Spaß
Gruß
Jan
JanK
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 16.09.2017, 14:12
Titel:
Hallo,
ich habe doch noch eine Frage zu einem neu aufgetauchten Problem, welches sich mit dem Popupmenu ergab.
Zum testen ob die Auswahl richtig funktioniert habe ich mir diesen kleinen Code geschrieben, welcher bei Betätigen eines pushbuttons für einen gewählten Menueintrag entweder "EINS" oder "Rest" ausgeben sollte.
Code:
function pushbutton_Callback(hObject, eventdata, handles)
if handles.current_data == 1; %%
mess=('EINS);
set(handles.text19, 'string', mess);
else
mess=('Rest');
set(handles.text19, 'string', mess);
end
Bei meinem Popupmenu muss ich den ersten aufgelisteten Eintrag jedoch noch einmal manuell auswählen, weil dieser - wenn ich es richtig verstanden habe - noch keine Zuweisung erhalten hat.
Nach ein wenigt Herumstöbern habe ich Ansätze gefunden, wobei ein weiterer Callback erzeugt werden soll. Leider weiß ich weder wie das gehen soll, wo ich den eintragen soll und ob dies überhaupt zum Erfolg führt.
Ist jemand vielleicht mit diesem Problem vertraut und weiß Abhilfe?
Bei meinem Popupmenu muss ich den ersten aufgelisteten Eintrag jedoch noch einmal manuell auswählen, weil dieser - wenn ich es richtig verstanden habe - noch keine Zuweisung erhalten hat.
Nein du kannst den Eintrag durch setzen der Value auswählen
Code:
% z.B
%einfügen zusäztlicher Eintäge in die Popupmenu
strlist = set(handles.popupmenu, 'String');
strlist(end+1) = "Neuer Eintrag";
set(handles.popupmenu, 'String', strlist);
% Springen auf zuletzt eingefügten Eintrag set(handles.popupmenu, 'Value', length(strlist));
Sonst musst du nochmal erklären, weil bin mir nicht sicher was unter deinem Problem meinst
JanK
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.09.2017, 22:33
Titel:
Hallo,
ich versuche es noch einmal etwas genauer zu erklären.
Mein Popupmenu wird mit den Einträgen Auto,Bahn,Fahrrad und Bus gefüllt, die aus einer Datei gelesen werden. (Können also auch weniger oder mehr sein)
Auto steht dann z.B. an erster Stelle und sollte den Wert 1 haben, Bahn 2 usw..
Wenn ich jetzt einen Pushbutton drücke, soll der Wert über ein "static text" ausgegeben werden.
Drücke ich den Knopf, ohne im Popupmenu etwas ausgewählt zu haben, ist
"handles.current_data" aber unbekannt. Wähle ich jedoch "Auto" oder einen anderen Eintrag aus, funktioniert alles wunderbar.
Ich möchte jedoch, dass der erste Eintrag nicht noch einmal extra ausgewählt werden muss.
Code:
% --- Executes on button press in databutton. function databutton_Callback(hObject, eventdata, handles)
Das ist einfacher als ein Switch-Block in dem alle Strings hardcodiert wiederholt werden.
Gruß, Jan
JanK
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 23.09.2017, 01:53
Titel:
Hallo und danke für die Antwort.
Zitat:
Dann definiere einfach "handles.current_data" in der OpeningFcn als 1.
Hatte ich schon einmal probiert aber wahrscheinlich an der falschen Stelle eingefügt. Gehört dann vermutlich in die OpenningFCn vom Popupmenu. Werde es noch einmal probieren.
Zitat:
Bemerkung: Kannst Du statt der Suchen nach der Übereinstimmung des Strings nicht einfach "val" verwenden?
Ich bin nicht 100 %ig sicher ob Dein Vorschlag zum gewünschten Ergebnis führt oder vielleicht habe ich es falsch verstanden. Die Idee dahinter ist, dass die Überschriften aus einer Datei herausgelesen werden, wobei Anzahl und Reihenfolge variieren können. Hiermit möchte ich erreichen, dass nur die vorhandenen Überschriften 1-n durchnummeriert werden. Für das Beispiel hatte ich zur Vereinfachung nur diese 4 Überschriften fest vorgegeben, da der Code sonst sehr unübersichtlich wird.
Probiere ich morgen in Ruhe aus aber wenn ich das richtig interpretiere, dann ist Dein Vorschlag eine enorme Verbesserung. Danke dafür!
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.