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
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.07.2015, 16:05     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe versucht das Problem mit den Popupmenüs zu lösen. Allerdings bin ich gescheitert. Es werden mir zwar keine Fehler angezeigt, aber das Programm schafft es leider auch nicht in die if-Bedingungen zu schalten, wie es mir scheint.
Code:

function updatePopupmenu(hObject, handles)

val = get(hObject, 'Value');
% Liste der Einträge im Pop-up-Menü
str = get(hObject, 'String');
% Text zur ausgewählten Nummer des Eintrags

% Remove "Please choose..." if necessary
if strcmp(str{1}, 'Please choose...')
    str(1) = [];
    val = val - 1;
    set(hObject, 'String', str)
    set(hObject, 'Value', val)
end

vorherigeAuswahl = get(hObject, 'UserData');
neueAuswahl = str{val};
passendesEdit = strrep(get(hObject, 'Tag'), 'popupmenu', 'edit');
vorherigeZahl = str2double(get(handles.(passendesEdit),'String'));
if ~isempty(vorherigeAuswahl)
    if strcmp(vorherigeAuswahl, neueAuswahl)
         handles.Vektor.(neueAuswahl) = [handles.Vektor.(neueAuswahl)];
    else      
        StelleinVektor = find(handles.Vektor.(vorherigeAuswahl) == vorherigeZahl);
        handles.Vektor.(vorherigeAuswahl)(StelleinVektor) = 0;
        handles.Vektor.(neueAuswahl) = sort(handles.Vektor.(neueAuswahl));
        for i = 1 : 1 : max(handles.Vektor.(neueAuswahl))
           aktWert = i;
           if aktWert == max(handles.Vektor.(neueAuswahl))
               aktWert = aktWert + 1;
               handles.Vektor.(neueAuswahl) = [handles.Vektor.(neueAuswahl),aktWert];
               break;
           else
               if any(handles.Vektor.(neueAuswahl) == aktWert)
                   continue;
               else
                   handles.Vektor.(neueAuswahl)(1)= [];
                   break;
               end
           end
       end
       
    end
else
  handles.Vektor.(neueAuswahl) = sort(handles.Vektor.(neueAuswahl));
  for i = 1 : 1 : max(handles.Vektor.(neueAuswahl))
           aktWert = i;
           if aktWert == max(handles.Vektor.(neueAuswahl))
               aktWert = aktWert + 1;
               handles.Vektor.(neueAuswahl) = [handles.Vektor.neueAuswahl,aktWert];
               break;
           else
               if any(handles.Vektor.(neueAuswahl) == aktWert)
                   continue;
               else
                   handles.Vektor.(neueAuswahl)(1)= [];
                   break;
               end
           end
  end
       if ~isempty(handles.Vektor.(neueAuswahl))
    letzterEintrag = handles.Vektor.(neueAuswahl)(length(handles.Vektor.(neueAuswahl)));
else
    letzterEintrag = [1];
end

set(handles.(passendesEdit),'String',sprintf('%s%g',neueAuswahl, letzterEintrag));
set(hObject, 'UserData', neueAuswahl);
end



guidata(hObject, handles);
 


Ich weiß mittlerweile wirklich nicht weiter. Ich habe hin und her überlegt, wie ich das ganze am besten umsetzen kann, aber es klappt nicht so wie ich möchte.

Ich würde halt gerne, dass ich beispielsweise die ersten beiden Popup-Menüs mit Minus auswähle. Das dritte Popupmenü belege ich dann mit Plus. Dabei soll in den ersten beiden Edit-Feldern Minus1 und Minus2 stehen, im dritten halt Plus1 Wenn ich dann aber beispielsweise das erste Popupmenü wieder nehme und dort erneut das schon vorhandene Minus auswähle, dann soll nichts passieren. Wähle ich dort dann aber Plus aus, dann würde ich am liebsten, dass im ersten Edit-Feld Plus 1 steht, im zweiten Editfeld muss sich das Minus2 zu Minus1 ändern und im dritten Edit-Feld soll Plus2 statt Plus 1 dann stehen.
Das ist schon ein sehr dynamisches Problem, wo ich zur Zeit einfach keine Lösung finde. Und ich zerbreche mir jetzt wirklich schon mehrere Tage lang den Kopf.
Ich schicke euch anbei nochmal die Dateien als zip. Vllt. könnt ihr mir ja doch nochmal auf die Sprünge helfen. Also Fehlermeldungen erhalte ich zur Zeit keine, aber es funktioniert eben auch nicht so, wie ich es wünsche.

