AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wertebereich prüfen und fehler abfangen

Ein Thema von DJAYS · begonnen am 10. Aug 2006 · letzter Beitrag vom 10. Aug 2006
Antwort Antwort
DJAYS

Registriert seit: 13. Sep 2005
Ort: Nürnberg
28 Beiträge
 
Delphi 5 Standard
 
#1

Wertebereich prüfen und fehler abfangen

  Alt 10. Aug 2006, 10:09
hallo,
ich schreibe so ein klein testprogram.ich möchte die Zahlwerteingabe kontrollieren,damit die falsche Eingaben und Bereichüberschreitung vermieden wird,z.B für Hex([0..9,a..f,A..F]),Integer,Floating point und Real48(Double).die Eingabe mache ich über Edit feld mit Ereignis OnKeyPress,damit wenn ich Entertaste drücke,ein fehler soll kommen falls falsche Zahlwert oder bereich überschritten wurde.
für Hex habe ich so was geschrieben,weiß auch net viel

Delphi-Quellcode:
function TFrm_ZahlwertEingabe.Hex(s:String):Boolean;
 var c : integer;
 begin
  Result := true;
 for c := 1 to Length(s) do
  if not (s[c] in ['0'..'9', 'A'..'F', 'a'..'f']) then
   Result := false;
end;
ich eigentlich nicht fit in delphi und auch programmieren(also anfänger)
könnte jemand mir helfen
danke

[edit=Sharky]Delphi-Tags gesetzt. Mfg, Sharky[/edit]
I like Programing, but it hates me!wat am I gonna do?
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#2

Re: Wertebereich prüfen und fehler abfangen

  Alt 10. Aug 2006, 11:03
Zitat von DJAYS:
hallo,
ich schreibe so ein klein testprogram.ich möchte die Zahlwerteingabe kontrollieren,damit die falsche Eingaben und Bereichüberschreitung vermieden wird,z.B für Hex([0..9,a..f,A..F]),Integer,Floating point und Real48(Double).
Ich hoffe doch, dass Du vorher irgendwie festlegen willst, welche Art von Eingaben gewünscht und damit geprüft werden sollen. Andernfalls muss das Programm raten... Bei dem folgenden Beispiel habe ich dafür eine RadioGroup angenommen.
Zitat von DJAYS:
die Eingabe mache ich über Edit feld mit Ereignis OnKeyPress,damit wenn ich Entertaste drücke,ein fehler soll kommen
Das richtige Ereignis ist OnExit: das wird aufgerufen, wenn Du das Edit-Feld verlässt (egal, ob durch Enter, Tab oder Alt-D oder Alt-F4). Beispiel:
Delphi-Quellcode:
procedure TForm1.Edit1Exit(Sender: TObject);
var b0: boolean;
begin
  case RadioGroup1.ItemIndex of
  0: // Hex
     b0 := TestHex(Edit1.Text);
  1: // integer
     b0 := TestInt(Edit1.Text);
  // usw.
  else begin
       ShowMessage('Diese Variante ist noch nicht programmiert.');
       b0 := True; // damit die andere Meldung nicht folgt
     end;
  end;
  if (not b0)
  then ShowMessage('falscher Wert');
end;
Deine Hex-Prüfung scheint sauber zu sein, auch wenn noch einiges verbessert werden könnte. (1) Eine integer-Variable würde ich immer mit 'i' anfangen lassen, damit man den Typ einer Variablen sofort am Namen erkennen kann. (2) Wenn Du ein falsches Zeichen erkannt hast, kann die Schleife bereits abgebrochen werden. (3) Es fehlt die Prüfung, ob überhaupt Text enthalten ist. (4) Hex-Zahlen benötigen eine gerade Anzahl von Ziffern. (5) Auch das Leerzeichen nach jeweils 2 Ziffern könnte zugelassen werden.

Punkt 2+3 habe ich in folgendem Beispiel berücksichtigt:
Delphi-Quellcode:
function TFrm_ZahlwertEingabe.TestHex(s:String):Boolean;
var i: integer;
begin
  Result := true;
  i := 0;
  while ( (i < Length(s)) and Result )
  do begin
    Inc(i);
    // begin..end habe ich nur zur Übersichtlichkeit eingefügt
    if not (s[i] in ['0'..'9', 'A'..'F', 'a'..'f'])
    then Result := false;
  end;
end;
Für andere Prüfungen kann man Funktionen von Delphi verwenden, z.B.:
Delphi-Quellcode:
function TFrm_ZahlwertEingabe.TestInt(s:String):Boolean;
var i: integer;
begin
  try
    i := StrToInt(s);
    Result := true;
  except
    Result := false;
  end;
end;
Zu diesem Verfahren gibt es andere Beiträge hier im Forum - bitte suchen!

Übrigens: Code-Fragmente sollen formatiert werden: Füge den Code hier ein, markiere ihn und drücke den o.g. Button 'Delphi-Code'.

Ich hoffe, Du kannst mit diesen Hinweisen etwas anfangen. Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
DJAYS

Registriert seit: 13. Sep 2005
Ort: Nürnberg
28 Beiträge
 
Delphi 5 Standard
 
#3

Re: Wertebereich prüfen und fehler abfangen

  Alt 10. Aug 2006, 12:31
HI JÜRGEN
danke für deine Hinweise.mit dem Radiogroup,muss ich noch Radiobuttons mit Labels reinlegen?oder wie soll das funktionieren?wenn ich z.B auf Hex oder Int prüfen will.das verstehe ich net ganz.
ich will eigentlich,dass wenn ich ein bestimmte Zahl in Edit1 schreibe,sie soll in einem bestimmten bereich liegen,z.B beim Int soll zwischen 1..99999,wenn außer dem Bereich liegt,dann fehler oder focus wieder setzen zur Neueingabe,es darf auch keine zeichen vorkommen.ich habe auch mit

