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-Menü eigene Werte eingeben: Warum NaN bei Ausgabe?

 

teutopixx
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 09.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.04.2011, 14:26     Titel: Im Popup-Menü eigene Werte eingeben: Warum NaN bei Ausgabe?
  Antworten mit Zitat      
Hallo,

nachdem ich mir das Skript von Joanna (http://www.gomatlab.de/popup-menue-.....wertuebergabe-t12704.html) angesehen habe und auch diesen Beitrag gelesen habe http://www.gomatlab.de/pop-up-menue.....2566,highlight,popup.html, dachte ich mir, dass ich mein Popup-Menü aufpeppe, und auch die Möglichkeit einbaue, dass man als User eigene Werte eingeben kann.

Ich frage die Auswahl (zur Verfügung stehen bisher nur Zahlen, und auch der Nutzer soll nur Zahlen eingeben) im Popup-Menü allerdings durch switch-case ab.

Also:
Code:

wert = get(hObject, 'String')
wert_auswahl = wert(get(hObject, 'Value'));

switch get(handles.popup, 'value')
case 1
set(handles.text, 'String', '1024');
case 2
.... Aktion...
case 5
% Dieses wäre dann die Auswahl "Usereingabe"
eingabe_user = inutdlg('Bitte Wert eingeben')
% An einer anderen Stelle wird ein Textfeld geändert und der eingegebene Wert angezeigt
set (handles.text, 'String', eingabe_user)
 


Nun ergibt sich im weiteren Verlauf des GUIs, dass ich neben einigen anderen Werten auch den selbst eingegebenen Wert abspeichern möchte.


Unter dem Callback eines Pushbuttons (der für das Speichern zuständig ist) steht dann folgendes

Code:

eingabe_user = get(handles.popup, 'String')
eingabe_user = eingabe_user(get(handles.popup, 'value'));
Benutzereingabe = str2double (eingabe_user);
 


Alles speichere ich als *.dat-Datei. Wenn ich nun schaue, was er mir als Benutzereingabe gespeichert hat, steht dort "NaN", und nicht die Zahl die ich eingegeben habe.
Vorher (als ich die benutzerdefinierte Eingabe noch nicht hatte), standen dort immer die Zahlen, die im Popup ausgewählt wurden.

Irgendwie scheint es an der Rückgabe von inputdlg zu liegen, allerdings weiss ich nicht, wie ich das in den Griff bekommen soll.

Eine weitere Frage wäre, wie ich die die Eingabe begrenzen kann.
Gibt es die Möglichkeit, zum einen
a) nur Eingaben zuzulassen, die unter einer gewissen Zahl liegen (also z. B. alle Zahlen von 0 - 10000 (10000 könnte dann ja in einer Variablen stehen)
b) nur die Eingabe von Zahlen (also keine Buchstaben) zuzulassen?



[/url]
_________________

----
teutoPIXX
Private Nachricht senden Benutzer-Profile anzeigen


Peter Quint
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 95
Anmeldedatum: 21.02.11
Wohnort: Lübeck
Version: R2010b
     Beitrag Verfasst am: 19.04.2011, 14:52     Titel:
  Antworten mit Zitat      
Hallo teutopixx,
kann es sein, dass Du
Code:

handles.popup
% mit
handles.text

im Callback des Pushbuttons verwechselt hast? Sieht für mich so aus.. Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Peter Quint
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 95
Anmeldedatum: 21.02.11
Wohnort: Lübeck
Version: R2010b
     Beitrag Verfasst am: 19.04.2011, 14:59     Titel:
  Antworten mit Zitat      
zu a) und b)
Ich habe eine Textbox die handles.box heißt. Wenn etwas anderes als zahlen eingeben werden, wird der alte Wert gesetzt. Dafür musst Du natürlich in der OpeningFct. eine entsprechende handles.LastValue (in dem ein logischer Anfangswert steht) anlegen.

In der Callback-Fkt der Textbox steht:
Code:

if isnan(str2double( get(handles.box, 'String')))
     set(handles.box , 'String', handles.LastValue);    
else
    handles.LastValue=get(handles.box, 'String');
end
guidata(hObject, handles);
 


Natürlich kannst Du im "else-Fall" ein zweites if einbauen um die größe der zahl zu testen und ggf. den alten Wert zu laden
Private Nachricht senden Benutzer-Profile anzeigen
 
