Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Arjona

Utilizando a função POS - Localizar espaços em branco numa string

Recommended Posts

Estou desenvolvendo um programa de banco de dados para fins de aprendizado e estou com dúvida na utilização da função POS. Meu objetivo é verificar se existe espaços em branco no campo “CPF” do formulário, antes de confirmar a entrada de dados. Minha primeira tentativa foi utilizar o seguinte código:

 

procedure TFormClientes.TableClientesBeforePost(DataSet: TDataSet); 
var
corrige_branco: string;
Begin
corrige_branco := TableClientesCGC_CPF.Text;
If  Pos(' ',corrige_branco) <> 0 then
Begin
MessageDlg ('O campo '+ LabelCGC_CPF.Caption + ' está incompleto!', mtWarning,
[mbOK],0);
DBEditCGC_CPF.SetFocus;
abort;
end;
end;
Eu fui testar o código acima deixando, propositalmente, espaços em branco e o retorno dava ‘0’. Testei novamente este código substituindo as aspas ‘ ’ por um número qualquer no meio da string e o retorno deu diferente de zero, ou seja, funcionou.

Tentei usar outros artifícios como a procedure VAL e esta funcionou em partes, porque localizou os espaços em branco como eu queria só que quando o espaço em branco estava acima do décimo caractere este também não funcionou. Fui verificar o pq e contatei que a variável CODE não assume valores maiores que 10.

Alguém tem alguma idéia de pq não deu certo o código acima? Alguma sugestão por favor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

 

Uma forma de contornar isso pode ser você validar o seu Edit ou DBEdit para aceitar somente esta máscara (000.000.000-00) números, ponto e vírgula:

 

if not (Key in['0'..'9',Chr(8)]) and not (key = '.') and not (key = '-') then Key:= #0;

 

Ou apenas números:

 

if not (Key in['0'..'9',Chr(8)]) then Key:= #0;

 

Espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No caso você quer verificar se o campo foi preenchido ou se ele tem campos em branco entre os dados informados? Se for verificar se o mesmo tem algum dado, você pode testar o lenght dele, dando um trim no campo. Algo do tipo:

 

if Length(trim(DBEditCGC_CPF.text)) = 0 then
   showmessage('Campo ainda não foi preenchido.');

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado manobr pela dica, mas eu já fiz algo parecido só que usando a propriedade EditMask, como abaixo.

 

TableClientesCGC_CPF.EditMask := '99\.999\.999\/9999\-99;0;_';

 

Como você pode ver, só são aceitos números e o zero garante que somente os números serão armazenados na tabela (paradox). Eu até pensei que o caractere ‘_’ pudesse estar causando o problema mas ele é visualizado somente pelo usuário no DBedit e não é armazenado na tabela, logo não poderia afetar a busca por espaço vazio na string. Já tentei, sem sucesso também, trocar a linha

 

Corrige_branco := TableClientesCGC_CPF.Text;

 

por

 

Corrige_branco := TableClientesCGC_CPF.AsString;

 

mas deu na mesma.

 

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caro Chrnos,

 

O meu problema não é com a verificação de campo preenchido, mas sim com a verificação de preenchimento correto. Por exemplo, digamos que eu quero digitar um CPF qualquer: “999.999.999 – 99”, mas por algum engano eu escreva : “999.9 9.999 – 99”. Tem um erro no quinto caracter e ele é salvo numa tabela paradox como “9999 999999” .

Como eu falei antes, se eu substituo qualquer outro valor ao invés de espaço em branco o código funciona. Por que com ‘ ’ não funciona?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Porque não tenta uma solução mais simples?? Antes de dar o comando para gravar no banco, chama uma rotina de validação e tenta converter este para um inteiro, usando um try except... provavelmente este campo em branco vai gerar um erro que você pode tratar dentro do sistema, por exemplo, forçando o usuário a digitar o valor corretamente.

 

Outra coisa... no seu editmask, o espaço em branco seria o ' ' (com um espaço entre as aspas) provavelmente não? Estou num pc que não posso testar isso agora.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bah Chrnos, desculpe minha ignorância no assunto, mas eu tentei fazer o que você sugeriu mas não tá dando certo. O programa está sempre dando a mensagem de erro, mesmo qdo não há espaço em branco na string. Fiz um Debug e verifiquei o valor da variável “corrige_branco” e, teoricamente, estava correta (sem brancos). Na compilação aparece a seguinte mensagem “[hint]Cliente.pas(261): Value assign to ‘x’ never used”.

De fato eu não estou usando mesmo a variável, a idéia é que ela fosse só para validar o bloco “try –exception”. Seria este o meu erro?

 

procedure TFormClientes.TableClientesBeforePost(DataSet: TDataSet);
var
corrige_branco:string;
x:integer;
Begin
x:=0;
Try
corrige_branco := TableClientesCGC_CPF.AsString;
x:= StrToInt(corrige_branco);
except
on E: EConvertError do
begin
ShowMessage('O campo '+ LabelCGC_CPF.Caption + ' está incorreto!');
DBEditCGC_CPF.SetFocus;
abort;
end;
end;
end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, é que só agora me atendei a um detalhe... você usa uma máscara certo? Então provavelmente você está passando junto com os valores os separadores neste teste do try, ai dá o erro mesmo....

 

Uma coisa que você pode mudar é por na sua máscara 0 no lugar do 9 onde os dados obrigatoriamente tem que ter um valor preenchido... o 0 exige o preenchimento de um valor numérico na posição enquanto o 9 só aceita números mas não obriga o seu preenchimento.

 

Agora, eu peguei a sua máscara e joguei num maskedit e testei seu código inicial aqui desta forma:

 

procedure TForm1.BitBtn1Click(Sender: TObject);
var corrige_branco : String;
begin
  corrige_branco := MaskEdit1.Text;
  If Pos(' ',corrige_branco) <> 0 then
  Begin
	MessageDlg ('O campo está incompleto!', mtWarning,
	[mbOK],0);
  end;
end;

E usando o teste acima a mensagem de erro foi retornada sempre que o campo estava vazio... talvez fosse interessante você debugar o seu código e ver como a variável corrige_branco está sendo carregada na hora que entra neste trecho do seu código, para ver se o valor que veio da TableClientesCGC_CPF.AsString possui um campo em branco ou se ela joga algum outro caracter nos espaços em branco... ou repensar a forma de validar isso (talvez montando uma rotina que copie apenas os números desta variável e faça um count pra ver se atentem ao que você espera).

 

De todo modo, faça um debug e veja por onde seu programa está passando para ver essa questão.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.