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

Eingabewerte im Edit Text prüfen

 

Georg

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.03.2010, 08:14     Titel: Eingabewerte im Edit Text prüfen
  Antworten mit Zitat      
Hallo wie kann ich eingegebene Werte im Edit Text bei einer GUI prüfen.
Es dürfen nur bestimmte Werte eingegeben werden, ansonsten will ich eine Fehlermeldung ausgeben, dass die Werte ungültige Eingaben sind.
Die gültigen Eingabewerte sind 0, 1, x^0 bis x^10.

Hat jemand da vielleicht eine Lösung?

Gruß Georg


Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.03.2010, 10:34     Titel:
  Antworten mit Zitat      
Ich nutze die Gelegenheit und schließe mich an:

Gleichesproblem nur sollen andere Dinge erlaubt sein:

Ganze und Kommazahlen
Vektordefinition [ ]
Matrizendefinition [ ; ; ]

Geht das? Und wie?
Private Nachricht senden Benutzer-Profile anzeigen
 
rolewinski
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 10.02.10
Wohnort: Ingolstadt
Version: R2009b
     Beitrag Verfasst am: 25.03.2010, 11:08     Titel:
  Antworten mit Zitat      
so ein Problem hatte ich auch. Ich habe es über eine extra function gelöst.
heißt:
Code:

% in den uicontrolls des edit-feldes:
'tag','111',
'callback','eingabe1 = prueffunc(111,eingabe1,eingabe1min,eingabe1max)'
% es wird die Tag-nummer des Editfeldes, das Value selber und Min- und Max-Werte übergeben
 


die prueffunc sieht dann so aus:
Code:

function [Xm] = prueffunc(TagNr,Xn,SV,Xmin,Xmax)
if SV == 1
    Xm = get(findobj(gcbo),'String');    %eingegebener Wert wird aus der GUI geholt
    Xm = str2double(Xm);
    % Überprüfung auf Min- und Max-Werte
    if Xm<=Xmin Xm = Xmin; elseif Xm>=Xmax Xm = Xmax;   end
    % hier können weitere beliebige Überprüfungen von Xm stehen
    % mit dem set-Befehl wird der korrigierte Wert zurück in das Edit-Feld geschrieben
    set(findobj(gcf,'Tag',num2str(TagNr)),'String',num2str(Xm));

elseif SV == 2
% weitere Überprüfungen
end
 


über die SV Werte lassen sich verschiedene Überprüfungen (z.B. Zahleneingabe, In- oder Dekrementierung (plus / minus), oder anderes) in einer Funktion bewerkstelligen.

Ergebnis: in dem Edit-Feld steht ein korrigierter Wert (falls er falsch eingegeben wurde) und die Variable eingabe1 enthält den eingegebenen bzw. korrigierten Wert.

Fragen? Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.03.2010, 11:20     Titel:
  Antworten mit Zitat      
Hallo,
Über Reguläre Ausdrücke:
@Georg
Code:

eingabe ='x^10'
res = regexp(eingabe,'^(0|1|x\^[0-9]|x\^10)$')
if isempty(res)
   fprintf('falsche Eingabe\n')
   return
else
  fprintf('Eingabe OK\n')
end
 



@Zeon
für Ganze und Komma Zahlen habe ich hier schon mal gepostet:

http://www.gomatlab.de/edit-eingabe-begrenzen-t10510.html
das muss du halt erweitern, für Matrizen.

aber an deiner Stelle, wurde eine Funktion programmieren,
die Überprüfung über endliche Automaten löst. Dazu muss man nur die Regeln aufstellen
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.03.2010, 11:37     Titel:
  Antworten mit Zitat      
Du meinst wenn z.B. [ eingegeben geht man in den Status "Klammer auf" und es ist solange falsch bis ] kommt? Also Zeichenweiseprüfung?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.03.2010, 11:41     Titel:
  Antworten mit Zitat      
@Zenon

ja das meine ich
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.03.2010, 12:14     Titel:
  Antworten mit Zitat      
Aber wie kann ich das ganze aufrufen, abgesehen von nem Button oder der Callback?

