Ir para o conteúdo
carcleo

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

Mensagens Recomendadas

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

Editado por thoga31
Correcção da LP no GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por thoga31
GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por thoga31
Correcção da LP no GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.