Saiyine
Punto Com

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.

Rollos antiguos

2012-09-20 04:00:00 - Cambiar la prioridad del proceso.

0000-00-00 00:00:00 - Sumar ficheros (copiar uno al final de otro existente).

0000-00-00 00:00:00 - Salir del programa con una ventana de 'SI,NO,CANCELAR'.

0000-00-00 00:00:00 - Salida de numeros decimales limitada, al estilo de los dos puntos (:) en los writeln del turbo pascal.

0000-00-00 00:00:00 - Saber cuantas veces aparece una cadena dentro de un texto.

Saiyine

Selfie of meHi! Welcome to Saiyine Punto Com where I talk about anything that goes through my mind!

Puedo prometer y prometo que a la mayor brevedad aquí irá un menú o algo asín.