Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Verhindern des Überschreitens des Maximalwertes von integer (https://www.delphipraxis.net/56910-verhindern-des-ueberschreitens-des-maximalwertes-von-integer.html)

derArmin 13. Nov 2005 11:28


Verhindern des Überschreitens des Maximalwertes von integer
 
Hallo seid gegrüßt. Ich habe vorhin schon eine Lösung auf ein anderes Problem gefunden, jedoch nicht auf dieses:

Ich habe ein Editfeld, dessen Inhalt mit StrToInt an eine variable vom Typ integer übergeben werden soll.
Der Maximalwert eines integers ist 2.147.483.647.
Wenn ich werte über diesem Maximalwert eingebe, dann kommt natürlich ein Fehler.

Nu die Frage: wie kann ich zum Beispiel mit einer if-Abfrage die Überschreitung des Maximalwertes verhindern?
Ich möchte keine anderen Variablentypen benutzen. Irgendwie is das ne Zwickmühle, weil ich ja nicht if > benutzen kann. bei if not <= will es aber auch nicht klappen...

Hilfe *g*

Nikolas 13. Nov 2005 11:30

Re: Verhindern des Überschreitens des Maximalwertes von inte
 
Dafür gibts Try...except:

Delphi-Quellcode:
try
 Variable:= strtoint(Edit.text)
except
 Showmessage(Zu große Zahl)
end;
Wunder dich nicht, wenn trotzdem eine Fehlermeldung kommt, wenn du das Programm aus der IDE startest.
Delphi liefert trotz dem Try noch eine Meldung, wobei du das irgendwo (?) noch abstellen kannst.
Wenn du die compilierte Exe ausserhalb von Delphia aufrufst, solltest du keine Meldung mehr bekommen.

fkerber 13. Nov 2005 11:31

Re: Verhindern des Überschreitens des Maximalwertes von inte
 
Hi!

Herzlich Willkommen in der DP!

Such mal nach Hier im Forum suchenTryStrtoInt, evtl. hilft dir das weiter.


Ciao Frederic

himitsu 13. Nov 2005 12:10

Re: Verhindern des Überschreitens des Maximalwertes von inte
 
Tja, für vieles gibt es eben mehrere Wege, wobei´ich persönlich hierfür nicht gleich auf 'nen Try-Except-Block zurückgreifen würde.


Wenn deinen einzugebenden Werte nicht all zu sehr ins negative gehen, dann ginge auch folgendes:
Delphi-Quellcode:
Var i: Integer;

Begin
  i := StrToIntDef(Edit1.Text, Low(Integer));
  If i = Low(Integer) Then {Fehler...}
End;
Oder du wenn es dir egal ist, wenn der größtmögliche Intergerwert (2.147.483.647) nicht mehr vorhanden ist, dann verwende statt dem Low(Integer) das High(Integer) oder MaxInt ^^


möglicher Wertebereich bei verwendung von
MinInt: -2.147.483.647 .. 2.147.483.647
MaxInt: -2.147.483.648 .. 2.147.483.646


Da StrToIntDef aber intern auch nur das TryStrToInt verwendet, dann ist würde direkt damit der Wertebereich natürlich nicht um 1 verringert.
Delphi-Quellcode:
If not TryStrToInt(Edit1.Text, i) Then {Fehler...}

derArmin 13. Nov 2005 12:31

Re: Verhindern des Überschreitens des Maximalwertes von inte
 
Hoho danke für die schnellen Antworten. Ich haben in dem Programm bereits eine Try-Abfrage drinn, allerdings für das ganze Programm, falls ich halt ne Lücke übersehn habe.

Gut ich hab das mal so gemacht:
Delphi-Quellcode:
begin
Try

    zz := 0;
    if not TryStrToInt(edit1.text, z)
    then
    begin
      showmessage('Die Zahl ist zu groß');
     
    end
    else
    z := StrToInt(Edit1.Text);

...
Nun geschieht aber etwas merkwürdiges(ich habe testhalber 5 Milliarden eingetippt): Er sagt zwar, dass die Zahl zu groß ist, macht aber weiter! und zwar mit einer Null weniger. Warum??? :gruebel: Das kann doch nicht wahr sein!

Khabarakh 13. Nov 2005 12:38

Re: Verhindern des Überschreitens des Maximalwertes von inte
 
Zitat:

Zitat von derArmin
Hoho danke für die schnellen Antworten. Ich haben in dem Programm bereits eine Try-Abfrage drinn, allerdings für das ganze Programm, falls ich halt ne Lücke übersehn habe.

Sünde! *g*
Falsche Verwendung von try...except

Zum Problem: Bist du dir sicher, dass der gesamte restliche Code im else-Block steckt? Du kannst auch nach dem ShowMessage per Exit dieProzedur verlassen.

derArmin 13. Nov 2005 12:57

Re: Verhindern des Überschreitens des Maximalwertes von inte
 
ah ja das exit behebt die Sache ^^ nu hört er auf wenn er soll.
Und ja, der gesamte folgende Quelltext stand im else-Zweig.

Und wegen der Sünde : nicht haun *g*

Ich hab das nur eingefügt, damit ich einem Absturz vorbeuge, ich geh momentan noch alles mögliche an "Falscheingaben" durch um das Programm Idiotensicher zu machen.

Danach werde ich beichten und diese Sünde ablegen :angel:

Danke für die Hilfe.

himitsu 13. Nov 2005 13:08

Re: Verhindern des Überschreitens des Maximalwertes von inte
 
Na ja, wäre es dann nicht besser gleich den "großen" Try-Except-Block wegzulassen, denn wenn dann wirklich ein Fehler auftritt, dann weißt du gleich genau wo der aufgetreten ist, da ja der Debuger dort abbricht ;)

