![]() |
Hilfe! Fehler wo eigentlich keiner sein sollte!
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe folgendes Code in meiner Komponente, die eine IP auf Gültigkeit überprüft:
Delphi-Quellcode:
wenn ich das ding dann nun in einer testapp teste und nur eine einzige zahl eingebe, meldet mir delphi
procedure TIPCheck.PruefeIP(Sender:TObject);
var temp1:integer; temp2:integer; // Variablendefinition temp3:integer; temp4:integer; // Variablendefinition byte1s:string; byte2s:string; // Variablendefinition byte3s:string; byte4s:string; // Variablendefinition byte1i:integer; byte2i:integer; // Variablendefinition byte3i:integer; byte4i:integer; // Variablendefinition ok:boolean; // Variablendefinition begin ok:=false; // Initialisierung der Variable temp1:=-1; // Initialisierung der Variable temp2:=-1; // Initialisierung der Variable temp3:=-1; // Initialisierung der Variable temp4:=-1; // Initialisierung der Variable if copy(text,1,1)='.' then temp1:=1; // Feststellung wo Byte endet if copy(text,2,1)='.' then temp1:=2; // Feststellung wo Byte endet if copy(text,3,1)='.' then temp1:=3; // Feststellung wo Byte endet if copy(text,temp1+3,1)='.' then temp2:=1; // Feststellung wo Byte endet if copy(text,temp1+4,1)='.' then temp2:=2; // Feststellung wo Byte endet if copy(text,temp1+5,1)='.' then temp2:=3; // Feststellung wo Byte endet if copy(text,temp1+temp2+3,1)='.' then temp3:=1; // Feststellung wo Byte endet if copy(text,temp1+temp2+4,1)='.' then temp3:=2; // Feststellung wo Byte endet if copy(text,temp1+temp2+5,1)='.' then temp3:=3; // Feststellung wo Byte endet if copy(text,temp1+temp2+temp3+3,1)='.' then temp4:=1; // Feststellung wo Byte endet if copy(text,temp1+temp2+temp3+4,1)='.' then temp4:=2; // Feststellung wo Byte endet if copy(text,temp1+temp2+temp3+5,1)='.' then temp4:=3; // Feststellung wo Byte endet byte1s:=copy(text,0,temp1); // Umwandlung der gesamten IP-Adresse in Byte // Speicherung als String byte2s:=copy(text,temp1+1,temp2); // Umwandlung der gesamten IP-Adresse in Byte // Speicherung als String byte3s:=copy(text,temp2+1,temp3); // Umwandlung der gesamten IP-Adresse in Byte // Speicherung als String byte4s:=copy(text,temp3+1,temp4); // Umwandlung der gesamten IP-Adresse in Byte // Speicherung als String byte1i:=strtoint(byte1s); // Umwandlung des String in Integer byte2i:=strtoint(byte2s); // Umwandlung des String in Integer byte3i:=strtoint(byte3s); // Umwandlung des String in Integer byte4i:=strtoint(byte4s); // Umwandlung des String in Integer if (byte1i<256) then ok:=true; // Prüfung, ob Byte gültig ist (Zahl kleiner als 256) if (byte2i<256) then ok:=true; // Prüfung, ob Byte gültig ist (Zahl kleiner als 256) if (byte3i<256) then ok:=true; // Prüfung, ob Byte gültig ist (Zahl kleiner als 256) if (byte4i<256) then ok:=true; // Prüfung, ob Byte gültig ist (Zahl kleiner als 256) if not ok then // Wenn Prüfungen nicht bestanden raise TUngueltigeAdresse.Create('IP-Adresse nicht korrekt!'); // Fehlermeldung end;
Code:
weiss irgendjemand weiter?
"" ist kein gültiger Integerwert
ich habe das komponentenverzeichnis als .zip angehangen [edit=sakura]BBCode zulassen. Mfg, sakura[/edit] |
Re: Hilfe! Fehler wo eigentlich keiner sein sollte!
Hallo,
das liegt daran, dass bei strtoint() ein Leerzeichen übergeben wird. Da ein leerer String nicht in eine Zahl umgewandelt werden kann, erhälst Du die Fehlermeldung. Um dies zu verhindern, musst Du die entsprechenden Variablen darauf überprüfen, ob Sie überhaupt etwas enthalten:
Delphi-Quellcode:
oder Du packst die Umwandlung in einen try..except-Block:
if (byte2s<>'') then byte2i:=strtoint(byte2s);
Delphi-Quellcode:
try
byte2i:=strtoint(byte2s); except byte2i:=0; end; |
Re: Hilfe! Fehler wo eigentlich keiner sein sollte!
Hallo,
Deine Routine kann man auch noch etwas optimieren:
Delphi-Quellcode:
// Annahme, dass Adresse in der Form "127.0.0.1" oder "127..." übergeben wird
type TIpArr=array[0..3] of Integer; procedure TIPCheck.PruefeIP(Sender:TObject); var i, j:Integer; n :TIpArr; s :String; begin s:=''; j:=0; FillChar(n, SizeOf(TIpArr), -1); for i:=1 to Length(text) do begin if (text[i]<>'.') then begin if (text[i] in ['0'..'9']) then s:=s+text[i]; end else begin if (s<>'') then n[j]:=StrToInt(s); Inc(j); s:=''; end; // else if end; // for i // für den Teil nach dem letzten Punkt if (s<>'') then n[j]:=StrToInt(s) else n[j]:=-1; // überprüfen ob alle 4 Bereiche der IP-Adresse gültig sind: for i:=0 to 3 if (n[i]=-1) then begin raise TUngueltigeAdresse.Create('IP-Adresse nicht korrekt!'); break; end; // for i end; // TIPCheck.PruefeIP |
Re: Hilfe! Fehler wo eigentlich keiner sein sollte!
THX very viel!
|
Re: Hilfe! Fehler wo eigentlich keiner sein sollte!
Hi,
um links oder rechtsbündige Leerzeichen zu eliminieren kannst Du auch die trim-funktion benutzen. Für Umwandlungen von Strings in Zahlen schlage ich folgenden Code vor. var s: string; i: integer; begin s := ' 4711 '; try i := StrToInt(trim(s)) except i := 0; (oder was auch immer) end; // i := 4711; end; |
Re: Hilfe! Fehler wo eigentlich keiner sein sollte!
Moin Honie,
statt try/except kann man in diesem Falle auch StrToIntDef verwenden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz