tratamento de erro para data

Delphi

17/04/2013

Já tentei diversar dicas no google para tratamento de erro com data.
tenhum campo é que datetime estou trabalhando com DBEdit.
para chegar se o campo esta vazio da certo mas se a data é valida, ele passa pelo tratamento que fiz e depois aparece
'32/20/1900' is not a valid date. Esse é um exemplo.

Quando clico no botão cancelar aparece outra '32/20/1900' is not valid date and time.

Como faço um tratamento de erro descente para que esse erros não parecam?.

obrigado
"Deus Abençoe"
Wilton Júnior

Wilton Júnior

Curtidas 0

Respostas

Wilton Júnior

Wilton Júnior

17/04/2013

Para a mensagem de erro <'32/20/1900' is not a valid date>, consegui resolver assim:
try
StrToDate(DBEdit3.Text);
except on EConvertError do
begin
ShowMessage ('Data Inválida!');
DBEdit3.setfocus;
exit;
end;
end;
Esse tratamento de erro achei nesse site: http://delphidicas.blogspot.com.br/2007/03/validar-datas.html.

Agora o outro erro <'32/20/1900' is not valid date and time> alguem tem alguma dica.
Esse Erro aparece quando clico no botão cancelar.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

17/04/2013

Rapaz, com esse tratamento era pra capturar qualquer exceção de conversão. Em que situação está ocorrendo o segundo erro?
GOSTEI 0
Wilton Júnior

Wilton Júnior

17/04/2013

Erro <'32/20/1900' is not valid date and time>
--->Esse Erro aparece quando clico no botão cancelar.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

17/04/2013

Nesse botão, você tenta converter o texto para o tipo Date ou DateTime? Eu testei aqui com StrToDate e StrToDateTime, esse seu código e a exceção foi capturada.
GOSTEI 0
Wilton Júnior

Wilton Júnior

17/04/2013

Para o botão cancelar nao existe nenhum evento de conversão de dados
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

17/04/2013

Em algum lugar deve haver uma tentativa de conversão. Verifique se não há nenhum evento como OnBeforePost, OnExit, etc.
Você pode também fazer essa verificação no OnExit do componente, para não permitir que sejam inseridas datas inválidas.
Só por garantia, por que você não usa um DatePicker?
GOSTEI 0
Wilton Júnior

Wilton Júnior

17/04/2013

Será que não é a porcaria da mascara de caracter que coloquei para data?
GOSTEI 0
Wilton Júnior

Wilton Júnior

17/04/2013

procedure TMI011.DBEdit3KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if ((key = vk_return) or (key = vk_tab)) then
begin
if DBEdit3.text = '' then
begin
MESSAGEBOX(Application.Handle, 'Campo não pode ser nulo ou vazio', 'ATENÇÃO', MB_ICONWARNING + MB_OK);
DBEdit3.setfocus;
exit;
end;

try
StrToDate(DBEdit3.text);
except on EConvertError do
begin
MESSAGEBOX(Application.Handle, 'Formato da Data Está Incorreto!', 'ATENÇÃO', MB_ICONWARNING + MB_OK);
DBEdit3.setfocus;
exit;
end;
end;


label5.caption := label5.caption + ' ' + IntToStr(IdaAtu(StrToDate(DBEdit3.text))) + ' anos.';
Combobox2.enabled := true;
Combobox2.setfocus;
end;
end;
no evento onkeydown do dbedit3.
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

17/04/2013

Eu, particularmente, não acho que deva ficar no OnKeyDown e sim no OnExit, para evitar processamento desnecessário.
Ponha um breakpoint no botão Cancelar e veja se consegue identificar onde ocorre o erro de conversão.
GOSTEI 0
Wilton Júnior

Wilton Júnior

17/04/2013

No onexit, o cursor fica passando por todos os campos, e quando aperta cancela e fica preso no campo que é obrigado a preencher.

Agora no cancelar só tem isso:
WOpc := 0;
AMI011;-> faz um select onde a chave primary é nulo
HMI011;-> coloca os botões no padrão.

GOSTEI 0
Kelson Palharini

Kelson Palharini

17/04/2013

A questão é que quando você coloca mascará em um campo nem sempre a propriedade text vai ser igual EmptyStr ou '' ainda mais com data pois ele vai adicionar as barras. Faça o seguinte coloque um breakpoint nessa linha:

if DBEdit3.text = '' then


verifique qual o valor da propriedade text quando o campo está vazio e compare este valor ao invés de utilizar '' ou EmptyStr do delphi.


Qualquer coisa pode perguntar.
GOSTEI 0
Wilton Júnior

Wilton Júnior

17/04/2013

Kelson, eu mudei já

if DBEdit3.text = ' / / ' then

e da mesma coisa, o campo é do tipo datetime e a mascara esta na propriedade editmask do campo chamado nasfun.

obrigado
GOSTEI 0
Carlos Eduardo

Carlos Eduardo

17/04/2013

Function utilizando expressão regular para validar a data

function isDataNascimento(Value: String): Boolean;
const
  Format = '^([0-9]\\/[0-9]\\/[0-9])$'; // expressão regular
begin
  if (TRegEx.IsMatch(Value, Format)) then // valida o formato
    if (StrToDate(Value) < NOW()) then // Converte e verifica se é menor que data atudal
      isDataNascimento := TRUE // retorna true 
    else
      raise EDataNascimento.Create('Data de Nascimento maior que data atual') // senao cria uma exception
  else
    raise EDataNascimento.Create('Data de Nascimento invalida');// senao cria uma exception
end;

GOSTEI 0
Carlos Eduardo

Carlos Eduardo

17/04/2013

Evento do click do botão
procedure TForm1.btnSalvarClick(Sender: TObject);
begin
    if isDataNascimento(EdtDataNascimento.text) then
    begin

         // Data esta Valida

    end
    else
    begin

         // Data está invalida         

    end;
End;

GOSTEI 0
POSTAR