Grüße Max

Funktiosntest.zip
 Beschreibung:

Download
 Dateiname:  Funktiosntest.zip
 Dateigröße:  32.44 KB
 Heruntergeladen:  451 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: 08.07.2015, 19:20     Titel:
  Antworten mit Zitat      
Hallo,

bitte überlege dir genau, was du willst, bevor du dich an die Umsetzung machst und anderen dazu Fragen stellst. Die jetzige Beschreibung weicht deutlich von der anfänglichen ab, und damit auch wie ich das umsetzen würde. Die mit der vorherigen Aufgabenstellung verbrachte Zeit ist also aus meiner Sicht verschwendet.

Beim jetzigen Ansatz besteht ja keine Notwendigkeit mehr, die vorherige Auswahl abzuspeichern. Man kann ja dann in der gemeinsamen Updatefunktion
- die Popupmenüs der Reihe nach durchgehen
- schauen, wie oft bestimmte Auswahlen getroffen wurden (Anfang: 0)
- die nächste Nummer für den Text verwenden und den Zähler für die Gruppe um 1 erhöhen.
Es spielt ja nicht mal mehr eine Rolle, welches Popupmenü das Update eigentlich ausgelöst hat.

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: 08.07.2015, 23:24     Titel:
  Antworten mit Zitat      
Hallo Harald,

es tut mir leid, dass das ganze jetzt ein bisschen verschwommen ist. Allerdings waren deine Mühen keinesfalls umsonst, denn deinen Code konnte ich sehr gut an anderer Stelle (an der ich ihn von vorne herein haben wollte) nutzen.

Das jetzt ist ein neues Problem, was ich allerdings bewusst in diesem Thread habe stehen lassen, da es eben wieder um Popup-Menüs geht, diesmal nur um eine andere Art der Anwendung.

Daher vielen Dank, dass du mir trotzdem weiterhin versuchst zu helfen.
Ich verstehe allerdings nicht ganz, wie ich das ganze implementieren kann. Was konkret meinst du mit der 'gemeinsamen Updatefunktion', wie komme ich an diese dran?
Und ich weiß auch nicht genau, wie du das ganze mit dem Zähler meinst? Wenn ich den Zähler immer nur um einen erhöhe, dann aber wieder ins erste Popup-Menü springe, wie in meinem Beispiel:

Zitat:
Ich würde halt gerne, dass ich beispielsweise die ersten beiden Popup-Menüs mit Minus auswähle. Das dritte Popupmenü belege ich dann mit Plus. Dabei soll in den ersten beiden Edit-Feldern Minus1 und Minus2 stehen, im dritten halt Plus1 Wenn ich dann aber beispielsweise das erste Popupmenü wieder nehme und dort erneut das schon vorhandene Minus auswähle, dann soll nichts passieren. Wähle ich dort dann aber Plus aus, dann würde ich am liebsten, dass im ersten Edit-Feld Plus 1 steht, im zweiten Editfeld muss sich das Minus2 zu Minus1 ändern und im dritten Edit-Feld soll Plus2 statt Plus 1 dann stehen.


beschrieben, dann würde ja im ersten Edit-Feld statt Plus1 wie erwünscht, Plus2 stehen, da der Zähler um einen nach oben gegangen ist oder?

Hast du einen Implementierungsvorschlag? Ich danke dir jetzt schonmal sehr für deine Hilfe!

