tratamento de erro para data
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"
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
Curtidas 0
Respostas
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.
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
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
17/04/2013
Erro <'32/20/1900' is not valid date and time>
--->Esse Erro aparece quando clico no botão cancelar.
--->Esse Erro aparece quando clico no botão cancelar.
GOSTEI 0
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
17/04/2013
Para o botão cancelar nao existe nenhum evento de conversão de dados
GOSTEI 0
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?
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
17/04/2013
Será que não é a porcaria da mascara de caracter que coloquei para data?
GOSTEI 0
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.
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
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.
Ponha um breakpoint no botão Cancelar e veja se consegue identificar onde ocorre o erro de conversão.
GOSTEI 0
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.
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
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.
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
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
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
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
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