Jump to content

Recommended Posts

Posted (edited)

Pessoal. Estou com o seguinte problema aqui:

Tenho o DBText(DBEcpf) com maxlength de 14

Entrei no componente Zeos ZTable e dei 2 clikes nele e, no campo cpf, coloquei mascara.

A mascara tem 3 pontos + os 11 do cpf, dá os 14 do DBText.

Estou entregando o conteudo desse DBText à uma variável do tipo string (alter_cpf).

Daí, eu retiro os caracters referentes à máscara(.,(,),-....) da string alter_cpf e pego só o que foi digitado pelo usuario.

na hora de validar se o tamanho da variavel com a retirada da mascara acontecem os seguintes erros:

Se eu pegar o tamanho da variável com lenght, só retorna 11.

Se eu pegar o tamanho da variável com SizeOf, só retorna 4.

Qualquer que seja o tamanho da string

Eu fiz assim

//DBEcpf.Text retorna por exemplo '123.45_.___,__' (os __ são da máscara)
// tiro a mascara e entrego apenas o valor para a variável alter_cpf
alter_cpf:= StringReplace(DBEcpf.Text,'.','',[rfReplaceAll, rfIgnoreCase]);
alter_cpf:= StringReplace(alter_cpf,'-','',[rfReplaceAll, rfIgnoreCase]);
ShowMessage(alter_cpf); // após todos os StringReplace retorna '12345'
ShowMessage(IntToStr(length(alter_cpf))); //retorna 11
ShowMessage(IntToStr(SizeOf(alter_cpf))); //retorna 4

Como corrigir isso?

Como saber o tamanho exato da string. Que, no caso desse exemplo não é nem 4 nem 11 e sim 5?

De onde estão saindo esses 4 e 11?

Grato a quem puder ajudar!

Carlos Rocha

Edited by thoga31
Correcção da LP no GeSHi
Posted (edited)

Não estou a perceber aí uma coisa. Parece que estás a fazer replace de traços '-' em vez de underscores '_'.

Não queres fazer

alter_cpf:= StringReplace(alter_cpf,'_','',[rfReplaceAll, rfIgnoreCase]);

?

O sizeOf deve dar o tamanho na string em bytes ou na memoria... digo eu :S

Edited by thoga31
GeSHi
Posted

Exacto. O SizeOf não serve para o caso em questão.

O Length sim, mas é preciso usar o '_' em vez do '-' no StringReplace, e é preciso acrescentar outro por causa da ',' (o ultimo separador é uma virgula, e não um ponto).

Fiz o seguinte teste, e tudo OK:


 alter_cpf:= StringReplace(DBEcpf.Text,'.','',[rfReplaceAll, rfIgnoreCase]);
 alter_cpf:= StringReplace(alter_cpf,'_','',[rfReplaceAll, rfIgnoreCase]);
 alter_cpf:= StringReplace(alter_cpf,',','',[rfReplaceAll, rfIgnoreCase]);  // Acrescentei, pela virgula
 ShowMessage('['+alter_cpf+']'); // após todos os StringReplace retorna '12345'
 ShowMessage(IntToStr(length(alter_cpf))); //retorna 5 - Caracteres
 ShowMessage(IntToStr(Sizeof(alter_cpf))); //retorna 4 - Bytes ocupados

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Eis a mascara que estou a usar:

999.999.999-99;0;_

Percebes que é '. e -' e não '. e _'?

Mas, como havia dito, a variável esta recebendo o valor corretamente. Ou seja, no exemplo, 12345.

O problema esta em como descobrir o tamanho da varivel

Posted

Qual o compilador e versão que estás a usar?

Entretanto, experimenta alterar esta linha:

ShowMessage(alter_cpf); // após todos os StringReplace retorna '12345'

por esta:

ShowMessage('['+alter_cpf+']'); // após todos os StringReplace retorna '12345'

e vê se os [] ficam encostados ao valor, ou se ficam separados.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

Fiz assim:

 alter_cpf:=DBEcpf.Text;
 alter_telefone:=DBEtelefone.Text;

 alter_cpf:= StringReplace(alter_cpf,'.','',[rfReplaceAll, rfIgnoreCase]);
 alter_cpf:= StringReplace(alter_cpf,'-','',[rfReplaceAll, rfIgnoreCase]);
 alter_cpf:= StringReplace(alter_cpf,' ','',[rfReplaceAll, rfIgnoreCase]);

 alter_telefone:= StringReplace(alter_telefone,'(','',[rfReplaceAll, rfIgnoreCase]);
 alter_telefone:= StringReplace(alter_telefone,'.','',[rfReplaceAll, rfIgnoreCase]);
 alter_telefone:= StringReplace(alter_telefone,')','',[rfReplaceAll, rfIgnoreCase]);
 alter_telefone:= StringReplace(alter_telefone,' ','',[rfReplaceAll, rfIgnoreCase]);

 ShowMessage('['+alter_cpf+']');
 ShowMessage('['+alter_telefone+']');

 ShowMessage(IntToStr(length(alter_cpf)));
 ShowMessage(IntToStr(length(alter_telefone)));

Com máscara:

999.999.999-99;0;_

Esta assim no DBEdit:

782.850.___-__

Na primeira vez que clico no post do DBNavigator, por causa da opção 0 da mascara , a mascará não vai.

Mas, se eu forçar a barra e clicar de novo, ai a mascara esta indo junto.

Estou usando ;Delphi 7

Me disseram que se eu usasse a mascara assim: 999.999.999-99;0;_, a mascara não ia pro banco mas esta indo sim.

Detalhe: Na tabela, o campo cpf é char 11.pois, embora sejam só números, não terão contas com eles e, sempre serão 11 por se tratar de documento

Edited by thoga31
Correcção da LP no GeSHi
Posted

A máscara não deveria ir para a BD. Essa parte é estranha.

Ainda assim, tendo em conta que a máscara mostra o carater _, podes sempre tirá-lo.

Qual foi o resultado mostrado depois de meter os []?

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.