Beste 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: 09.07.2015, 17:56     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Was konkret meinst du mit der 'gemeinsamen Updatefunktion'

Wie bisher auch die updatePopupmenu, die aus dem Callback jedes Popupmenüs aufgerufen wird.

Zitat:
Wenn ich den Zähler immer nur um einen erhöhe, dann aber wieder ins erste Popup-Menü springe, wie in meinem Beispiel [...] beschrieben, dann würde ja im ersten Edit-Feld statt Plus1 wie erwünscht, Plus2 stehen, da der Zähler um einen nach oben gegangen ist oder?

Nicht, wenn du den Zähler bei jedem Update bei 0 anfangen lässt.

Fang doch mal an, das umzusetzen. Bei Schwierigkeiten kann ich ja nochmal draufschauen.

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: 10.07.2015, 09:40     Titel:
  Antworten mit Zitat      
Vielen Dank Harald,

ich denke ich werde mich heute Abend/morgen früh mal dransetzen und es versuchen wie von dir beschrieben in die Tat umzusetzen. Allerdings verstehe ich nich nicht ganz, wie ich es mit dem Zähler machen soll. Weil angenommen ich setze den wieder auf Null, dann ändert sich ja noch nichts in den anderen Edit-Feldern. Mein Problem ist noch, dass ich nicht verstehe, wie ich es hinkriegen soll, dass, wenn ich im ersten Popupmenü etwas ändere, was Auswirkungen auf die anderen Popupmenüs hat, wie in meinem Beispiel geschildert:
Zitat:
Ich würde halt gerne, dass ich beispielsweise die ersten beiden Popup-Menüs mit Minus auswähle. Das dritte Popupmenü belege ich dann mit Plus. Dabei soll in den ersten beiden Edit-Feldern Minus1 und Minus2 stehen, im dritten halt Plus1 Wenn ich dann aber beispielsweise das erste Popupmenü wieder nehme und dort erneut das schon vorhandene Minus auswähle, dann soll nichts passieren. Wähle ich dort dann aber Plus aus, dann würde ich am liebsten, dass im ersten Edit-Feld Plus 1 steht, im zweiten Editfeld muss sich das Minus2 zu Minus1 ändern und im dritten Edit-Feld soll Plus2 statt Plus 1 dann stehen.

ich diese Auswirkung/Aktualisierung der anderen Popupmenüs hinbekomme. Weil ich mich ja nur in dem aktuell angewählten mit meiner function updatePopupmenu bewege.
Aber wie gesagt, ich werde es mal versuchen und dann bei Problemen dir mal den Code zukommen lassen und dich wieder um Rat fragen.

Grüße und schonmal ein schönes Wochenende
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: 10.07.2015, 12:07     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Weil ich mich ja nur in dem aktuell angewählten mit meiner function updatePopupmenu bewege.

Du kannst in der Funktion über die Handles-Struktur auf alle Popupmenüs zugreifen.

Zitat:
Aber wie gesagt, ich werde es mal versuchen

Das ist eine gute Idee. Beim tatsächlichen Programmieren lösen sich die Probleme häufig, oder sie verschieben sich.

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: 12.07.2015, 14:22     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe mich jetzt mal dran gesetzt und versucht es zu lösen! Ich bin soweit auch zu einer Lösung gekommen, die auch funktioniert, allerdings erhalte ich eine Menge an Warnungen.

Zuerst einmal meine updatePopupmenu-Funktion:
Code:
function updatePopupmenu(hObject, handles)



