En esta sección de Código Fuente en Delphi vamos a explicar cómo podemos comprobar si el texto contenido en un string es una dirección IP de internet válida.
Para ello, he escrito esta pequeña app de ejemplo.
Este código está formado por tres funciones: IsValidIP, IsValidByte y Sacar
La función IsValidIP utiliza a las otras dos funciones para poder realizar su tarea.
Ya sabemos que el formato de cualquier dirección IPv4 de internet es una cadena con la forma "a.b.c.d" donde las letras a b c y d son números enteros comprendidos entre 0 y 255 cada uno de ellos
Para comprobar que un string corresponde a este formato, la función IsValidIp lo que hace es "Sacar" las partes del string separadas por el punto "." y comprobar que cada una de esas 4 partes es un número comprendido en el rango 0..255
La función "Sacar" recibe como parámetro un string que será modificado por la propia función (parámetro tipo var) y el string que hace de separador (en nuestro caso el punto)
La función IsValidByte comprueba si la cadena recibida corresponde a un entero entre 0 y 255
La función IsValidIP realiza la tarea de "Sacar" el número y comprobar si es válido para cada una de los cuatro supuestos valores que deberían existir en la cadena recibida si fuese una IP correcta. Solamente devuelve el valor "True" en caso de haber podido realizar la comprobación correcta para esos 4 valores de deben formar la IP.
En la siguiente imagen puedes ver un ejemplo de uso de esta app en el que realizamos el comando "dir" sobre la misma carpeta en la que está el ejecutable.
A continuación, puedes ver el código completo de la app, y si lo deseas puedes descargarlo todo (código y app) en un archivo "zip".
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Edit1: TEdit; Button1: TButton; Label2: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function Sacar(var v:String; sep:String):String; var p: integer; begin p:= pos(sep,v); if (p>0) then begin result:= copy(v,1,p-1); v:= copy(v,p+length(sep),maxint); end else begin result:= v; v:=''; end; end; function IsValidByte(const Value: string): Boolean; var x, n: integer; begin x := StrToIntDef(Value, -1); Result := (x >= 0) and (x < 256); if not Result then exit; for n := 1 to length(Value) do if not (AnsiChar(Value[n]) in ['0'..'9']) then Result:=false; end; function IsValidIP(const Value: string): Boolean; var TempIP: string; begin TempIP := Value; Result := False; if not IsValidByte(Sacar(TempIP, '.')) then Exit; if not IsValidByte(Sacar(TempIP, '.')) then Exit; if not IsValidByte(Sacar(TempIP, '.')) then Exit; if IsValidByte(TempIP) then Result := True; end; procedure TForm1.Button1Click(Sender: TObject); begin if IsValidIP(Edit1.Text) then Label2.Caption:= 'IP Válida' else Label2.Caption:= 'IP NO Válida'; end; end.