Se vc ñ percebeu, eu defino a máscara de formatação de forma dinâmica de acordo 
com o tamanho da string do telefone a ser formatado. Outro detalhe é que eu não 
uso funções para 'recortar' strings, como a função Copy() ou a função MidStr() 
da unit StrUtils (para os que usam Delphi 6 ou 7). Usando FormatMastText(), eu 
me isento de ter que ficar reinventando a roda, pois se já existem funções pra 
tratar o texto com máscara, não preciso ficar fazendo ginástica recortando 
strings. E ainda, faço uso eficiente de uma função quase desconhecida de todos 
- StrToInt64Def() - para verificar se uma string realmente representa um 
número. Eficiência e código limpo.

EM TEMPO: abaixo uma atualização do trecho de código do exemplo que implementa 
as funções de formatação de telefones, CPFs e CNPJs.

--[INÍCIO ATUALIZAÇÃO]--
const
  SinalMais           = '+';
  AbreParenteses      = '(';
  FechaParenteses     = ')';
  HifenTraco          = '-';
  SinalPonto          = '.';

{$WRITEABLECONST ON}
  PhoneTokens         : array[0..4] of string =
    (SinalMais, AbreParenteses, FechaParenteses, HifenTraco, SinalPonto);

  MascaraTelefone     : string = '0000\-0000;0;_';
  MascaraTelefoneDDD  : string = '\(00\)0000-0000;0;_';
  MascaraTelefoneIntl : string = '\+00\-00\-0000\-0000;0;_';

  MascaraCPF          : string = '000\.000\.000\-00;0;_';
  MascaraCNPJ         : string = '00\.000\.000\/0000\-00;0;_';
{$WRITEABLECONST OFF}

  TelefoneNulo        = '999999999999';
  CPFNulo             = '99999999999';
  CNPJNulo            = '99999999999999';

{===================== FORMATAÇÃO DE TELEFONES ==============================}

function DesformataTelefone(const s: string): string;
var
  i: byte;
begin
  //  Inicializa resultado
  Result := s;

  //  Retira todos os tokens mais usados em telefones
  for i := Low(PhoneTokens) to High(PhoneTokens) do
    Result := StringReplace(Result, PhoneTokens[i], EmptyStr, [rfReplaceAll]);

  //  Se telefone não tem somente números, retorna telefone nulo
  if StrToInt64Def(Result, -1) = -1 then
    Result := TelefoneNulo;
end;

function FormataTelefone(const s: string): string;
begin
  Result := DesformataTelefone(s);
  if Length(Result)> 10 then
    Result := FormatMaskText(MascaraTelefoneIntl, s)
  else if Length(Result)> 8 then
    Result := FormatMaskText(MascaraTelefoneDDD, s)
  else if Length(Result) = 8 then
    Result := FormatMaskText(MascaraTelefone, s);
end;


{===================== FORMATAÇÃO DE CPFs e CNPJs ===========================}

function DesformataCPF(UmCPF: string): string;
begin
  Result := UmCPF;
  Result := StringReplace(Result, '.', EmptyStr, [rfReplaceAll]);
  Result := StringReplace(Result, '-', EmptyStr, [rfReplaceAll]);
  if StrToInt64Def(Result, -1) = -1 then
    Result := CPFNulo;
end;

function DesformataCNPJ(UmCNPJ: string): string;
begin
  Result := DesformataCPF(UmCNPJ);
  Result := StringReplace(Result, '/', EmptyStr, [rfReplaceAll]);
  if StrToInt64Def(Result, -1) = -1 then
    Result := CNPJNulo;
end;

function FormataCPF(UmCPF: string): string;
begin
  if (Length(UmCPF) = 11) and (not (StrToInt64Def(UmCPF, -1) = -1)) then
    Result := FormatMaskText(MascaraCPF, DesformataCPF(UmCPF))
end;

function FormataCNPJ(UmCNPJ: string): string;
begin
  if (Length(UmCNPJ) = 14) and (not (StrToInt64Def(UmCNPJ, -1) = -1)) then
    Result := FormatMaskText(MascaraCNPJ, DesformataCNPJ(UmCNPJ))
end;
--[FINAL ATUALIZAÇÃO]--

Sds.



________________________________

To: delphi-br@yahoogrupos.com.br
From: [EMAIL PROTECTED]
Date: Mon, 25 Feb 2008 12:15:59 -0300
Subject: RE: RES: [delphi-br] [DICA] Formatação de telefones, CPF e CNPJ







entendi ....mas pelo visto o cara quer so uma coisa simples... tenho mascaras 
de telefone mais inteligentes se for o caso uso essas

Rubem Nascimento da Rocha <[EMAIL PROTECTED]> escreveu:

Não consigo ver generalização em formatação de valores. Sua sugestão é válida, 
mas ainda assim sou mais as minhas dicas!
Sds.

________________________________

To: delphi-br@yahoogrupos.com.br
From: [EMAIL PROTECTED]
Date: Mon, 25 Feb 2008 12:06:44 -0300
Subject: RE: RES: [delphi-br] [DICA] Formatação de telefones, CPF e CNPJ

cara eu criei uma simples e generica...geralmente gosto de coisa generica q 
serve pra qualquer coisa ae criei uma funcao chamada mascara:

function Mascara(Valor,Mascara : String) : String;
var
p : Byte;
resultado : String[40];
begin
if Valor = '' then
begin
exit;
end;
for P := 1 to Length(Valor) do
begin
if Valor[P] in [',','.','/','-'] then
delete(Valor,P,1);
end;
for P := 1 to Length(Mascara) do
begin
if Mascara[p] <> '#' then
begin
Valor := Copy(Valor,1,P-1)+ Mascara[p] + Copy(Valor,P, Length(valor));
end
end;
Result := valor;
end;

no evento OnExit de um edit ou qualquer outro coloque assim
//telefone
edit1.text := mascara(edit1.text ,'(##)####-####');
//cpf
edit1.text := mascara(edit1.text,'###.###.###-##');

Rubem Nascimento da Rocha <[EMAIL PROTECTED]> escreveu:

Estou retificando parte do código da dica:

const
SinalMais = '+';
AbreParenteses = '(';
FechaParenteses = ')';
HifenTraco = '-';
SinalPonto = '.';

{$WRITEABLECONST ON}
MascaraTelefone : string = '0000\-0000;0;_';
MascaraTelefoneDDD : string = '\(00\)0000-0000;0;_';
MascaraTelefoneIntl : string = '\+00\-00\-0000\-0000;0;_';

MascaraCPF : string = '000\.000\.000\-00;0;_';
MascaraCNPJ : string = '00\.000\.000\/0000\-00;0;_';
{$WRITEABLECONST OFF}

TelefoneNulo = '999999999999';
CPFNulo = '99999999999';
CNPJNulo = '99999999999999';

{===================== FORMATAÇÃO DE TELEFONES ==============================}

function DesformataTelefone(const s: string): string;
begin
// Inicializa resultado
Result := s;

// Retira todos os tokens mais usados em telefones
Result := StringReplace(Result, SinalMais, EmptyStr, [rfReplaceAll]);
Result := StringReplace(Result, SinalPonto, EmptyStr, [rfReplaceAll]);
Result := StringReplace(Result, AbreParenteses, EmptyStr, [rfReplaceAll]);
Result := StringReplace(Result, FechaParenteses, EmptyStr, [rfReplaceAll]);
Result := StringReplace(Result, HifenTraco, EmptyStr, [rfReplaceAll]);

// Se telefone não tem somente números, retorna telefone nulo
if StrToIntDef(Result, -1) = -1 then
Result := TelefoneNulo;
end;

function FormataTelefone(const s: string): string;
begin
Result := DesformataTelefone(s);
if Length(Result)> 10 then
Result := FormatMaskText(MascaraTelefoneIntl, s)
else if Length(Result)> 8 then
Result := FormatMaskText(MascaraTelefoneDDD, s)
else if Length(Result) = 8 then
Result := FormatMaskText(MascaraTelefone, s);
end;

________________________________

To: delphi-br@yahoogrupos.com.br
From: [EMAIL PROTECTED]
Date: Sat, 23 Feb 2008 21:48:44 -0300
Subject: RES: [delphi-br] [DICA] Formatação de telefones, CPF e CNPJ

Prezado Rubem,

Vamos combinar: Cri-Cri somos eu e você, o Cara aí é chato demais e bota
chato nisso. Sem querer ofender Sr. João Morais....hehehehe.

Um grande abraço e parabéns por ter postado AQUI essa dica que vai ser de
grande utilidade para muitos de nós.

João Carlos

De: delphi-br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em
nome de Joao Morais
Enviada em: sábado, 23 de fevereiro de 2008 18:24
Para: delphi-br@yahoogrupos.com.br
Assunto: Re: [delphi-br] [DICA] Formatação de telefones, CPF e CNPJ

Rubem Nascimento da Rocha wrote:
>
> Confesso que na pressa na digitação do código, eu cometi uma tremenda
gafe,
> mas o que importa é que o código é eficiente e funciona! E tb espero que
vc
> tenha chegado a essa conclusão.

Exatamente.

> Se não chegou, é sinal de que tenho um desafeto!

Capaz. Não crio esse tipo de coisa, não me leva a lugar algum.

Agora, se aceitas um comentário, acho que as dicas ficariam bem em um
site. Enquanto aqui elas têm grande visibilidade, porém momentânea, ao
serem publicadas elas seriam indexadas e seriam encontradas para sempre.
Opinião pessoal.

> 2) Encontrei alguém mais cri-cri do que eu!

Concordo em parte.

--
Joao Morais

> ________________________________
>
> To: delphi-br@yahoogrupos.com.br
> From: [EMAIL PROTECTED]
> Date: Sat, 23 Feb 2008 15:59:39 -0300
> Subject: Re: [delphi-br] [DICA] Formatação de telefones, CPF e CNPJ
>
> Rubem Nascimento da Rocha wrote:
>> AbreAspas = '(';
>> FechaAspas = ')';
>
> Abre o quê?
>
> --
> Joao Morais
>

[As partes desta mensagem que não continham texto foram removidas]

__________________________________________________________
Veja mapas e encontre as melhores rotas para fugir do trânsito com o Live 
Search Maps!
http://www.livemaps.com.br/index.aspx?tr=true

---------------------------------
Abra sua conta no Yahoo! Mail, o único sem limite de espaço para armazenamento!

[As partes desta mensagem que não continham texto foram removidas]

__________________________________________________________
Confira vídeos com notícias do NY Times, gols direto do Lance, videocassetadas 
e muito mais no MSN Video!
http://video.msn.com/?mkt=pt-br

---------------------------------
Abra sua conta no Yahoo! Mail, o único sem limite de espaço para armazenamento!

[As partes desta mensagem que não continham texto foram removidas]









_________________________________________________________________
Veja mapas e encontre as melhores rotas para fugir do trânsito com o Live 
Search Maps!
http://www.livemaps.com.br/index.aspx?tr=true

Responder a