erro validar data

Delphi

09/04/2008

Vou tentar explicar..

Estou tentando fazer as validações de um campo dbedit que recebe uma data, qnd passo pelo campo sem digitar nada não acontece nada, normal, porém quando passo pelo campo digito alguma coisa e depois apago o que digitei e saio do campo ele me dá o erro:

raised exception Class EConvertError with message ´ / / ´is not a valid date.

Como faço para tirar esse erro. Gostaria que o usuário se ele digitou a data mas errou e não era pra digitar nada era só bra deixar o campo em branco então que o foco saia sem dar erro.

E pegando o embalo como faço pra passar o erro: is not a valid date´ para o português? Assim se o usuário digitar data: 89/25/2100 o erro será ´Esta não é uma data válida´.

Fico muito agradecido pelas respostas.


Ricklorente

Ricklorente

Curtidas 0

Respostas

Marco Salles

Marco Salles

09/04/2008

Voce esta usando alguma máscara no Field ???

se sim , qual é a mascára que voce esta usando ???


GOSTEI 0
Ricklorente

Ricklorente

09/04/2008

Estou sim !99/99/9999;1;

E como conexão uso ClientDataSet, DataSetProvider, SqlDataSet


GOSTEI 0
Marco Salles

Marco Salles

09/04/2008

então ta resolvido ...

Coloque a mascara no field do campo !99/99/9999;1;_


e programe o evento [b:afb2d9a416]OnSetText[/b:afb2d9a416] do Tfield o seguinte código
Código:

procedure TForm1.SEUDATASETonSetText(Sender: TField; const Text: String); 
var 
  data:Tdate; 
begin 
try 
  if Text= ´  /  /    ´ then 
     sender.Clear 
  else 
    begin 
      data:=strtodate(Text); 
      sender.AsString:=Text; 
    end; 
except 
 on e:econverterror do 
   begin 
     showmessage(´A Dada Digitada : ´+Text+´ Não Correposnde a Uma Data Válidadata´); 
     abort; 
   end; 
 end; 


espero ter sido util...


GOSTEI 0
Ricklorente

Ricklorente

09/04/2008

Caraca.. Funcionou perfeitamente, cara to quebrando a cabeça o dia inteiro com esse negócio e não sai do lugar.. Tmb iniciante é fogo. Mas garanto que estou me dedicando para aprender.

Agora é o seguinte, eu só não entendi pq vc declarou a variavel ´Data´ e atribuiu (data:=strtodate(Text);) ela, onde vc está usando ela no código?? Eu deixei sem e funcionou, será q tem problema??

Mt obrigado pela ajuda.


GOSTEI 0
Marco Salles

Marco Salles

09/04/2008

