Ir para o conteúdo

Publicidade

 Estatísticas do Fórum

  • 1 Usuários ativos

    0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

Cursos Online iMasters
Foto:

Formatar CPF/CNPJ

  • Por favor, faça o login para responder
7 respostas neste tópico

#1 Renanbg

Renanbg
  • Membros
  • 474 posts

Postado 19 setembro 2007 - 17:01

Alguém sabe de uma máscara que serve tanto para CPF quanto para CNPJ ?

Tipo: o usuário digita um CPF e a função formata..

se o usuário digitar um CNPJ a função formata..

Mas tem que ser no mesmo campo.

Pode ser no evento de exit..ja vi isso em um programa mas n to conseguindo desenvolver

acho q daria paar contar o numero de caracteres digitados e formatar

Alguem tem uma ideia?
  • 0

#2 EderDias

EderDias
  • Membros
  • 260 posts

Postado 19 setembro 2007 - 20:59

Carinha, ve se serve esta dica pra você...eu uso bastante. :joia:
Acho que é o que você quer.
Eu testei aqui agora e funcionou direitinho.
Haa....alem de formatar tbem valida o cpf e o cnpj...mto bom. :thumbsup:

Testa ai..segue a Unit completinha com o teste que fiz agora.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Buttons, Mask;

type
  TForm1 = class(TForm)
	MaskEdit3: TMaskEdit;
	BitBtn1: TBitBtn;
	procedure BitBtn1Click(Sender: TObject);
	procedure MaskEdit3Enter(Sender: TObject);
  private
	//funcao pra validar cpf e cnpj
	function cpf(num: string): boolean;
	function cgc(num: string): boolean;
	{ Private declarations }
  public
	{ Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

//funcao pra validar cpf
function TForm1.cpf(num: string): boolean;
var
 n1,n2,n3,n4,n5,n6,n7,n8,n9: integer;
 d1,d2: integer;
 digitado, calculado: string;
begin
 n1:=StrToInt(num[1]);
 n2:=StrToInt(num[2]);
 n3:=StrToInt(num[3]);
 n4:=StrToInt(num[4]);
 n5:=StrToInt(num[5]);
 n6:=StrToInt(num[6]);
 n7:=StrToInt(num[7]);
 n8:=StrToInt(num[8]);
 n9:=StrToInt(num[9]);
 d1:=n9*2+n8*3+n7*4+n6*5+n5*6+n4*7+n3*8+n2*9+n1*10;
 d1:=11-(d1 mod 11);
 if d1>=10 then d1:=0;
 d2:=d1*2+n9*3+n8*4+n7*5+n6*6+n5*7+n4*8+n3*9+n2*10+n1*11;
 d2:=11-(d2 mod 11);
 if d2>=10 then d2:=0;
 calculado:=inttostr(d1)+inttostr(d2);
 digitado:=num[10]+num[11];
 if calculado=digitado then
   cpf:=true
  else
   cpf:=false;
end;

//funcao pra validar cpf e cpf
function TForm1.cgc(num: string): boolean;
var
 n1,n2,n3,n4,n5,n6,n7,n8,n9,n10,n11,n12: integer;
 d1,d2: integer;
 digitado, calculado: string;
begin
 n1:=StrToInt(num[1]);
 n2:=StrToInt(num[2]);
 n3:=StrToInt(num[3]);
 n4:=StrToInt(num[4]);  // Retira cada numero do Edit, e joda p/ variavel
 n5:=StrToInt(num[5]);
 n6:=StrToInt(num[6]);
 n7:=StrToInt(num[7]);
 n8:=StrToInt(num[8]);
 n9:=StrToInt(num[9]);
 n10:=StrToInt(num[10]);
 n11:=StrToInt(num[11]);
 n12:=StrToInt(num[12]);
 d1:=n12*2+n11*3+n10*4+n9*5+n8*6+n7*7+n6*8+n5*9+n4*2+n3*3+n2*4+n1*5;
 d1:=11-(d1 mod 11);
 if d1>=10 then d1:=0;
 d2:=d1*2+n12*3+n11*4+n10*5+n9*6+n8*7+n7*8+n6*9+n5*2+n4*3+n3*4+n2*5+n1*6;
 d2:=11-(d2 mod 11);
 if d2>=10 then d2:=0;
 calculado:=inttostr(d1)+inttostr(d2);
 digitado:=num[13]+num[14];
 if calculado=digitado then
   cgc:=true
  else
   cgc:=false;
end;



procedure TForm1.BitBtn1Click(Sender: TObject);
begin
//testa cpf
if length(maskedit3.text)=11 then begin
If not cpf(MaskEdit3.text) then
Begin
ShowMessage('CPF Inválido !!');
Maskedit3.SetFocus;
end
else
Maskedit3.EditMask:='000.000.000-00;0';
end;
//testa cnpj
if length(maskedit3.text)=14 then begin
If not cgc(maskedit3.text) then
Begin
ShowMessage('CNPJ Inválido !!');
maskedit3.SetFocus;
end
else
 Maskedit3.EditMask:='00.000.000/0000-00;0'; //este formata
 end;
	end;

procedure TForm1.MaskEdit3Enter(Sender: TObject);
begin
Maskedit3.EditMask:='';
end;

end.

Espero que ajude..
Abraço..t+
:thumbsup:
  • 0

#3 Renanbg

Renanbg
  • Membros
  • 474 posts

Postado 21 setembro 2007 - 10:14

Cara aqui n aconteceu nada

fiz como você citou mas qndo clico no button n da nenhum mensagem...

Pode me dar uma força?

Abraço...
  • 0

#4 Rodrigo Miss

Rodrigo Miss

    [...]

  • Membros
  • 1.253 posts

Postado 21 setembro 2007 - 10:22

beleza kra ... pra formatar no onExit, eu vo te da uma forcinha ... montei uma funcao aki ...

function TForm1.FormatarCPFCNPJ(const Doc: String): String;
begin
  if (Length(Doc) = 11) then
  begin
	Result:= Copy(Doc,1,3) + '.' + Copy(Doc,4,3) + '.' + Copy(Doc,7,3) + '-' + Copy(Doc,11,2);
  end;

  if (Length(Doc) = 14) then
  begin
	Result:= Copy(Doc,1,2) + '.' + Copy(Doc,3,3) + '.' + Copy(Doc,6,3) + '/' + Copy(Doc,9,4) + '-' + Copy(Doc,13,2);
  end;
end;

no OnExit :
txtCPFCNPJ.Text:= FormatarCPFCNPJ(txtCPFCNPJ.Text);

Qto a validacao, da uma olhada no Laboratorio de scripts q tem lahj ... ok
  • 0

#5 Renanbg

Renanbg
  • Membros
  • 474 posts

Postado 21 setembro 2007 - 10:30

beleza cara..consegui fazer funcionar a funcao do amigo Eder

Muito bom esse forum..sempre consegui o q preciso...

Aproveitando o embalo sem ter q abrir um novo topico to com problemas na impressao de um rebibo...

uso esse codigo p imprimir

procedure Tfrecibo.btnimprimirClick(Sender: TObject);
var
bookmark : tbookmarkstr;
Mensagem:string;
begin
		Mensagem := 'Confirmas a impressão do recibo selecionado?';
		if Application.MessageBox(PCHAR(Mensagem), 'Recibo RM', MB_ICONQUESTION + MB_YESNO)=MRYES then
		begin
		tbconfig.edit;
		tbconfigNum_recibo.Value:= tbconfigNum_recibo.Value + 1;
		tbconfig.post;
		bookmark := tbrecibo.Bookmark;
		tbrecibo.Filter := 'sacado= ''' + editsacado.Text + '''';
		tbrecibo.Filtered := true;
		QuickRep1.print;
		tbrecibo.Filtered := false;
		tbrecibo.Bookmark := bookmark;
		end
		else
		exit;
 
end;

Estou imprimindo em uma Epson LX 300 +

Imprime certo, mas apos imprimir a impressora ejeta mais uns 2 ou 3 boletos

N tem como fazer imprimir o q escolhi e ja parar sem ejetar os outros?

Mechi no tamanho do quickrep mas n adiantou

Abraço...
  • 0

#6 Renanbg

Renanbg
  • Membros
  • 474 posts

Postado 21 setembro 2007 - 13:33

To com um pequeno detalhe p resolver a funcao que o Eder passou

No form tenho varios dbedits e 1 dbgrid

entao conforme você seleciona algo no dbgrid automaticamente os campos dos dbedits sao preenchidos com o registro que foi selecionado

mas como agora tem esse maskedit isso n ocorre

Pergunta:

tem um maskedit que trabalhe direto no banco como um dbedit?

senao como faço p maskedit receber os dados da mesma forma que os dbedits?
  • 0

#7 Rodrigo Miss

Rodrigo Miss

    [...]

  • Membros
  • 1.253 posts

Postado 21 setembro 2007 - 13:38

Ta usando a função q eu t passei ou a que o Eder te passou ?????
Naum existe um DBMaskEdit nativo do delphi ....
você pode fazer assim :

Maskedit.Text:= AdoQueryCPF.Text;
  • 0

#8 Renanbg

Renanbg
  • Membros
  • 474 posts

Postado 21 setembro 2007 - 13:51

opa grato pela rapidez...

cara to usando a do Eder e resolvi assim

ao invez de usar maskedit usei dbedit e na linha


Maskedit3.EditMask:='00.000.000/0000-00;0';

troquei por

dbedit.field.EditMask:='00.000.000/0000-00;0';

funciona bem...

pode ser assim neh?

EDit: só achei uma falha...

formata certinho, mas se eu fechar o aplicativo e reabrir a formatacao some

pq será?
  • 0




Publicidade

/ins>