Einzelnen Beitrag anzeigen

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