Ich fände es gut, wenn während der Eingabe schon auf Richtigkeit geprüft würde eben ob das aktuelle Zeichen korrekt sein kann oder nicht...

Geht das mit Matlab?

Kann man die Callback evtl bei jedem Tastendruck aufrufen?
Wie funktioniert die KeyPressFcn und kann man sie in Verbindung mit CurrentObject nutzen um die Funktion zu implementieren?
Private Nachricht senden Benutzer-Profile anzeigen
 
rolewinski
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 10.02.10
Wohnort: Ingolstadt
Version: R2009b
     Beitrag Verfasst am: 25.03.2010, 19:09     Titel:
  Antworten mit Zitat      
@ Zenon
dann schau dir nochmal meine Lösung an. Ist zwar am Anfang etwas aufwendiger, aber im nachhinein und bei mehreren Edit-Felder übersichtlicher und einfacher handhabbar. Finde ich Wink ...aber ich hab auch ziemlich viele Eingabefelder (>40)

jedesmal, wenn du in einem Edit-Feld Enter drückst oder nach Eingabe mit der Maus woanders hin klickst, wird der Callback aufgerufen.

Grüße
Roland
Private Nachricht senden Benutzer-Profile anzeigen
 
Georg

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2010, 13:15     Titel:
  Antworten mit Zitat      
Hi denny,

habe leider mehrere edittext felder, daher würde ich gern das Ganze mit einer for Schleife realisieren, sodass ich nicht immer eingabe0 bis eingabe12 extra schreiben muss.
hab es so versucht,

Code:
%
for i=0:6
res = regexp((['eingabe'num2str(i)]),'^(0|1|x\^[0-9]|x\^10$')                            
end
if isempty(res)
   errordlg('Es sind nur die Werte von 0,1, a^0...a^6 erlaubt!','Ungültige Eingabe\n');
   return
else
  fprintf('Eingabe OK\n')
end
 


doch bei richtiger Eingabe der Werte gibt mir Matlab trotzdem ne fehlermeldung aus. Achso und noch ne Frage, warum haste bei dir x^10 nochmal extra, anstatt die x^10 auch im Vektor zu lassen?
Macht das einen Unterschied?
 
Georg

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2010, 13:17     Titel:
  Antworten mit Zitat      
Hi denny,

habe leider mehrere edittext felder, daher würde ich gern das Ganze mit einer for Schleife realisieren, sodass ich nicht immer eingabe0 bis eingabe12 extra schreiben muss.
hab es so versucht,

Code:
%
for i=0:6
res = regexp((['eingabe'num2str(i)]),'^(0|1|x\^[0-9]|x\^10$')                            
end
if isempty(res)
   errordlg('Es sind nur die Werte von 0,1, x^0...x^6 erlaubt!','Ungültige Eingabe\n');
   return
else
  fprintf('Eingabe OK\n')
end
 


doch bei richtiger Eingabe der Werte gibt mir Matlab trotzdem ne fehlermeldung aus. Achso und noch ne Frage, warum haste bei dir x^10 nochmal extra, anstatt die x^10 auch im Vektor zu lassen?
Macht das einen Unterschied?[/quote]
 
Georg

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2010, 13:30     Titel:
  Antworten mit Zitat      
hat sich erledigt, mit eval gehts nun endlich Wink

Code:

for i=0:6
res = regexp(eval(['eingabe'num2str(i)]),'^(0|1|x\^[0-9]|x\^10$')                            
end
if isempty(res)
   errordlg('Es sind nur die Werte von 0,1, x^0...x^6 erlaubt!','Ungültige Eingabe\n');
   return
else
  fprintf('Eingabe OK\n')
end
 
 
Georg

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2010, 13:37     Titel:
  Antworten mit Zitat      
Oh nein zu früh gefreut

Sad

geht doch nicht!!!
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 26.03.2010, 14:31     Titel:
  Antworten mit Zitat      
Hallo Georg

Schreibe dir lieber doch dazu eine Extra-Fkt
Code:

function eingabe_ok = test_eingabe(eingabe)
res = regexp(eingabe,'^(0|1|x\^[0-9]|x\^10)$')
if isempty(res)
 eingabe_ok = false;
