Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Hilfe! Fehler wo eigentlich keiner sein sollte! (https://www.delphipraxis.net/9609-hilfe-fehler-wo-eigentlich-keiner-sein-sollte.html)

akira1983 30. Sep 2003 09:09


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:
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;
wenn ich das ding dann nun in einer testapp teste und nur eine einzige zahl eingebe, meldet mir delphi


Code:
"" ist kein gültiger Integerwert
weiss irgendjemand weiter?

ich habe das komponentenverzeichnis als .zip angehangen

[edit=sakura]BBCode zulassen. Mfg, sakura[/edit]

Gollum 30. Sep 2003 09:39

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:
if (byte2s<>'') then byte2i:=strtoint(byte2s);
oder Du packst die Umwandlung in einen try..except-Block:
Delphi-Quellcode:
  try
    byte2i:=strtoint(byte2s);
  except
    byte2i:=0;
  end;

Gollum 30. Sep 2003 10:01

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

akira1983 30. Sep 2003 10:11

Re: Hilfe! Fehler wo eigentlich keiner sein sollte!
 
THX very viel!

Honie 1. Okt 2003 07:39

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;

Christian Seehase 1. Okt 2003 11:05

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 17:45 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