derArmin 13. Nov 2005 15:59

Re: Verhindern des Überschreitens des Maximalwertes von inte
 
ja jetzt wo du es sagst.

Hast Recht okee ich schmeiß es raus :)

:coder:

SirThornberry 13. Nov 2005 16:50

Re: Verhindern des Überschreitens des Maximalwertes von inte
 
du weißt ja den maximalen wert und wieviel zeichen dies sind. Wenn im Edit mehr als 10 Zeischen sind kannst du schonmal davon ausgehen das der Wert zu groß ist (außer er beginnt mit "-"). Wenn im Edit 10 Zeischen sind musst du prüfen dass, das erste zeischen nicht größer als 2 ist. Wenn es genau 2 ist musst du dann prüfen ob es nicht größer als 1 ist etc.

derArmin 14. Nov 2005 17:42

Re: Verhindern des Überschreitens des Maximalwertes von inte
 
ui das is auch gut. Allerdings muss ich erstmal kucken wie man sowas macht...

SirThornberry 14. Nov 2005 18:03

Re: Verhindern des Überschreitens des Maximalwertes von inte
 
So gehts (da fehlt noch der Test ob es ein "-" ist und ob nur Zahlen verwendet werden, es wird also derzeit vorrausgesetzt das die Zahl größer 0 ist und nur zahlen verwendet werden)
Delphi-Quellcode:
  function LIsItBigger(ACheckVal, AMaxVal: String): Boolean;
  var LCheckVal, LMaxVal: Byte;
  begin
    if Length(ACheckVal) > Length(AMaxVal) then
      result := True
    else if Length(ACheckVal) < Length(AMaxVal) then
      result := False
    else begin
      LCheckVal := StrToInt(ACheckVal[1]);
      LMaxVal := StrToInt(AMaxVal[1]);
      result := (LCheckVal > LMaxVal) or
                (Length(ACheckVal) > 1) and (LCheckVal = LMaxVal) and
                 LIsItBigger(copy(ACheckVal, 2, Length(ACheckVal)), copy(AMaxVal, 2, Length(AMaxVal)));
    end;

  end;
var LMaxWert: String;
begin
  LMaxWert := '2147483647';
  Caption := BoolToStr(LIsItBigger(Edit1.Text, LMaxWert), True);


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