Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wertebereich prüfen und fehler abfangen (https://www.delphipraxis.net/74891-wertebereich-pruefen-und-fehler-abfangen.html)

DJAYS 10. Aug 2006 10:09


Wertebereich prüfen und fehler abfangen
 
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]

Jürgen Thomas 10. Aug 2006 11:03

Re: Wertebereich prüfen und fehler abfangen
 
Zitat:

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:

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

DJAYS 10. Aug 2006 12:31

Re: Wertebereich prüfen und fehler abfangen
 
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

BUG 10. Aug 2006 14:27

Re: Wertebereich prüfen und fehler abfangen
 
Liste der Anhänge anzeigen (Anzahl: 1)
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, ...)

DJAYS 10. Aug 2006 14:52

Re: Wertebereich prüfen und fehler abfangen
 
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

Klaus01 10. Aug 2006 14:57

Re: Wertebereich prüfen und fehler abfangen
 
Zitat:

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:

Delphi-Quellcode:
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:

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

[edit] Verbesserungen eingetragen [/edit]

Alexander Roth 10. Aug 2006 15:40

Re: Wertebereich prüfen und fehler abfangen
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 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