tratamento de erro para data

17/04/2013

21

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"
Responder

Posts

17/04/2013

Wilton Júnior

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.
Responder

17/04/2013

Joel Rodrigues

Rapaz, com esse tratamento era pra capturar qualquer exceção de conversão. Em que situação está ocorrendo o segundo erro?
Responder

17/04/2013

Wilton Júnior

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

17/04/2013

Joel Rodrigues

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.
Responder

17/04/2013

Wilton Júnior

Para o botão cancelar nao existe nenhum evento de conversão de dados
Responder

17/04/2013

Joel Rodrigues

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?
Responder

17/04/2013

Wilton Júnior

Será que não é a porcaria da mascara de caracter que coloquei para data?
Responder

17/04/2013

Wilton Júnior

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.
Responder

17/04/2013

Joel Rodrigues

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.
Responder

17/04/2013

Wilton Júnior

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.

Responder
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.
Responder

18/04/2013

Wilton Júnior

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
Responder

26/06/2017

Andre Santos

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;

Responder

26/06/2017

Andre Santos

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;

Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira