Carlos Rocha Posted April 2, 2013 at 10:48 AM Report #501199 Posted April 2, 2013 at 10:48 AM (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 April 2, 2013 at 09:08 PM by thoga31 Correcção da LP no GeSHi
Kline777 Posted April 2, 2013 at 11:24 AM Report #501206 Posted April 2, 2013 at 11:24 AM (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 April 2, 2013 at 09:08 PM by thoga31 GeSHi
nunopicado Posted April 2, 2013 at 11:38 AM Report #501208 Posted April 2, 2013 at 11:38 AM 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.
Carlos Rocha Posted April 2, 2013 at 12:12 PM Author Report #501214 Posted April 2, 2013 at 12:12 PM 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
nunopicado Posted April 2, 2013 at 01:11 PM Report #501225 Posted April 2, 2013 at 01:11 PM 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.
Carlos Rocha Posted April 2, 2013 at 04:44 PM Author Report #501279 Posted April 2, 2013 at 04:44 PM (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 April 2, 2013 at 09:08 PM by thoga31 Correcção da LP no GeSHi
nunopicado Posted April 2, 2013 at 07:51 PM Report #501295 Posted April 2, 2013 at 07:51 PM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now