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