Verfasst am: 02.07.2015, 10:30
Titel: Im Popup-Menu vorherigen Text/Wert auslesen
Hallo zusammen,
ich habe folgendes Problem. Und zwar bin ich gerade dabei ein wenig in die Welt der GUIs einzutauchen. Ich sitze zur Zeit an den beliebten Popup-Menüs. Die kriege ich soweit auch programmiert und ans laufen. mein Problem ist jetzt allerdings, dass ich gerne auf den vorher ausgewählten Wert/Text zurückgreifen würde. Angenommen man hat mein Popup-Menü mit den Einträgen Maus, Katze, Hund (mein beliebtes Beispiel), und ich habe nun als erstes den Hund ausgewählt. Dann wähle ich in einem zweiten Schritt die Katze aus. Jetzt möchte ich, dass mir der vorherige Wert (hier in dem kleinen Beispiel also der Hund) angezeigt wird. Bisher habe ich das Popup-Menü folgendermaßen programmiert:
Code:
function popupmenu1_Callback(hObject, eventdata, handles) % hObject handle to popupmenu1 (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 popupmenu1 contents as cell array % contents{get(hObject,'Value')} returns selected item from popupmenu1 % Nummer des ausgewählten Menü-Eintrags
val = get(handles.popupmenu1, 'Value');
% Liste der Einträge im Pop-up-Menü
str = get(handles.popupmenu1, 'String');
% Text zur ausgewählten Nummer des Eintrags switch(str{val}) case 'Maus'
vorherigerEintrag = get(handles.popupmenu1, 'String');
NummervorherigerEintrag = get(handles.popupmenu1, 'Value');
disp(vorherigerEintrag{NummervorherigerEintrag});
handles.zaehlerMaus = 0;
handles.zaehlerMaus = handles.zaehlerMaus+1;
M = handles.zaehlerMaus;
set(handles.edit1,'String',sprintf('Maus %g',M));
case 'Katze'
vorherigerEintrag = get(handles.popupmenu1, 'String');
NummervorherigerEintrag = get(handles.popupmenu1, 'Value');
disp(vorherigerEintrag{NummervorherigerEintrag});
handles.zaehlerKatze = handles.zaehlerKatze+1;
K = handles.zaehlerKatze;
set(handles.edit1,'String',sprintf('Katze %g',K));
case 'Hund'
vorherigerEintrag = get(handles.popupmenu1, 'String');
NummervorherigerEintrag = get(handles.popupmenu1, 'Value');
disp(vorherigerEintrag{NummervorherigerEintrag});
handles.zaehlerHund = handles.zaehlerHund+1;
H = handles.zaehlerHund;
set(handles.edit1,'String',sprintf('Hund %g',H));
end guidata(hObject, handles);
P.S.: Lasst euch nicht von dem Zähler irritieren, der gibt nur die Anzahl an Hunden, Katzen und Mäusen aus, die in allen Popup-Menüs (ich habe insgesamt mehrere) ausgewählt wurden. Daher muss ich auch den vorherigen Eintrag eines einzelnen Popup-Menüs kennen, um beim Wechsel auf einen anderen Eintrag vom vorherigen Eintrag im Zähler wieder Eins abzuziehen.
Ich hoffe Ihr könnt mir helfen
Vielen Dank schonmal vorab
Grüße
Max
sobald du eine neue Auswahl machst, ist die alte Auswahl nicht mehr direkt verfügbar. Du musst die neue Auswahl also explizit abspeichern, damit sie später als dann alte Auswahl verfügbar ist. Das kannst du über setappdata/getappdata machen oder hier vielleicht einfacher 'UserData':
Code:
% neue Auswahl abspeichern set(handles.popupmenu1, 'UserData', ...);
vielen Dank für deine Antwort. Ich habe es jetzt genau so programmiert!
Code:
functionvarargout = TextinDatenbank(varargin) % TEXTINDATENBANK MATLAB code for TextinDatenbank.fig % TEXTINDATENBANK, by itself, creates a new TEXTINDATENBANK or raises the existing % singleton*.
%
% H = TEXTINDATENBANK returns the handle to a new TEXTINDATENBANK or the handle to % the existing singleton*.
%
% TEXTINDATENBANK('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in TEXTINDATENBANK.M with the given input arguments.
%
% TEXTINDATENBANK('Property','Value',...) creates a new TEXTINDATENBANK or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before TextinDatenbank_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to TextinDatenbank_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help TextinDatenbank
% Last Modified by GUIDE v2.5 02-Jul-2015 15:22:36
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @TextinDatenbank_OpeningFcn, ...
'gui_OutputFcn', @TextinDatenbank_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
ifnargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
% --- Executes just before TextinDatenbank is made visible. function TextinDatenbank_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to TextinDatenbank (see VARARGIN)
% UIWAIT makes TextinDatenbank wait for user response (see UIRESUME) % uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line. functionvarargout = TextinDatenbank_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure varargout{1} = handles.output;
function edit1_Callback(hObject, eventdata, handles) % hObject handle to edit1 (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 edit1 as text % str2double(get(hObject,'String')) returns contents of edit1 as a double global gbt15_data
txt = get(handles.edit1, 'String');
gbt15_data.zeile1 = txt;
% --- Executes during object creation, after setting all properties. function edit1_CreateFcn(hObject, eventdata, handles) % hObject handle to edit1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called
% Hint: edit 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
function edit2_Callback(hObject, eventdata, handles) % hObject handle to edit2 (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 edit2 as text % str2double(get(hObject,'String')) returns contents of edit2 as a double global gbt15_data
txt = get(handles.edit2, 'String');
gbt15_data.zeile2 = txt;
% --- Executes during object creation, after setting all properties. function edit2_CreateFcn(hObject, eventdata, handles) % hObject handle to edit2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called
% Hint: edit 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
% --- Executes on selection change in popupmenu1. function popupmenu1_Callback(hObject, eventdata, handles) % hObject handle to popupmenu1 (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 popupmenu1 contents as cell array % contents{get(hObject,'Value')} returns selected item from popupmenu1 % Nummer des ausgewählten Menü-Eintrags
val = get(handles.popupmenu1, 'Value');
% Liste der Einträge im Pop-up-Menü
str = get(handles.popupmenu1, 'String');
% Text zur ausgewählten Nummer des Eintrags switch(str{val}) case 'Maus'
vorherigeAuswahl = get(handles.popupmenu1, 'UserData');
ifstrcmp(vorherigeAuswahl,'Maus') == 1 && handles.zaehlerMaus >0
handles.zaehlerMaus = handles.zaehlerMaus-1;
elseifstrcmp(vorherigeAuswahl,'Katze') == 1 && handles.zaehlerKatze >0
handles.zaehlerKatze = handles.zaehlerKatze-1;
elseifstrcmp(vorherigeAuswahl,'Hund') == 1 && handles.zaehlerHund >0
handles.zaehlerHund = handles.zaehlerHund-1;
else
handles.zaehlerHund = handles.zaehlerHund+1;
H = handles.zaehlerHund;
set(handles.edit1,'String',sprintf('Hund %g',H));
set(handles.popupmenu1, 'UserData', 'Hund') end guidata(hObject, handles);
% --- Executes during object creation, after setting all properties. function popupmenu1_CreateFcn(hObject, eventdata, handles) % hObject handle to popupmenu1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called
% 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 % Pop-up-Menü belegen
cell_var = {'Please choose a component', 'Maus', 'Katze', 'Hund'};
set(hObject, 'String', cell_var);
% --- Executes on selection change in popupmenu2. function popupmenu2_Callback(hObject, eventdata, handles) % hObject handle to popupmenu2 (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 popupmenu2 contents as cell array % contents{get(hObject,'Value')} returns selected item from popupmenu2
val = get(handles.popupmenu2, 'Value');
% Liste der Einträge im Pop-up-Menü
str = get(handles.popupmenu2, 'String');
% Text zur ausgewählten Nummer des Eintrags switch(str{val}) case 'Maus'
vorherigeAuswahl = get(handles.popupmenu2, 'UserData');
ifstrcmp(vorherigeAuswahl,'Maus') == 1 && handles.zaehlerMaus >0
handles.zaehlerMaus = handles.zaehlerMaus-1;
elseifstrcmp(vorherigeAuswahl,'Katze') == 1 && handles.zaehlerKatze >0
handles.zaehlerKatze = handles.zaehlerKatze-1;
elseifstrcmp(vorherigeAuswahl,'Hund') == 1 && handles.zaehlerHund >0
handles.zaehlerHund = handles.zaehlerHund-1;
else
end
handles.zaehlerHund = handles.zaehlerHund+1;
H = handles.zaehlerHund;
set(handles.edit2,'String',sprintf('Hund %g',H));
set(handles.popupmenu2, 'UserData', 'Hund') end guidata(hObject, handles);
% --- Executes during object creation, after setting all properties. function popupmenu2_CreateFcn(hObject, eventdata, handles) % hObject handle to popupmenu2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles empty - handles not created until after all CreateFcns called
% 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
cell_var = {'Please choose a component', 'Maus', 'Katze', 'Hund'};
set(hObject, 'String', cell_var);
Ich habe die Files auch mal angehangen!
Allerdings habe ich jetzt noch ein Problem und zwar wenn mann jetzt bspw. im ersten Popupmenü Katze auswählt erscheint in dem Textfeld auch Katze 1. Und wenn ich dann nochmal im ersten Popupmenü Katze auswähle, dann bleibt es auch bei Katze 1. Wenn man dann im zweiten Textfeld auch Katze auswählt, dann erscheint in dem zweiten Textfeld auch Katze 2. Soweit sogut! Wenn ich jetzt allerdings im ersten Popupmenü wieder Katze auswähle, dann erscheint in dem Textfeld auch der Name Katze 2. Genau das darf nicht passieren. Das Programm muss irgendwie erkennen, dass es Katze 2 schon gibt und somit Katze 1 als Namen vergeben muss. Lässt sich das irgendwie realisieren?
soweit ich das überblicke, setzt du momentan den Zähler einfach hoch.
Wirst du irgendwann viele dieser Popups haben? Dann würde ich wirklich die bereits verwendeten Indizes als Vektor abspeichern (z.B. [1 2 4 5]) und dann nach dem ersten "freien" Index (hier: 3) suchen.
Wenn du aber nur zwei Popups hast, brauchst du an sich nur zu schauen, ob im anderen 'Katze1' steht.
Eine grundsätzliche Sache ist, dass man kopierten oder leicht abgewandelten Code (hier: für die beiden Popupmenus und dann nochmal für die verschiedenen Tiere) vermeiden und stattdessen Funktionen verwenden sollte, die mit entsprechenden Argumenten aufgerufen werden.
ich möchte später mehrere Popup-Menüs verwenden. Könntest du mir das beispiel mit dem Vektor anhand meines Beispiels etwas genauer erklären? Ich habe momentan leider keine Ahnung, wie ich das ganze implementieren könnte.
Zum zweiten Punkt: Du hast vollkommen recht, das ewige kopieren und leichte Abwandeln von Code kann auch nicht die Lösung sein. Allerdings weiß ich auch hier nicht, wie ich soetwas mit einer Funktion realisieren kann. Ist soetwas überhaupt möglich, oder muss ich z.B. für jede swicht-Bedingung, in welcher ja im wesentlich der immer leicht abgewandelte und so zu jeder switch-Bedingung individuelle Code steht, eine eigene Funktion schreiben?
Und wie sähe so eine Funktion/oder eben mehrere Funktionen z.B. in meinem noch recht einfachen Beispiel aus? Hättest du da eine Lösung parat oder kannst du mir da nicht weiterhelfen?
Vorschlag im Anhang...
An der .fig habe ich nichts verändert.
Um das flexibler zu machen, würde ich aber die Auswahlmöglichkeiten nicht im .fig abspeichern, sondern über die OpeningFcn setzen.
Zudem sollte man die Option "Please choose..." entfernen, sobald erstmals eine Auswahl getroffen wurde.
ich hoffe du hattest ein angenehmes und schönes Wochenende trotz all der Hitze.
Vielen Dank für deine Optimierung. Ich bin gerade dabei durchzusteigen, wie du das ganze gelöst hast. Irgendwie bekomme ich immer einen Fehler, wenn ich die GUI laufen lassen will. Und zwar meckert Matlab wie folgt:
Code:
Reference to non-existent field 'edit1'.
Error in TextinDatenbank>updatePopupmenu (line206) set(handles.(passendesEdit),'String',sprintf('%s %g',neueAuswahl, neuerIndex));
Error in TextinDatenbank>popupmenu1_Callback (line138)
updatePopupmenu(hObject, handles)
Ich habe daraufhin mal geguckt und entdeckt, dass die edit-Felder gar nicht edit-Felder sind, sondern text1 und text2. Daraufhin habe ich alle edit1 und edit2 functions im m-File umbenannt in text1 und text2. Allerdings ohne großen Erfolg. Der Fehler erscheint immer noch. (Anbei habe ich mal die korrigierte Version gehangen)
Eine weitere Frage, die ich nocht ganz verstehe, ist das Ansprechen der Handles. und zwar schreibst du beispielsweise:
handles.Vektor.(vorherigeAuswahl)
Wieso steht vorherigeAuswahl in Klammern? Welchen Effekt/Sinn haben die Klammern (vorab sorry für die dumme Frage, aber ich verstehe es leider noch nicht).
Das zweite, was ich noch nicht so ganz verstehe ist, war um du zu Beginn folgendes in der for-Schleife schreibst:
handles.Vektor.(animals{I}) = [];
handles.Index.(animals{I}) = [];
Wären damit nicht die beiden handles mit identischem Inhalt gefüllt? Hätte man nicht einfach nur ein Handle Vektor oder Index benötigt?
edit in text umschreiben. Allerdings verstehe ich diese Zeile nicht so wirklich.
Mit strrep ersetzt man ja das Wort popupmenu durch text. Aber wie funktioniert das hier?
get(hObject, 'Tag') besagt ja, dass im aktuellen Objekt (ich nehme an je nachdem in welchem Popupmenü man sich gerade befindet???) der Tag von popupmenu auf text umgestellt werden soll. Da kommen mehrere Fragen bei mir auf:
1. Wieso wird der Tag geändert? Verstehe ich das richtig, dass das Popupmenü einfach in ein text-Feld umbenannt wird? Das macht doch keinen Sinn, so founktioniert es ja auch nicht, aber ich kann es mir gerade nicht erklären.
2. Angenommen man befindet sich in popupmenu2. Dort ist der Tag popupmenu2. Wenn ich jetzt in diesem Objekt popupmenu durch text ersetze, wie es der Code besagt, dürfte doch eigentlich nichts passieren, denn der eigentliche Tag ist ja popupmenu2. Sprich es gibt sozusagen ja gar keinen Tag mit popupmenu?
Wie funktioniert das? Kannst du mir das vllt. etwas genauer erklären?
ich hatte die GUI an sich getestet. Du hattest in deiner geposteten .fig Edit Text verwendet, und daran habe ich mich gehalten. Wenn du auf Static Text umsteigst, dann ist die Änderung in deinem letzten Beitrag so richtig.
Zitat:
Eine weitere Frage, die ich nocht ganz verstehe, ist das Ansprechen der Handles. und zwar schreibst du beispielsweise:
handles.Vektor.(vorherigeAuswahl)
Wieso steht vorherigeAuswahl in Klammern? Welchen Effekt/Sinn haben die Klammern (vorab sorry für die dumme Frage, aber ich verstehe es leider noch nicht).
Das nennt sich dynamische Indizierung. Der Effekt ist, dass der Ausdruck in Klammern ausgewertet wird, bevor er als Feldname verwendet wird. Einfaches Beispiel:
Das zweite, was ich noch nicht so ganz verstehe ist, war um du zu Beginn folgendes in der for-Schleife schreibst:
handles.Vektor.(animals{I}) = [];
handles.Index.(animals{I}) = [];
Wären damit nicht die beiden handles mit identischem Inhalt gefüllt? Hätte man nicht einfach nur ein Handle Vektor oder Index benötigt?
Da hatte ich einen Knoten im Hirn. Vektor speichert alle gemachten Auswahlen ab. Index hat nicht seinen Zweck erfüllt. Ich habe eine neue Variante angehängt (immer noch mit Edit Text-Feldern).
Was die letzte Frage angeht: die Zeile ändert gar keine Tags, sie findet nur ein Tag: wenn z.B. in popupmenu2 eine Änderung passierte, dann gibt sie edit2 bzw. text2 zurück. Noch ist in der GUI nichts passiert. Erst in der folgenden Zeile (bzw. in meiner aktuellen Version etwas später) wird der neue String als Feld für Handles und somit quasi als Tag verwendet.
vielen Dank für die Erklärungen Harald. Die waren sehr hilfreich und echt super mit den Beispielen erklärt.
Ich hätte aber noch ein paar Fragen:
Und zwar eine kleine. Bisher habe ich die Popupmenüs in der CreateFcn belegt. Sind sie momentan auch noch in der von dir verbesserten Datei. Daher meine Frage:
Benötige ich die Belegung:
2. Frage:
Wenn man functions (wie in unserem Beispiel function updatePopupmenu) in GUI's schreibt, muss man dann immer als Übergabeparametern (hObject, handles) haben?
Und warum schreibt man eine function einfach als: function updatePopupmenu(hObject, handles)? Ich kenne es bisher nur so, dass ich eine Funktion wie folgt schreibe:
function [Ausgabewert(e)] = Funktionsname(Eingabewert(e)).
Beispielsweise:
Was ist denn bei der Dekleration updatePopupmenu(hObject, handles) der Ausgabewert? Und was der Eingabewert (vermutlich ja (hObject, handles))?
Sorry für die blöden Fragen, aber ich verstehe es aktuell noch nicht wirklich. Es wäre super, wenn du mir da in deiner gewohnt zuverlässig, sachlich guten Art Hilfestellung leisten könntest.
Anbei noch eine kleine Frage zu einem Bug, der mir aufgefallen ist. Und zwar ist es so, wenn ich in deiner optimierten Datei im Popupmenu statt Maus,Katze oder Hund einfach auf Please choose ... klicke, dass dann das gesamte Popupmenu verschwindet. Dies liegt glaube ich an der if-Schleife:
Code:
ifstrcmp(str{1}, 'Please choose...')
str(1) = [];
val = val - 1;
set(hObject, 'String', str) set(hObject, 'Value', val) end
Hast du da noch eine Idee, wie man das ganze noch ein Stück verbessern kann?
Anbei habe ich noch flott die von Datei von dir überarbeitet, da ich aktuell text verwende in der fig-Datei
Grüße
Max
Dort wird ja in der handles-Struktur auf die vorherige Auswahl (angenommen ich hatte zuvor Hund ausgewählt und wähle jetzt Katze aus) zurückgegriffen. Also um beim Beispiel mit dem Hund zu bleiben:
Welchen Sinn ergibt das?
alterIndex müsste ja, wenn ich das richtig verstanden habe, entweder 1 oder 2 sein (je nachdem in welchem Popup-Menü man sich gerade befindet), da alterIndex ja mit dem Befehl str2double(passendesEdit(end)) belegt wird. Und passendesEdit ist ja strrep(get(hObject, 'Tag'), 'popupmenu', 'text'). Das heißt es wird beispielsweise im ersten Popupmenü der Tag popupmenu1 als String ausgelesen und dann in text1 umbenannt.
Wo ist mein Denkfehler? Kannst du mir bei der oben genannten Zeile helfen?
Probiere es einfach aus. Du kannst den Code auskommentieren und probieren, ob das GUI noch alles macht, was Du brauchst.
Zitat:
2. Frage:
Wenn man functions (wie in unserem Beispiel function updatePopupmenu) in GUI's schreibt, muss man dann immer als Übergabeparametern (hObject, handles) haben?
Callbacks werden -wie in der Dokumentation beschrieben, die man unbedingt lesen sollte- immer mit den Argumenten (hObject, EventData) aufgerufen. Man kann noch weitere Inputs anhängen, aber die ersten beiden sind fest. Das ist die Natur von Callback-Funktionen.
Zitat:
Und warum schreibt man eine function einfach als: function updatePopupmenu(hObject, handles)? Ich kenne es bisher nur so, dass ich eine Funktion wie folgt schreibe:
function [Ausgabewert(e)] = Funktionsname(Eingabewert(e)).
Stimmt. Und bei Callbacks gibt es keine Rückgabe-Werte, weil sie aufgerufen werden, wenn ein Event auftritt, z.B. wenn der User auf einen Button drückt. In diesem Fall kann man niemandem etwas zurückgeben, da es keine aufrufende Funktion gibt.
Zitat:
Was ist denn bei der Dekleration updatePopupmenu(hObject, handles) der Ausgabewert? Und was der Eingabewert (vermutlich ja (hObject, handles))?
Die Inputs sind (mindestens) hObject und EventData, bei GUIs die per GUIDE erstellt werden auch "handles", aber das ist Geschmackssache. Und einen Output gibt es nicht, wie gesagt.
Zitat:
Sorry für die blöden Fragen, aber ich verstehe es aktuell noch nicht wirklich. Es wäre super, wenn du mir da in deiner gewohnt zuverlässig, sachlich guten Art Hilfestellung leisten könntest.
Ich hoffe es macht nichts, dass ich die Antwort nicht Harald überlassen habe.
Ich kann das Lesen der Dokumentation nur wärmstens empfehlen.
Zitat:
Dies liegt glaube ich an der if-Schleife:
Auch wenn man das im Forum immer wieder list, gibt es keine "if-Schleifen". "if" erzeugt eben genau gerade keine Schleife.
Die Zahl "alterIndex" wird aus dem Vektor "vorherigeAuswahl" ausgeschlossen.
Du kannst die Zeile auskommentieren und mit dem Debugger untersuchen, was sich ändert.
Vielen Dank für die ausführlichen Hilfestellungen und Erklärungen Jan. Selbstverständlich macht es nichts. Je mehr Input und Hilfe ich bekomme, destso besser ist das für mein Erlernen von Matlab und speziell der GUI-Programmierung.
Denn ich habe schon das nächste Problem.
Ich möchte nun Bilder nebeneinander anordnen. Das kriege ich soweit auch hin, allerdings sobald ich in allen drei Popupmenüs etwas ausgewählt habe (Plus,Minus,Pfeile) und dann wieder in das erste Popupmenu springe und dort etwas anderes auswähle, dann fügt der einfach weitere Bilder hinten dran. Das will ich aber nicht. Ich möchte einfach Bilder in jedem Popup-Menu auswählen, die dann aneinandergefügt werden. Und wenn ich in das erste oder zweite Popupmenü zurück gehe (z.B. weil ich dort mich doch für ein anderes Bild entschieden habe), dann möchte ich, dass dort einfach das ausgewählte Bild (z.B. das erste) durch das neu ausgewählte im ersten Popupmenu ersetzt wird. (UND NICHT HINTEN ANGEHANGEN WIRD).
Allerdings habe ich dafür momentan nicht den Hauch einer Idee, wie ich das ganze in Matlab realisieren kann. Habt ihr Tipps. Speziell die letzte Hilfe von Harald, in der er das m-file umgeschrieben hat für die belegung der Popupmenüs war sehr anschaulich. Vllt. könnte ich eine solche Hilfestellung wieder bekommen von euch. Ich habe die Dateien in einem zip-Ordner angehangen (die drei Bilder plus das m-file und das fig-file)
Und was mir gerade noch aufgefallen ist:
Wenn ich jetzt 3 Popup-Menüs habe, dann funktioniert das mit der richtigen Bennenung nicht mehr. Sprich wenn ich jetzt z.B. im ersten Popupmenü Pfeile auswähel und im zweiten auch Pfeile auswähle, dann wird mir wunderschön Pfeile 1 und Pfeile 2 angezeigt. Wenn ich dann noch im dritten Popupmenü Minus auswähle, dann wird auch noch wunderbar Minus 1 angezeigt. Wähle ich aber nun wieder im ersten Popupmenü Minus aus, so erscheint Minus 2. Wähle ich dann dort noch einmal Minus aus, dann erscheint das gewünschte Minus 1, was nun aber auch im dritten Popupmenü vergeben ist.
Hat jemand eine Idee, wie man das ganze noch lösen könnte?
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.