[if key =#13 then self.perform(...) else
if not (key in[#8,#46,#48..#57])]

probiert,aber ich weiß net ,ob es korrekt ist.

danke
I like Programing, but it hates me!wat am I gonna do?
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#4

Re: Wertebereich prüfen und fehler abfangen

  Alt 10. Aug 2006, 14:27
Hallo DJAYS,

bei Edit-Feldern,
die nur Integer-Zahlen in einem bestimmten Wertebereich enthalten sollen,
verwende ich immer folgendes:

Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
var temp: integer;
begin
     temp := StrToIntDef(Edit1.text, 1{Standartwert});
     if temp > 9999 {max} then temp := 9999;
     if temp < 1 {min} then temp := 1;
     Edit1.text := IntToStr(temp);
end;
Ist vielleicht nicht ganz perfekt und sauber,
aber es funzt und schreckt die Benutzer nicht mit Fehlermeldungen ab.

Zu den Radio-Boxen (siehe Screenshot):
- suche die Eigenschaft "Items"
- klicke dort auf "..."
- im folgenden Kasten kannst du die Auswahlmöglichkeiten festlegen
- die Eigenschaft "ItemIndex" zeigt das angewählte an
( -1 = nichts, 0 = erstes, 1 = zweites, ...)
Miniaturansicht angehängter Grafiken
radio_117.jpg  
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
DJAYS

Registriert seit: 13. Sep 2005
Ort: Nürnberg
28 Beiträge
 
Delphi 5 Standard
 
#5

Re: Wertebereich prüfen und fehler abfangen

  Alt 10. Aug 2006, 14:52
Hi Bug,
danke.noch eine Frage,gibt es eine Möglichkeit diese Zahlen von Edit1 als String in Hex umzuwandeln?ich habe in OH gesucht,es gibt kein StrToHex.
danke
I like Programing, but it hates me!wat am I gonna do?
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Wertebereich prüfen und fehler abfangen

  Alt 10. Aug 2006, 14:57
Zitat von DJAYS:
Hi Bug,
danke.noch eine Frage,gibt es eine Möglichkeit diese Zahlen von Edit1 als String in Hex umzuwandeln?ich habe in OH gesucht,es gibt kein StrToHex.
danke
So sollte es gehen:

Edit2.text:='$'+IntToHex(StrToInt(Edit1.Text),4); Wenn Du aber in Edit1.Text schon einen HexWert stehen hast,
kannst Du ihn so in einen Integer verwandeln:

i:=StrToInt('$'+Edit1.Text); Grüße
Klaus

[edit] Verbesserungen eingetragen [/edit]
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Alexander Roth
Alexander Roth

Registriert seit: 17. Mai 2004
Ort: Kenn
574 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Wertebereich prüfen und fehler abfangen

  Alt 10. Aug 2006, 15:40
Hi, vielleicht hilft dir das weiter:
Ich benutze diese Prozeduren, die ich mal geschrieben habe,l jetzt so gut wie in jedem Programm.

Delphi-Quellcode:
{-----------------------------------------------------------------------------
  Description:  Löscht Zeichen die da nicht reinpassen
  Procedure:    korrigiere
  Arguments:    var s:String; const zeichen:Tsetofchar
  Result:      None
  Detailed description:
-----------------------------------------------------------------------------}

procedure korrigiere(var s:String; const zeichen:Tsetofchar=['0'..'9','-',',']);
var c : word;
begin
  c:=1;
  while c<= length(s) do
    begin
    if not(s[c] in zeichen) then
      delete(s,c,1)
    else
      inc(c);
    end;
end;
{-----------------------------------------------------------------------------
  Description:  Direkt edite Korrigieren
  Arguments:    var edit:Tedit; const zeichen:Tsetofchar=['0'..'9','-',',']
-----------------------------------------------------------------------------}

procedure korrigiere(var edit:Tedit; const zeichen:Tsetofchar=['0'..'9','-',',']);
var s:string;
begin
  s:=edit.Text ;
  korrigiere(s,zeichen);
  edit.Text:=s;
end;
{-----------------------------------------------------------------------------
  Description:  Korrigiere real Zahl
  Arguments:    var r:real;  max,min:real
-----------------------------------------------------------------------------}

procedure korrigiere(var r:real; min,max:real);
var temp:integer;
begin
  if max<min then
    begin
    temp:=min;
    min:=max;
    max:=temp;
    end;

  if r<min then r:=min;
  if r>max then r:=max;
end;
{-----------------------------------------------------------------------------
  Description:  Korrigiere Word Zahl
  Arguments:    var r:word;  max,min:word
-----------------------------------------------------------------------------}

procedure korrigiere(var w:word; min,max:word);
var temp:integer;
begin
  if max<min then
    begin
    temp:=min;
    min:=max;
    max:=temp;
    end;

  if w<min then w:=min;
  if w>max then w:=max;
end;
{-----------------------------------------------------------------------------
  Description:  Korrigiere Integer Zahl
  Arguments:    var r:word;  max,min:Integer
-----------------------------------------------------------------------------}

procedure korrigiere(var w:integer; min,max:integer);
var temp:integer;
begin
  if max<min then
    begin
    temp:=min;
    min:=max;
    max:=temp;
    end;

  if w<min then w:=min;
  if w>max then w:=max;
end;
//Edit: Kleine Korrektur des Codes
Alexander Roth
Ich bin umgestiegen auf: Lazarus und Ubuntu! Alles OpenSource!

Besuch doch mal: www.roth.us.ms
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz