Edit para IPs
2012-04-20 05:00:00
function es_una_ip(cadena : string) : boolean; var i,p,c : byte; aux : array[0..3] of integer; begin if (cadena[1]='.') then begin es_una_ip:=false; break; end; aux[0]:=0; aux[1]:=0; aux[2]:=0; aux[3]:=0; p:=0; c:=0; es_una_ip:=true; for i:=1 to length(cadena) do begin if cadena[i]='.' then begin p:=p+1; if (i=c+1) then begin es_una_ip:=false; break; end else c:=i; end; if p<4 then if (cadena[i]>='0') and (cadena[i]<='9') then aux[p]:=aux[p]*10+(ord(cadena[i])-48); if (i>1) and (cadena[i]='0') and (cadena[i-1]='0') then begin es_una_ip:=false; break; end; if (i>1) and ((cadena[i]>='1') and (cadena[i]<='9')) and (cadena[i-1]='0') then begin es_una_ip:=false; break; end; end; if (cadena[1]='.') or (p>3) or (aux[0]>255) or (aux[1]>255) or (aux[2]>255) or (aux[3]>255) then es_una_ip:=false; end; procedure TForm1.FiltroEdit(Sender: TObject); var i : integer; aux,aux2,cad : string; begin cad:='0123456789.'; // Solo se admiten estos caracteres aux2:=''; with (Sender as TEdit) do begin aux:=text; // Solo aceptamos caracteres de cad for i:=1 to length(aux) do if pos(aux[i],cad)>0 then aux2:=aux2+aux[i]; // Y además, que resulten en una ip válida for i:=length(aux2) downto 1 do if not es_una_ip(aux2) then delete(aux2,i,1); text:=aux2; SelStart:=length(aux2); end; end; end.
Este método, que hay que asociar al onchange de un edit, solo permite introducir ips validas. Al principió iba a hacerlo con un automata, pero pensé que seria poco intuitivo para aprender de él, así que lo hice tratando los caracteres de la cadena, que unido a unas pequeñas microoptimizaciones... me temo que he logrado hacerlo incluso más obtuso que usando los vectores del automata. ¡Que se le va a hacer!
Por lo demás, funciona perfectamente, copiar, pegar, asociar y a funcionar.