else
 eingabe_ok = true;
end
 
 


Aufruf wäre dann
Code:

% Eingabe Variablen anlegen
for k=0:12
   eval(sprintf('eingabe%d=''x^%d'';',k,k))
end

% testen
res = false(1,13);
for k=0:12
  res(k+1) = eval(sprintf('test_eingabe(eingabe%d);',k))
end
error_pos = find(~res);
if ~isempty(error_pos)
  fprintf('Eingaben:\t' );
  fprintf('%d\t',error_pos);
  fprintf('sind nicht in Ordnung\n' );
end
 





Zitat:

Achso und noch ne Frage, warum haste bei dir x^10 nochmal extra, anstatt die x^10 auch im Vektor zu lassen?
Macht das einen Unterschied?


Extra deswegen, weil x^[0-9] Vektor gibt nur eine Position,

da du nur eine 2-Stellige Zahl erwartest x^10, war es einfacher extra einzugeben.
sonst muss du eingeben wie viele stellige Zahlen du erwartest
x^[0-9]{1,2} z.B für 1 und 2 Stellige
Private Nachricht senden Benutzer-Profile anzeigen
 
Georg

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2010, 15:02     Titel:
  Antworten mit Zitat      
Hi Denny, danke für die schnelle Antwort.

Irgendwie funzt bei mir die Funktion nicht so ganz.

Die untere Konstruktion funktioniert mittlerweile, aber bei 3-stelligen Edittext Feldern wirds groß.
Code:

res0 = regexp(eingabe0 ,'^(0|1|x\^[0-6])$')                              
res1 = regexp(eingabe1 ,'^(0|1|x\^[0-6])$')
res2 = regexp(eingabe2 ,'^(0|1|x\^[0-6])$')
res3 = regexp(eingabe3 ,'^(0|1|x\^[0-6])$')
res4 = regexp(eingabe4 ,'^(0|1|x\^[0-6])$')
res5 = regexp(eingabe5 ,'^(0|1|x\^[0-6])$')
res6 = regexp(eingabe6 ,'^(0|1|x\^[0-6])$')
for k=0:6
if isempty(eval(['res' num2str(k)]))
   errordlg('Es sind nur die Werte von 0,1, x^0...x^6 erlaubt!','Ungültige Eingabe\n');
   return
else
  fprintf('Eingabe OK\n')
end  
end
 


kannst du mir die res0 bis res 6 konstruktion irgendwie vereinfachen?

hab es so probiert, ohne Erfolg:

Code:

for k=0:6
eval(['res' num2str(k) '= regexp (eval([eingabe' num2str(k) '],''^(0|1|x\^[0-6])$''))'])
end
 


und noch etwas;
wie müßte es bei x^100 bis x^200 aussehen, wenn diese Werte auch noch erlaubt sind?

res = regexp(eingabe0 ,'^(0|1|x\^[0-6]|[100-200]{1,2,3})$')

so?
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 26.03.2010, 15:57     Titel:
  Antworten mit Zitat      
Hallo

so sollte es funktionieren:
Code:

for k=0:6
 eval(['res' num2str(k) '= regexp(eingabe' num2str(k) ',''^(0|1|x\^[0-6])$'');'])
end
 


eval ist schon ziemlich unübersichtlich
wozu machst du dir unnötig kompliziert, und benutzt nicht die arrays stattdessen?
z.B:
Code:

for k=1:12
   eingabe{k}=['x^',num2str(k)]
end

res= true(1,12);
for k=1:12
   tmp = regexp(eingabe{k} ,'^(0|1|x\^[0-6])$')  
   if isempty(tmp)
      res(k)==false
   end
end

 


Besser, wie gesagt eine Funktion zu schreiben, welche dir logische Ergebnisse liefert, schaue oben






Zitat:

und noch etwas;
wie müßte es bei x^100 bis x^200 aussehen, wenn diese Werte auch noch erlaubt sind?

res = regexp(eingabe0 ,'^(0|1|x\^[0-6]|[100-200]{1,2,3})$')


so:
Code:


res = regexp(eingabe0 ,'^(0|1|x\^([0-6]|[12]00))$')
 
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.