Caraca.. Funcionou perfeitamente, cara to quebrando a cabeça o dia inteiro com esse negócio e não sai do lugar.. Tmb iniciante é fogo. Mas garanto que estou me dedicando para aprender. Agora é o seguinte, eu só não entendi pq vc declarou a variavel ´Data´ e atribuiu (data:=strtodate(Text) ela, onde vc está usando ela no código?? Eu deixei sem e funcionou, será q tem problema??


somente a título didático ... o efeito é o mesmo que

sender.asstring:=text ...
[b:56a683b025]
se text não for uma data válida gera tb uma exceção que será tratada pelo codigo try except [/b:56a683b025]
Pode ficar tranquilo , não ha problemas....


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

09/04/2008

Meu caso é o mesmo: tenho máscara no campo data.

E se eu estou em um GRID, alterando a data diretamente no grid, em qual evento eu coloco essa validação ?


GOSTEI 0
Marco Salles

Marco Salles

09/04/2008

Meu caso é o mesmo: tenho máscara no campo data. E se eu estou em um GRID, alterando a data diretamente no grid, em qual evento eu coloco essa validação ?


no evento onsettext do Tfield

Voce fez isto ???


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

09/04/2008

Não tenho os fields no ClientDataSet. Eu carrego-os através de Provider, pois se um dia trocar de tamanho, qtd de campos, etc é uma coisa a menos para me preocupar.

Existe outra forma ?


GOSTEI 0
Marco Salles

Marco Salles

09/04/2008

Não tenho os fields no ClientDataSet. Eu carrego-os através de Provider, pois se um dia trocar de tamanho, qtd de campos, etc é uma coisa a menos para me preocupar.


ta , então é outro caso ..

Veja o tópico inicial :

[b:23887f566c]Voce esta usando alguma máscara no Field ??? [/b:23887f566c] se sim , qual é a mascára que voce esta usando ???


[b:23887f566c]Estou sim !99/99/9999;1; [/b:23887f566c] E como conexão uso ClientDataSet, DataSetProvider, SqlDataSet


e no seu caso ... Aonde esta a mascará ?????


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

09/04/2008

Veja:
  SelectAllM1(12, dmMovimento1.qyGridInvenAge, xFiltroSelect);
  pvInvenAge.DataSet := dmMovimento1.qyGridInvenAge;
  cdsInvenAge.ProviderName := ´pvInvenAge´;
  dsInvenAge.dataset := cdsInvenAge;
  cdsInvenAge.Active := true;
  cdsInvenAge.IndexFieldNames := ´desebl;desepv;ordstr´;
  SetDateMask(cdsInvenAge.fieldbyname(´datage´));


E a função...

procedure SetDateMask(fField: TField);
begin
  fField.EditMask := ´99/99/9999;1; ´;
end;



GOSTEI 0
Fabriciocolombo

Fabriciocolombo

09/04/2008

Bom dia,

no seu caso, crie um procedimento fazendo a validação e atribua ao TField em tempo de execucação.

procedure SetDateMask(fField: TField);
begin
fField.EditMask := ´99/99/9999;1; ´;
TField.OnSetText := OnSetTextDate;
end;

procedure TForm1.OnSetTextDate(Sender: TField; const Text: String);
begin
if not(Text= ´ / / ´) then
begin
try
sender.AsString:=Text;
except
on e:econverterror do
begin
raise Exception.Create(´A Dada Digitada : ´+Text+´ Não Correposnde a Uma Data Válidadata´);
end
else
begin
raise; //É importante lembrar de emitir uma exceção mesmo que o erro não seja de data inválida. Senão a exceção será suprimida
end;
end;
end;
end
else
begin
sender.Clear ;
end;
end;

Até mais


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

09/04/2008

Tem algo faltando nesse código ...

procedure SetDateMask(fField: TField);
begin
  fField.EditMask := ´99/99/9999;1; ´;
  fField.OnSetText := OnSetTextDate   [b]E os parâmetros ???[/b];
end;


Função:

procedure OnSetTextDate(fField: TField; const Text: String);
begin
  if not(Text= ´ / / ´) then
  begin
    try
      fField.AsString:=Text;
    except on e:econverterror do
    begin
      raise Exception.Create(´A data digitada : ´+Text+´ não correposnde a uma data válida´);
    end
    else
    begin
      raise; //É importante lembrar de emitir uma exceção mesmo que o erro não seja de data inválida. Senão a exceção será suprimida
    end;
    end;
    end;
    end
  else
  begin
    fField.Clear ;
  end;
end;



GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

09/04/2008

sobe


GOSTEI 0
Frostlost

Frostlost

09/04/2008


procedure TFrmClientes.DBEdit21Change(Sender: TObject);
begin
  if ((SENDER as TDBEdit).DataSource.DataSet.State in [dsInsert, dsEdit])
    and ((SENDER as TDBEdit).Text = ´  /  /    ´) then
    (SENDER as TDBEdit).Field.Clear;
end;



Claudio Stein Junior


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

09/04/2008

Eu digito direto no GRID; não tenho edits nessa tela ...


GOSTEI 0
Marco Salles

Marco Salles

09/04/2008

Não tenho os fields no ClientDataSet. Eu carrego-os através de Provider, pois se um dia trocar de tamanho, qtd de campos, etc é uma coisa a menos para me preocupar.


voce pode não ter o fields no clientDataSet , mas voce pode atribuir oo Evento OnSetText em RumTime

Tipo Isto

private
    procedure MeuEventoSetText(Sender: TField; const Text: String);



SeuDataSet.FieldByName(´SeuCampoData´).OnSetText:=MeuEventoSetText;


Neste MeuEvenoSetText Escreva o codigo ja postado

procedure TForm1.MeuEventoSetText(Sender: TField;
  const Text: String);
  data:Tdate;
begin
try
  if Text= ´  /  /    ´ then
     sender.Clear 
  else
    begin
      data:=strtodate(Text);
      sender.AsString:=Text;
    end;
except
 on e:econverterror do
   begin
     showmessage(´A Dada Digitada : ´+Text+´ Não Correposnde a Uma Data Válidadata´);
     abort;
   end;
end;


Acho que isto resolve , se é que entendi...


GOSTEI 0
Powerlog Tecnologia

Powerlog Tecnologia

09/04/2008

[b:8706af6009]SHOW DE BOLA ![/b:8706af6009]
Valeu Marco Salles !


GOSTEI 0
POSTAR