teutopixx
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 09.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.04.2011, 21:23     Titel:
  Antworten mit Zitat      
Ob ich handles.popup mit handles.text verwechselt habe, weiss ich grad nicht. Muss ich morgen nochmal nachsehen.

Allerdings zu meinem zweiten Problem: Ich habe ja keine Text-Box, sondern einen "inputdlg", der sich beim Anklicken der letzten Auswahlmöglichkeit eines Popup-Menüs auftut... Würde Dein Vorschlag damit auch funktionieren!?
_________________

----
teutoPIXX
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 19.04.2011, 23:28     Titel:
  Antworten mit Zitat      
Hey,
also zwei Sachen solltest du Beachten:
1.
Code:

eingabe_user = inputdlg('Bitte Wert eingeben');
while isnan(str2double(eingabe_user)) || isempty(eingabe_user)
     eingabe_user = inputdlg('Bitte Wert eingeben')
end
set (handles.text, 'String', eingabe_user)
 


2. Wenn du im Popupmenu den 5. Fall also Value = 5 hast, dann darfst du nicht den String vom Popupmenu benutzen, denn da steht bestimmt keine Zahl an 5. Stelle oder? Also kannst du doch gleich den String vom Text benutzen den du ja immer mit der gewählten Zahl setzt wie Peter schon sagt...
Code:

Benutzereingabe = str2double (get(handles.text,'String'));
 


MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
teutopixx
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 09.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.04.2011, 09:42     Titel:
  Antworten mit Zitat      
Peter Quint hat Folgendes geschrieben:
Hallo teutopixx,
kann es sein, dass Du
Code:

handles.popup
% mit
handles.text

im Callback des Pushbuttons verwechselt hast? Sieht für mich so aus.. Wink


Hallo Peter!
In meinem Callback des Pushbuttons (der dann die durch den Nutzer getätigten Angaben speichern soll) steht:

Code:

auswahl_user = get(handles.popup, 'String');
auswahl_user = auswahl_user{get(handles.popup, 'Value')};
Benutzerauswahl = str2double (auswahl_user);
 

und im weiteren dann
Code:

save ([pn fn], 'Benutzerauswahl','-dat')
 


Ich lese doch damit die Benutzerauswahl im Popup-Menü aus, oder irre ich da?
Wenn in dem Popup-Menü z. B. zwischen "2", "4", "8", "16" und "eigenen Wert eingeben" gewählt werden kann, speichert mir Matlab auf diesem Weg die Zahlen auch wirklich als Zahl (und nicht alsString) in eine Variable.
_________________

----
teutoPIXX
Private Nachricht senden Benutzer-Profile anzeigen
 
teutopixx
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 09.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.04.2011, 10:03     Titel:
  Antworten mit Zitat      
Marco H. hat Folgendes geschrieben:
Hey,
also zwei Sachen solltest du Beachten:
1.
Code:

eingabe_user = inputdlg('Bitte Wert eingeben');
while isnan(str2double(eingabe_user)) || isempty(eingabe_user)
     eingabe_user = inputdlg('Bitte Wert eingeben')
end
set (handles.text, 'String', eingabe_user)
 


2. Wenn du im Popupmenu den 5. Fall also Value = 5 hast, dann darfst du nicht den String vom Popupmenu benutzen, denn da steht bestimmt keine Zahl an 5. Stelle oder? Also kannst du doch gleich den String vom Text benutzen den du ja immer mit der gewählten Zahl setzt wie Peter schon sagt...
Code:

Benutzereingabe = str2double (get(handles.text,'String'));
 


MfG Marco


Hallo Marco,

mit deinem Vorschlag funktioniert es schon ganz gut. Sobald ich bei eigene Eingabe eine Zahl eingebe, wird diese auch tatsächlich als Zahl gespeichert.
Ein Problem ergibt sich nun jedoch noch durch folgende Tatsache:

Der Benutzer wählt im Popup-Menü aus den Zahlen 2, 4 6, und 8 aus, oder gibt eine eigene Zahl aus.
Diese Zahlen lasse ich in einem Textfeld nochmal zur Kontrolle (wie bereits erwähnt) anzeigen.
Da es sich jedoch um Einheitsbehaftete Zahlen handelt, wird in dem Textfeld die Einheit noch drangehängt... hatte ich vergessen, zu erwähnen,
Also ergibt sich für das switch-case-Konstrukt des Pushbutton folgender Code:

