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

Im Popup-Menu vorherigen Text/Wert auslesen

 

MatlabErlerner
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2015, 10:30     Titel: Im Popup-Menu vorherigen Text/Wert auslesen
  Antworten mit Zitat      
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
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: 02.07.2015, 10:36     Titel:
  Antworten mit Zitat      
Hallo,

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', ...);

Code:
% alte Auswahl abfragen
alteAuswahl = get(handles.popupmenu1, 'UserData');


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

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2015, 07:31     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Antwort. Ich habe es jetzt genau so programmiert!

Code:
function varargout = 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',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- 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)

% Choose default command line output for TextinDatenbank
handles.output = hObject;
handles.zaehlerMaus = 0;
handles.zaehlerKatze = 0;
handles.zaehlerHund = 0;
% Update handles structure
guidata(hObject, handles);

% UIWAIT makes TextinDatenbank wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = 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.
if ispc && 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.
if ispc && 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');
        if strcmp(vorherigeAuswahl,'Maus') == 1 && handles.zaehlerMaus >0
            handles.zaehlerMaus = handles.zaehlerMaus-1;
        elseif strcmp(vorherigeAuswahl,'Katze') == 1 && handles.zaehlerKatze >0
            handles.zaehlerKatze = handles.zaehlerKatze-1;
        elseif strcmp(vorherigeAuswahl,'Hund') == 1 && handles.zaehlerHund >0
            handles.zaehlerHund = handles.zaehlerHund-1;
        else
       
        end
        handles.zaehlerMaus = handles.zaehlerMaus+1;
        M = handles.zaehlerMaus;
        set(handles.edit1,'String',sprintf('Maus %g',M));
        set(handles.popupmenu1, 'UserData', 'Maus')
        case 'Katze'
        vorherigeAuswahl = get(handles.popupmenu1, 'UserData');
        if strcmp(vorherigeAuswahl,'Maus') == 1 && handles.zaehlerMaus >0
            handles.zaehlerMaus = handles.zaehlerMaus-1;
        elseif strcmp(vorherigeAuswahl,'Katze') == 1 && handles.zaehlerKatze >0
            handles.zaehlerKatze = handles.zaehlerKatze-1;
        elseif strcmp(vorherigeAuswahl,'Hund') == 1 && handles.zaehlerHund >0
            handles.zaehlerHund = handles.zaehlerHund-1;
        else
       
        end
        handles.zaehlerKatze = handles.zaehlerKatze+1;
        K = handles.zaehlerKatze;
        set(handles.edit1,'String',sprintf('Katze %g',K));
        set(handles.popupmenu1, 'UserData', 'Katze')
        case 'Hund'
        vorherigeAuswahl = get(handles.popupmenu1, 'UserData');
        if strcmp(vorherigeAuswahl,'Maus') == 1 && handles.zaehlerMaus >0
            handles.zaehlerMaus = handles.zaehlerMaus-1;
        elseif strcmp(vorherigeAuswahl,'Katze') == 1 && handles.zaehlerKatze >0
            handles.zaehlerKatze = handles.zaehlerKatze-1;
        elseif strcmp(vorherigeAuswahl,'Hund') == 1 && handles.zaehlerHund >0
            handles.zaehlerHund = handles.zaehlerHund-1;
        else
       
        end
       
        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.
