Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

carcleo

Tamanho da variável após receber conteúdo de DBText

Recommended Posts

carcleo

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

Share this post


Link to post
Share on other sites
Kline777

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

Share this post


Link to post
Share on other sites
nunopicado

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.

Share this post


Link to post
Share on other sites
carcleo

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

Share this post


Link to post
Share on other sites
nunopicado

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.

Share this post


Link to post
Share on other sites
carcleo

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

Share this post


Link to post
Share on other sites
nunopicado

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.

Share this post


Link to post
Share on other sites

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

×

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.