Olá galera, nesta Quick Tips, irei criar uma DLL, apedido do amigo Benedido, que me mandou uma sugestão para validar CPF e CNPJ, então vamos criar a DLL.

 

Para maiores informações sobre DLL veja as outras Quick Tips que desenvolvi.

//www.devmedia.com.br/articles/viewcomp.asp?comp=15450

//www.devmedia.com.br/articles/viewcomp.asp?comp=15451

//www.devmedia.com.br/articles/viewcomp.asp?comp=15452

 

Para criarmos a DLL.

 

Menu File / New / Other / DLL Wizard.

 

Agora iremos implementar nossa DLL. Salve a mesma com o nome prj_DLL_CNPJ_CPF, este será o nome da nossa DLL.

 

library prj_DLL_CNPJ_CPF;

 

{ Important note about DLL memory management: ShareMem must be the

  first unit in your library's USES clause AND your project's (select

  Project-View Source) USES clause if your DLL exports any procedures or

  functions that pass strings as parameters or function results. This

  applies to all strings passed to and from your DLL--even those that

  are nested in records and classes. ShareMem is the interface unit to

  the BORLNDMM.DLL shared memory manager, which must be deployed along

  with your DLL. To avoid using BORLNDMM.DLL, pass string information

  using PChar or ShortString parameters. }

 

uses

  SysUtils, Dialogs,

  Classes;

 

{$R *.res}

 

{Valida dígito verificador de CNPJ}

function TestaCGC(Dado : string) : boolean;stdCall;

var  D1        : array[1..12] of byte;

     I,        DF1,

     DF2,      DF3,

     DF4,      DF5,

     DF6,      Resto1,

     Resto2,   PrimeiroDigito,

     SegundoDigito : integer;

begin

     Result := true;

     if Length(Dado) = 14 then

     begin

          for I := 1 to 12 do

               if Dado[I] in ['0'..'9'] then

                    D1[I] := StrToInt(Dado[I])

               else

                    Result := false;

          if Result then

          begin

               DF1 := 0;

               DF2 := 0;

               DF3 := 0;

               DF4 := 0;

               DF5 := 0;

               DF6 := 0;

               Resto1 := 0;

               Resto2 := 0;

               PrimeiroDigito := 0;

               SegundoDigito := 0;

               DF1 := 5*D1[1] + 4*D1[2] + 3*D1[3] + 2*D1[4] + 9*D1[5] + 8*D1[6] +

                      7*D1[7] + 6*D1[8] + 5*D1[9] + 4*D1[10] + 3*D1[11] + 2*D1[12];

               DF2 := DF1 div 11;

               DF3 := DF2 * 11;

               Resto1 := DF1 - DF3;

               if (Resto1 = 0) or (Resto1 = 1) then

                    PrimeiroDigito := 0

               else

                    PrimeiroDigito := 11 - Resto1;

               DF4 := 6*D1[1] + 5*D1[2] + 4*D1[3] + 3*D1[4] + 2*D1[5] + 9*D1[6] +

                      8*D1[7] + 7*D1[8] + 6*D1[9] + 5*D1[10] + 4*D1[11] + 3*D1[12] +

                      2*PrimeiroDigito;

               DF5 := DF4 div 11;

               DF6 := DF5 * 11;

               Resto2 := DF4 - DF6;

               if (Resto2 = 0) or (Resto2 = 1) then

                    SegundoDigito := 0

               else

                    SegundoDigito := 11 - Resto2;

               if (PrimeiroDigito <> StrToInt(Dado[13])) or

                  (SegundoDigito <> StrToInt(Dado[14])) then

                    Result := false;

          end;

     end

     else

          if Length(Dado) <> 0 then

               Result := false;

end;

 

{Valida dígito verificador de CPF}

function TestaCPF(Dado : string) : boolean;stdCall;

var  D1       : array[1..9] of byte;

     I,       DF1,

     DF2,     DF3,

     DF4,     DF5,

     DF6,     Resto1,

     Resto2,  PrimeiroDigito,

     SegundoDigito : integer;

begin

     Result := true;

     if Length(Dado) = 11 then

     begin

          for I := 1 to 9 do

               if Dado[I] in ['0'..'9'] then

                    D1[I] := StrToInt(Dado[I])

               else

                    Result := false;

          if Result then

          begin

               DF1 := 0;

               DF2 := 0;

               DF3 := 0;

               DF4 := 0;

               DF5 := 0;

               DF6 := 0;

               Resto1 := 0;

               Resto2 := 0;

               PrimeiroDigito := 0;

               SegundoDigito := 0;

               DF1 := 10*D1[1] + 9*D1[2] + 8*D1[3] + 7*D1[4] + 6*D1[5] + 5*D1[6] +

                      4*D1[7] + 3*D1[8] + 2*D1[9];

               DF2 := DF1 div 11;

               DF3 := DF2 * 11;

               Resto1 := DF1 - DF3;

               if (Resto1 = 0) or (Resto1 = 1) then

                    PrimeiroDigito := 0

               else

                    PrimeiroDigito := 11 - Resto1;

               DF4 := 11*D1[1] + 10*D1[2] + 9*D1[3] + 8*D1[4] + 7*D1[5] + 6*D1[6] +

                      5*D1[7] + 4*D1[8] + 3*D1[9] + 2*PrimeiroDigito;

               DF5 := DF4 div 11;

               DF6 := DF5 * 11;

               Resto2 := DF4 - DF6;

               if (Resto2 = 0) or (Resto2 = 1) then

                    SegundoDigito := 0

               else

                    SegundoDigito := 11 - Resto2;

               if (PrimeiroDigito <> StrToInt(Dado[10])) or

                  (SegundoDigito <> StrToInt(Dado[11])) then

                    Result := false;

          end;

     end

     else

          if Length(Dado) <> 0 then

               Result := false;

end;

 

{Validar a CPF e CNPJ, esta é a função que iremos executar em nossa aplicação}

function TestaCpfCgc(Dado: string): String; stdCall;

var

  i: integer;

begin

  for i:= 1 to length(Dado) do begin

    if not (Dado[i] in ['0'..'9']) then delete(Dado,i,1);

  end;

  if ((length(Dado) <> 11) and (length(Dado) <> 14))then

     MessageDlg('ATENÇÃO: O número informado NÃO representa' + #13 +

                'um CPF ou CGC válido pelas regras da Receita Federal',mtWarning,[mbOK],0);

  if length(Dado) = 14 then begin

     if TestaCGC(Dado) then begin

        insert('-',Dado,13);

        insert('/',Dado,9);

        insert('.',Dado,6);

        insert('.',Dado,3);

     end

     else MessageDlg('O número informado NÃO representa um CGC' + #13 +

                     'válido pelas regras da Receita Federal', mtWarning, [mbOK], 0);

  end;

  if length(Dado) = 11 then begin

     if TestaCPF(Dado) then begin

        insert('-',Dado,10);

        insert('.',Dado,7);

        insert('.',Dado,4);

     end

     else MessageDlg('O número informado NÃO representa um CPF' + #13 +

                     'válido pelas regras da Receita Federal', mtWarning, [mbOK], 0);

  end;

  Result := Dado;

end;

 

exports

  {

Exportamos somenet a Function TestaCPFCGC, pois esta é quem irá validar, as demais não precisam ser exportadas pois não serão usadas.

}

  TestaCpfCgc;

 

begin

end.

 

//Fim da implementação da DLL

 

Fico por aqui ate à próxima Quick Tips, onde veremos como consumir esta DLL.

 

Um abraço

 

Wesley Y

wesley@lithic.com.br