for i = 1:1:3
    currentpopupmenu = sprintf('popupmenu%g',i);
    currentedit = sprintf('edit%g',i);
    val = get(handles.(currentpopupmenu), 'Value');
    str = get(handles.(currentpopupmenu), 'String');
   
   
    if i == 1
        zaehlerMinus = 0;
        zaehlerPlus = 0;
        zaehlerPfeile = 0;
    end
   
    if strcmp((str{val}), 'Minus')
        zaehlerMinus = zaehlerMinus + 1;
        set(handles.(currentedit), 'String', sprintf('Minus%g', zaehlerMinus));
    end

    if strcmp((str{val}), 'Plus')
        zaehlerPlus = zaehlerPlus + 1;
        set(handles.(currentedit), 'String', sprintf('Plus%g', zaehlerPlus));
    end

    if strcmp((str{val}), 'Pfeile')
        zaehlerPfeile = zaehlerPfeile + 1;
        set(handles.(currentedit), 'String', sprintf('Pfeile%g', zaehlerPfeile));
    end
   
end
   
   

guidata(hObject, handles);


Anbei habe ich auch das Programm gehangen!

Allerdings bekomme ich wie schon erwähnt immer folgende Warnungen, wenn ich das Programm teste:

Code:
>> Funktionentest
Warning: popupmenu control requires that Value be an integer within String
range
Control will not be rendered until all of its parameter values are valid
> In openfigLegacy at 120
  In gui_mainfcn>local_openfig at 286
  In gui_mainfcn at 158
  In Funktionentest at 42
Warning: popupmenu control requires that Value be an integer within String
range
Control will not be rendered until all of its parameter values are valid
> In openfigLegacy at 120
  In gui_mainfcn>local_openfig at 286
  In gui_mainfcn at 158
  In Funktionentest at 42
Warning: popupmenu control requires that Value be an integer within String
range
Control will not be rendered until all of its parameter values are valid
> In movegui at 113
  In openfigLegacy at 94
  In gui_mainfcn>local_openfig at 286
  In gui_mainfcn at 233
  In Funktionentest at 42
Warning: popupmenu control requires that Value be an integer within String
range
Control will not be rendered until all of its parameter values are valid
> In movegui at 113
  In openfigLegacy at 94
  In gui_mainfcn>local_openfig at 286
  In gui_mainfcn at 233
  In Funktionentest at 42
Warning: popupmenu control requires that Value be an integer within String
range
Control will not be rendered until all of its parameter values are valid
> In openfigLegacy at 120
  In gui_mainfcn>local_openfig at 286
  In gui_mainfcn at 233
  In Funktionentest at 42
Warning: popupmenu control requires that Value be an integer within String
range
Control will not be rendered until all of its parameter values are valid
> In openfigLegacy at 120
  In gui_mainfcn>local_openfig at 286
  In gui_mainfcn at 233
  In Funktionentest at 42


Ich verstehe allerdings nicht, was mir die Warnungen sagen. Ich habe schonmal ein wenig im Internet recherchiert, allerdings nicht wirklich was zielführendes gefunden.
Hast du eine Idee, wie ich diese Warnungen eliminieren kann? Wo liegt der Fehler?

Grüße
Max

Funktionentest.zip
 Beschreibung:

Download
 Dateiname:  Funktionentest.zip
 Dateigröße:  31.96 KB
 Heruntergeladen:  438 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: 12.07.2015, 14:32     Titel:
  Antworten mit Zitat      
Hallo,

ich kann die Warnungen nicht reproduzieren.
Zum Code:
Code:
       zaehlerMinus = 0;
        zaehlerPlus = 0;
        zaehlerPfeile = 0;

würde ich vor die for-Schleife ziehen. Das ist übersichtlicher.

Die drei if-Abfragen müssen nicht sein. In einem vorherigen Beispiel habe ich dir ja gezeigt, wie sich das umgehen lässt.

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: 12.07.2015, 14:36     Titel:
  Antworten mit Zitat      
Entschuldige Harald,
jetzt funktioniert es. Der Fehler ist dann aufgetreten, als ich deine Code-Passage zur Löschung des 'Please choose ...' implementiert hatte.
Der Code sah dann so aus:
Code:
function updatePopupmenu(hObject, handles)



