Validación del CIF

Uniendo todos los mensajes aparecidos hasta el momento sobre el tema de la validación del CIF, he hecho un algoritmo entre todos ellos, que creo que funciona para todos los casos. Algunas de las funciones utilizadas están en Trucomanía.

{Cambiar un carácter por otro en una cadena.}
function CadCambioCar(Cadena, CarOrig, CarCambio : String) : String;
 var
i    : Integer;
   Temp : String;
 begin
Temp := '';
   for i := 1 to Length(Cadena) do
if Copy(Cadena, i, 1) = CarOrig then
Temp := Temp + CarCambio
     else
Temp := Temp + Copy(Cadena, i, 1);
    Result := Temp;
 end;


{ Validar si un CIF introducido es correcto}
function EsCif(Cif : String) : Boolean;
 var
Suma, Control : Integer;
    n             : Byte;
 begin
Result := False;

   {Se pasa todo a mayúsculas limpio de espacios y de caracteres especiales}
Cif := UpperCase(Trim(Cif));

   {Se limpia de los caracteres '-' y '/'. }
Cif := CadCambioCar(Cif,'-','');
   Cif := CadCambioCar(Cif,'/','');

   {El cif debe ser de 9 cifras}
if Length(Cif) = 9 then
begin
{Comprobamos que sea un NIF}
if EsNumero(Cif[1]) then
Result := EsNif(Cif)
     else
{Se comprueba que la letra que designa el tipo de cif sea correcta}
if (Pos(Cif[1], 'ABCDEFGHPQSKLMX') = 0) then
Result := False
       else
{Se comprueba si es un extranjero,
          en ese caso se calcula el nif, cambiando la X, por 0}
if Cif[1] = 'X' then
Result := EsNif('0'+Copy(Cif,2,8))
         else
begin
Suma:= StrToInt(Cif[3])+StrToInt(Cif[5])+StrToInt(Cif[7]);
           for n := 1 to 4 do
Suma := Suma + ((2*StrToInt(Cif[2*n])) mod 10)+((2*StrToInt(Cif[2*n])) div 10);
           Control := 10 - (Suma mod 10);
           {Se comprueba si es de tipo 'P' o 'S', es decir,
            Corporaciones Locales (Ayuntamientos, etc.)
            y Organismos públicos.}
if Pos(Cif[1],'PS')<>0 then
{Control tipo letra}
Result := (Cif[9] = Chr(64+Control))
           else
{Resto de tipos de CIF}
begin
{Control tipo número}
if Control = 10 then
Control := 0;
             Result:= ( StrToInt(Cif[9]) = Control);
           end;
end;
end;
end;