Code:

wert = get(hObject, 'String')
wert_auswahl = wert(get(hObject, 'Value'));

switch get(handles.popup, 'value')
case 1
set(handles.text, 'String', [wert_auswahl 'Stück']);
case 2
.... Aktion...
 


Somit habe ich dann im Textfeld z. B. 2 Stück stehen.
Damit kann ich leider nicht mehr ganz so einfach das Textfeld mit str2double wandlen und ablegen. Matlab schreibt mir auch dann nälich immer "NaN" in die Variable ein.
_________________

----
teutoPIXX
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 20.04.2011, 10:20     Titel:
  Antworten mit Zitat      
Hey,

das ist ja kein Problem. Nutze einfach strrep z.B.
Code:

Benutzereingabe = str2double(strrep(get(handles.text,'String'),'Stück',''));
 


MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
teutopixx
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 09.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.04.2011, 10:45     Titel:
  Antworten mit Zitat      
Danke, Marco!
Das werde ich probieren.
Nun ist mir noch was aufgefallen...so langsam wirds für mich unübersichtlich oder ich hab's einfach zu kompliziert aufgebaut.
Ich nutze Deinen Code für die benutzerdefinierte Eingabe:

Code:

eingabe_user = inputdlg('Bitte Wert eingeben');
while isnan(str2double(eingabe_user)) || isempty(eingabe_user)
     eingabe_user = inputdlg('Bitte Wert eingeben')
end
set (handles.text, 'String', eingabe_user)

 


Soweit, so gut.
Nur steht damit im Textfeld ja noch nicht die Einheit (hier z. B. Stück) dahinter.
Also dachte ich mir, ich kann es genauso machen, wie vorher im switch-case-Konstrukt auch.

Code:

set (handles.text, 'String', [eingabe_user ' Stueck']
 


Aus welchem Grund auch immer, wenn ich eine Zahl eingegeben habe, setzt er mir dann nicht die Einheit dahinter.
_________________

----
teutoPIXX
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 20.04.2011, 10:58     Titel:
  Antworten mit Zitat      
Hey,

ja denn inputdlg gibt ein cell raus. In deinem Fall ein 1x1 Cell. Also musst du

Code:

eingabe_user = inputdlg('Bitte Wert eingeben');
while isnan(str2double(eingabe_user)) || isempty(eingabe_user)
     eingabe_user = inputdlg('Bitte Wert eingeben')
end
set (handles.text, 'String', [eingabe_user{1} ' Stück')
 


schreiben. Du kannst das auch selber herausfinden indem du dir die Variablen beim Debuggen anschaust...

MfG Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
teutopixx
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 09.03.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.04.2011, 13:00     Titel:
  Antworten mit Zitat      
Super! Nun funktioniert's!
Ich glaub mit den einzelnen Datenstrukturen muss ich mich nochmal näher befassen... Neutral
_________________

----
teutoPIXX
Private Nachricht senden Benutzer-Profile anzeigen
 
Peter Quint
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 95
Anmeldedatum: 21.02.11
Wohnort: Lübeck
Version: R2010b
     Beitrag Verfasst am: 20.04.2011, 21:02     Titel:
  Antworten mit Zitat      
Hi teutoPIXX,
Du eillst in Deinem Textfeld immer "x Stück" stehen haben. Willst aber, das der User eigene Zahl eingeben kann. Nicht nur um es Dir programmiertechnisch einfacher zu machen sonders auch für die Usability würde ich Dir raten zwei Textboxen (eine statische in der die Einheit, in Deinem Fall "Stücke" steht) zu kreieren. Du kann auch ganz einfach bei der Eingabe von '1' die statische Textbox auf "Stück" setzen und umgekehrt.

So weiß der User immer genau was er wie eintragen kann und Du musst Dich nicht mit einen Zahlen-Buchstaben-mix der u.a. auch unterschiedlich sein kann (z.B. schreib einer nur "8" oder "8 Stücke" oder "8Stücke" oder "8 Stck"...)
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



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 - 2025 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.