for i = 1:1:3
    currentpopupmenu = sprintf('popupmenu%g',i);
    currentedit = sprintf('edit%g',i);
    val = get(handles.(currentpopupmenu), 'Value');
    str = get(handles.(currentpopupmenu), 'String');
   
    if strcmp(str{1}, 'Please choose...')
        str(1) = [];
        val = val - 1;
        set(hObject, 'String', str)
        set(hObject, 'Value', val)
    end
   
    if i == 1
        zaehlerMinus = 0;
        zaehlerPlus = 0;
        zaehlerPfeile = 0;
    end
   
    if strcmp((str{val}), 'Minus')
        zaehlerMinus = zaehlerMinus + 1;
        set(handles.(currentedit), 'String', sprintf('Minus%g', zaehlerMinus));
    end

    if strcmp((str{val}), 'Plus')
        zaehlerPlus = zaehlerPlus + 1;
        set(handles.(currentedit), 'String', sprintf('Plus%g', zaehlerPlus));
    end

    if strcmp((str{val}), 'Pfeile')
        zaehlerPfeile = zaehlerPfeile + 1;
        set(handles.(currentedit), 'String', sprintf('Pfeile%g', zaehlerPfeile));
    end
   
end
   
   

guidata(hObject, handles);
 


Allerdings wäre es sehr interessant, zu wissen, wie ich bei der Auswahl eines Elements es schaffe, dass das 'Please choose...' verschwindet. Dafür habe ich keine Lösung parat. Deine Lösung klingt mir eigentlich sehr plausibel, allerdings führt sie wie erwähnt zu folgendem Fehler und es verschwindet zusätzlich noch ein Popupmenü:
Code:
>> Funktionentest
Subscript indices must either be real positive integers or logicals.

Error in Funktionentest>updatePopupmenu (line 273)
    if strcmp((str{val}), 'Minus')

Error in Funktionentest>popupmenu1_Callback (line 114)
updatePopupmenu(hObject, handles)

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

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

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

 
Error while evaluating uicontrol Callback

Warning: popupmenu control requires that Value be an integer within String
range
Control will not be rendered until all of its parameter values are valid
Warning: popupmenu control requires that Value be an integer within String
range
Control will not be rendered until all of its parameter values are valid
Warning: popupmenu control requires that Value be an integer within String
range
Control will not be rendered until all of its parameter values are valid
>>


Der Fehler ist nahezu identisch zu dem, den ich im vorherigen Post gesendet habe. Allerdings ist der aus dem vorherigen Post erstaunlicherweise in der eig. funktionsfähigen Version entstanden, direkt nachdem ich die Passage zur Löschung des 'Please choose...' herausgenommen habe. Beim ersten Mal danach kam dieser Fehler, dann nicht mehr.
Naja Kuriositäten gibt es ja in jedem Programm Very Happy
Aber hast du denn eine Lösung für den aktuellen Fehler? Bzw. eine weitere Idee, wie ich es schaffe, dass das 'Please choose...' gelöscht wird, sobald in den einzelnen Popupmenüs was ausgewählt wurde?

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: 12.07.2015, 15:15     Titel:
  Antworten mit Zitat      
Hallo,

nutze doch bitte selbst den Debugger, dann siehst du ja, was schiefgeht.
Auch hier die Frage: was soll der Entfernen von 'Please choose...' in der Schleife?

Kaum zieht man es vor die Schleife, funktioniert auch schon alles wunderbar.

Grüße,
Harald

Funktionentest.m
 Beschreibung:

Download
 Dateiname:  Funktionentest.m
 Dateigröße:  11.05 KB
 Heruntergeladen:  463 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: 12.07.2015, 21:33     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort. Sorry manchmal steht man irgendwie auf dem Schlauch. Da hätte ich selbstverständlich selber drauf kommen MÜSSEN. Aber ich war so sehr in die for-Schleife vertieft, dass ich gar nicht mehr die Möglichkeit des Schreibens ausserhalb der Schleife in Erwägung gezogen habe. Vielen Dank für die Blickveränderung. Und noch einen schönen Sonntag Abend!

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

Gehe zu Seite Zurück  1, 2

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.