Edit para IPs

Por Saiyine Enviar correo el 2012-04-20 05:00:00 - Secciones:  DELPHI  - Enlace permanente: 502

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.

Otras entradas de la web que podrian interesarte:

SocializerMenefante Del.icio.us Digg 


Tu nombre (Nick):

Tu correo (Email):
  Necesario para tu gravatar!

Tu página (URL):

Escribe aqui tu comentario:

       :noworry: :roll: :huh: :push: :OO 8) 8O :( :) :? :D :P :o :x :| ;) ^^ xD



Vista previa activada.

Vista previa (6/6/6, 6:66)


Fondos de pantalla

. . .

Recomendamos

  • Betsson bahis adresi betsson iddaa bahis
  • Canli bahis betsson bahis sitesinde.

. . .

Descargas

  • ApagaPC
    apagapc241.exe  (3489)
  • LimpiaDocus
    LimpiaDocus001.exe  (2767)
  • RCM
    rcm001.zip  (2346)
  • Popmail
    popmail-0.4-psmn.tar.gz  (2410)
  • Manual de Delphi en PDF
    delphi_pdf.zip  (3009)
  • Evangelio del Perl
    Evangelio_del_perl.pdf  (2822)
  • Excel Simpsons
    Excel Simpsons  (3008)
  • . . .

    Proyectos Online

  • Saiyine Store
  • Kunowalls!!!
  • Fondos de pantalla
  • Picaday: imagenes sexys o chocantes.
  • Scarlett: fotos de Scarlett Johansson
  • WhatsmyIP: obtener tu IP pública
  • Uma Thurman: galeria de Uma Thurman
  • FunPics: imagenes graciosas
  • . . .

    Blogs

  • Por lo que más querais, no entreis a estos: Tapanez, Yhandros, Onez.

  • Otros en español: El Mundo Today, La libreta de Van Gaal, Chavalina, Kirai, Mundo Geek, Microsiervos.

  • Mis lecturas en guiri: Michael Yon, Coding Horror, YCombinator news, MySQL Performance, Slashdot.

    . . .
  • Utilidades

  •  Coral  (1196), cacheando webs
  •  Spam.la  (1431), correo de usar y tirar
  •  Mailinator  (1356), correo de usar y tirar
  •  Bug me not  (1219), absurdos registros di NO
  •  Trashmail  (1251), correo de usar y tirar

    . . .

  • Saipuntos

    Jomer: 2
    Yhandros: 1
    Cheimy: 1

    . . .

    Página web ©2001-2010 Saiyine generada en s, con 4639723 visitas en total, hoy (de un total de 0 previstas).

    . . .