if ispc && 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');
        if strcmp(vorherigeAuswahl,'Maus') == 1 && handles.zaehlerMaus >0
            handles.zaehlerMaus = handles.zaehlerMaus-1;
        elseif strcmp(vorherigeAuswahl,'Katze') == 1 && handles.zaehlerKatze >0
            handles.zaehlerKatze = handles.zaehlerKatze-1;
        elseif strcmp(vorherigeAuswahl,'Hund') == 1 && handles.zaehlerHund >0
            handles.zaehlerHund = handles.zaehlerHund-1;
        else
       
        end
        handles.zaehlerMaus = handles.zaehlerMaus+1;
        M = handles.zaehlerMaus;
        set(handles.edit2,'String',sprintf('Maus %g',M));
        set(handles.popupmenu2, 'UserData', 'Maus')
    case 'Katze'
        vorherigeAuswahl = get(handles.popupmenu2, 'UserData');
        if strcmp(vorherigeAuswahl,'Maus') == 1 && handles.zaehlerMaus >0
            handles.zaehlerMaus = handles.zaehlerMaus-1;
        elseif strcmp(vorherigeAuswahl,'Katze') == 1 && handles.zaehlerKatze >0
            handles.zaehlerKatze = handles.zaehlerKatze-1;
        elseif strcmp(vorherigeAuswahl,'Hund') == 1 && handles.zaehlerHund >0
            handles.zaehlerHund = handles.zaehlerHund-1;
        else
       
        end
        handles.zaehlerKatze = handles.zaehlerKatze+1;
        K = handles.zaehlerKatze;
        set(handles.edit2,'String',sprintf('Katze %g',K));
        set(handles.popupmenu2, 'UserData', 'Katze')
    case 'Hund'
        vorherigeAuswahl = get(handles.popupmenu2, 'UserData');
        if strcmp(vorherigeAuswahl,'Maus') == 1 && handles.zaehlerMaus >0
            handles.zaehlerMaus = handles.zaehlerMaus-1;
        elseif strcmp(vorherigeAuswahl,'Katze') == 1 && handles.zaehlerKatze >0
            handles.zaehlerKatze = handles.zaehlerKatze-1;
        elseif strcmp(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.
if ispc && 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?

Grüße Max

TextinDatenbank.fig
 Beschreibung:
.fig-Datei

Download
 Dateiname:  TextinDatenbank.fig
 Dateigröße:  7.5 KB
 Heruntergeladen:  409 mal
TextinDatenbank.m
 Beschreibung:
.m-File

Download
 Dateiname:  TextinDatenbank.m
 Dateigröße:  11.79 KB
 Heruntergeladen:  402 mal
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: 03.07.2015, 12:50     Titel:
  Antworten mit Zitat      
Hallo,

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.

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

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2015, 13:04     Titel:
  Antworten mit Zitat      
Vielen Dank für deine schnelle Antwort Harald.

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?

Vielen Dank schonmal vorab

Grüße
Max
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: 03.07.2015, 13:56     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald

TextinDatenbank.m
 Beschreibung:

Download
 Dateiname:  TextinDatenbank.m
 Dateigröße:  8.36 KB
 Heruntergeladen:  437 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.07.2015, 10:11     Titel:
  Antworten mit Zitat      
Hallo Harald,

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 (line 206)
set(handles.(passendesEdit),'String',sprintf('%s %g',neueAuswahl, neuerIndex));

Error in TextinDatenbank>popupmenu1_Callback (line 138)
updatePopupmenu(hObject, handles)

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

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

Error in
@(hObject,eventdata)TextinDatenbank('popupmenu1_Callback',hObject,eventdata,guidata(hObject))

 
Error while evaluating UIControl Callback


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?

Grüße
Max

TextinDatenbank.m
 Beschreibung:

Download
 Dateiname:  TextinDatenbank.m
 Dateigröße:  8.21 KB
 Heruntergeladen:  426 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.07.2015, 10:53     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe den Fehler gelöst. Ich musste noch in der Zeile:
Code:
passendesEdit = strrep(get(hObject, 'Tag'), 'popupmenu', 'edit');

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?

Vielen Dank schonmal vorab
Grüße
Max
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: 06.07.2015, 13:04     Titel:
  Antworten mit Zitat      
Hallo,

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:
Code:
test.a = 'bla';
test.b = 'bla bla';
feldname = 'a';
test.(feldname) % wie gewünscht
test.feldname % Fehlermeldung


Zitat:
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.

Grüße,
Harald

TextinDatenbank.m
 Beschreibung:

Download
 Dateiname:  TextinDatenbank.m
 Dateigröße:  8.34 KB
 Heruntergeladen:  474 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2015, 08:45     Titel:
  Antworten mit Zitat      
Hallo,

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:
Code:
cell_var = {'Please choose a component', 'Maus', 'Katze', 'Hund'};
set(hObject, 'String', cell_var);

überhaupt noch, wenn das Popupmenü zu Beginn in der OpeningFcn über folgenden, von Dir geschriebenen Code:
Code:
set(handles.popupmenu1, 'String', [{'Please choose...'}, animals])
set(handles.popupmenu2, 'String', [{'Please choose...'}, animals])

belegt wird?

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:
Code:
function y = Mittelwert(x)
if ~isvector(x)
    error('Input muss ein Vektor sein')
end
y = sum(x)/length(x);
end

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:
if strcmp(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

TextinDatenbank.fig
 Beschreibung:

Download
 Dateiname:  TextinDatenbank.fig
 Dateigröße:  6.58 KB
 Heruntergeladen:  420 mal
TextinDatenbank.m
 Beschreibung:

Download
 Dateiname:  TextinDatenbank.m
 Dateigröße:  6.17 KB
 Heruntergeladen:  418 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2015, 09:37     Titel:
  Antworten mit Zitat      
Und noch eine Frage, die mir gerade beim Durchgehen der einzelnen Code-Zeilen gekommen ist, ist folgende:

Was genau macht die Zeile? :
Code:
handles.Vektor.(vorherigeAuswahl) = setdiff(handles.Vektor.(vorherigeAuswahl), alterIndex);


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:

handles.Vektor.Hund = setdiff(handles.Vektor.Hund, 1)

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?

Grüße
Max
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 07.07.2015, 10:07     Titel:
  Antworten mit Zitat      
Hallo MatlabErlerner,

Zitat:
Benötige ich die Belegung:
Code:
cell_var = {'Please choose a component', 'Maus', 'Katze', 'Hund'};
set(hObject, 'String', cell_var);

überhaupt noch, wenn das Popupmenü zu Beginn in der OpeningFcn über folgenden, von Dir geschriebenen Code:
Code:
set(handles.popupmenu1, 'String', [{'Please choose...'}, animals])
set(handles.popupmenu2, 'String', [{'Please choose...'}, animals])

belegt wird?

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.

Zitat:
Was genau macht die Zeile? :
Code:
handles.Vektor.(vorherigeAuswahl) = setdiff(handles.Vektor.(vorherigeAuswahl), alterIndex);

Die Zahl "alterIndex" wird aus dem Vektor "vorherigeAuswahl" ausgeschlossen.
Du kannst die Zeile auskommentieren und mit dem Debugger untersuchen, was sich ändert.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2015, 15:28     Titel:
  Antworten mit Zitat      
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)

Grüße
Max

TextinDatenbank1.zip
 Beschreibung:

Download
 Dateiname:  TextinDatenbank1.zip
 Dateigröße:  31.73 KB
 Heruntergeladen:  399 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2015, 17:37     Titel:
  Antworten mit Zitat      
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?

Grüße Max
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: 07.07.2015, 17:57     Titel:
  Antworten mit Zitat      
Hallo,

generell: debugge doch bitte mal selbst den Code und versuche herauszufinden, wo die Probleme liegen...

Zur ersten Frage: was denkst du denn, dass das horzcat in deinem Code macht?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  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.