Ir para conteúdo
Fórum Script Brasil
  • 0

Validação de data


Gabriel Cabral

Pergunta

Boa tarde, galera..

olha...eu sei q já existe um monte de tópico auqi sobre isso....

mas não consegui encontrar nenhum q conseguiu me ajudar..

é o seguinte...

estou tentando validar a data deste jeito:

procedure TfrmCadCli.txtCadCli_DataNascExit(Sender: TObject);
var Data: TDate;
begin

  Data := StrToDate(txtCadCli_DataNasc.Text);

  if not (txtCadCli_DataNasc.Text = '  /  /    ') then
  begin
    [red]if not IsDate(Data) then[/red]
    begin
      Application.MessageBox('Data inválida!!!      ', 'WINSUPERM', MB_ICONEXCLAMATION);
      txtCadCli_DataNasc.SetFocus;
    end;
  end;

end;

mas sempre dá o erro na linha q está em vermelho, dizendo:

[Error] U_frmCadCli.pas(1448): Undeclared identifier: 'IsDate'

qual pode ser o problema aí??

Muito Obrigado

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Existem muitas formas de se obter isso

Exemplos:

O exemplo abaixo mostra como converter uma string em data e lança uma exceção do tipo EConvertError se a converção não puder ser feita: 
procedure TForm1.Button1Click(Sender: TObject);
var
  data: TDateTime;
begin
  try
    data := StrToDate(Edit1.Text);
    ShowMessage('A data informada é: ' + DateToStr(data));
  except
    on EConvertError do
      ShowMessage('Erro de Conversão de Tipos');
  end;
end;
outro
procedure TForm1.MaskEdit1Exit(Sender: TObject);
begin
   try
     StrToDate(MaskEdit1.Text);
   except
   on EConvertError do
     ShowMessage ('Data Inválida!');
   end;
end;
outro
function tbStrIsDate(const S: string): boolean;
begin
  try
  StrToDate(S);
  Result := true;
  except
  Result := false;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var Data: string;
begin

   Data := txtCadCli_DataNasc.Text;

   if tbStrIsDate(Data) then
     ShowMessage(txtCadCli_DataNasc.Text + ' é data válida.')
   else
      begin
         ShowMessage(txtCadCli_DataNasc.Text + ' NÃO é data válida.');
         Application.MessageBox('Data inválida!!!      ', 'WINSUPERM', MB_ICONEXCLAMATION);
         txtCadCli_DataNasc.SetFocus;
      end;

end;
outro
//pra validar a data

try 
   strtodate(editdata.text);
except
   showmessage('data invalida');
end;


//mas try except só funciona se você rodar fora do Delphi.
outro
private
{ Private declarations }
public
function Data(const v: string): boolean;
{ Public declarations }
end;

//pressione Ctrl+Shift+C, neste momento abrirá um bloco vazio para que você possa digitar os comandos 
// que irá executar a function, como mostra o exemplo:


Function Data(const v: string): boolean;
begin
   try
      StrToDate(v);
      Result := true;
   except
     Result := false;
   end;
end;


//Salva sua aplicação e adicione um edit no seu formulário e um button, no evento onClick do button digite o 
//seguinte comando, 


if Data(Edit1.Text) then
   ShowMessage(Edit1.Text + ' Data válida . ')
else
   ShowMessage('Data Invalida ');

//Esse comando checa se o que foi digitado no edit é uma data válida.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
mas sempre dá o erro na linha q está em vermelho, dizendo:

[Error] U_frmCadCli.pas(1448): Undeclared identifier: 'IsDate'

qual pode ser o problema aí??

Gabriel Cabral, respondendo especificamente à sua pergunta, este erro que você está obtendo é de compilação e está lhe advertindo para o fato de a função IsDate não ter sido identificada (declarada). E na verdade, no Delphi, ela não existe mesmo!

Você deve fazer a validação usando um dos métodos que o colega Jhonas lhe apresentou.

Também pode usar um deles para criar sua própria função IsDate. Veja o código prontinho no Torry's Delphi Pages.

E apenas fazendo uma avaliação do seu código (abaixo), após resolvida a questão da função e quando o seu programa "rodar", você deve observar que da forma como está seu código, a sua tentativa de validação estará incorreta.

Quando na primeira linha você usa StrToDate, você já estará forçando uma validação da data informada, pois se o texto estiver incorreto, uma mensagem de erro será apresentada (uma Exception => EConvertError) e nem chegará ao seu primeiro if. Ou seja, se a data for convertida sem erro, é uma data válida, caso contrário, não!

Este seu código seria tipicamente substituído por uma das opções que o colega Jhonas lhe passou - use um deles eles.

estou tentando validar a data deste jeito:

procedure TfrmCadCli.txtCadCli_DataNascExit(Sender: TObject);
var Data: TDate;
begin

  Data := StrToDate(txtCadCli_DataNasc.Text);  // <####

  if not (txtCadCli_DataNasc.Text = '  /  /    ') then
  begin
    if not IsDate(Data) then
    begin
      Application.MessageBox('Data inválida!!!      ', 'WINSUPERM', MB_ICONEXCLAMATION);
      txtCadCli_DataNasc.SetFocus;
    end;
  end;

end;

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Então, Jhonas e Micheus..

eu experimentei todos esses exemplos para validar a data, mas todos caem na mesma mensagem de erro de conversão...

Project winsuperm.exe raised exception class EconvertError with message '33/22/1111' is not a valid date'.

É claro q vai dar erro na conversão quando eu digito uma data inválida...mas queria tratar isso, para o programa não encerrar, mas cair na caixa de mensagem que eu fiz.

Como eu faria isso???

E isso só funciona com MaskEdit??? ou funciona com DBEdit também???

porque aqui é um DBEdit....e o campo tem a propriedade EditMask como !99/99/9999;1;

isso interfere em alguma coisa???

porque a caixa de msg do programa não aparece de jeito nenhum quando a data é inválida..

SEMPRE dá a mensagem do Delphi. =/

Obrigado

Editado por Gabriel Cabral
Link para o comentário
Compartilhar em outros sites

  • 0
E isso só funciona com MaskEdit??? ou funciona com DBEdit também???

porque aqui é um DBEdit....e o campo tem a propriedade EditMask como !99/99/9999;1;

isso interfere em alguma coisa???

A máscara em si, não interfere na impossibilidade da sua validação. O que ocorre é que o componente TDBEdit apenas chama o método associado ao evento OnExit, após ter feito sua validação interna. Veja o código dele:

procedure TDBEdit.CMExit(var Message: TCMExit);
begin
  try
    FDataLink.UpdateRecord;
  except
    SelectAll;
    SetFocus;
    raise;
  end;
  SetFocused(False);
  CheckCursor;
  DoExit;
end;
É ao chamar DoExit que o seu código no evento OnExit será chamado, mas daí, a conversão já foi "feita" lá no FDataLink.UpdateRecord. Solução? Certo mesmo, apenas derivando um componente a partir do TDBEdit e reescrevento o procedimento CMExit. Há de se ver a conveniência disto. Outras soluções, apenas através de alguns testes. Um caminho pode ser escrevendo um procedimento do tipo TWndMethod para ser atribuido a propriedade WindowProc. Este procedimento de janala (Window Procedure) é responsável pelo processamento das mensagens e é inicializado com um procedimento padrão. Assim, pode-se criar um novo que irá interceptar a mensagem e conforme o processamento, passa a diante para o método antigo ou não. Veja este exemplo:
...
Type
  TForm1 = class(TForm)
    ...
  private
    SavedWindowProc :TWndMethod;
    procedure WndProc(var Message: TMessage);
  end;

...
procedure TForm1.WndProc(var Message: TMessage);
begin
  if Message.Msg = CM_EXIT then
  try
    StrToDate(DBEdit2.Text);
  except
    DBEdit2.SetFocus;
    Raise Exception.CreateFmt('"%s" não é uma data inválida.', [DBEdit2.Text]);
  end;
  SavedWindowProc(Message);
end;

procedure TForm1.FormCreate
begin
  SavedWindowProc := DBEdit2.WindowProc;
  DBEdit2.WindowProc := WndProc;
  ...
end;
...
end.

O inconveniente neste caso é que o procedimento serve apenas para um componente. Se tiver outros TDBEdit com entrada para data, teriam que ser criados outros tantos procedimentos iguais, pois é a única forma de sabermos a qual estaremos nos referindo.

Ocorre que "teoricamente", poderíamos atribuir este procedimento a mais que um TDBEdit mas, dentro do procedimento, não teríamos como saber qual deles usar para a validação. É que a mensagem para CM_EXIT não tem qualquer parâmetro que nos indique isto.

Quanto a mensagem enorme que você postou, ela sempre vai ocorrer quando você estiver em ambiente de desenvolvimento. Se você executar a sua aplicação sozinha, apenas verá a mensagem curta: "'33/22/1111' is not a valid date". Mas em desenvolvimento, ambas serão mostradas. A primeira ao cair na IDE e a segunda após você teclar F9 para prosseguir com o programa.

Espero ter conseguido explicar direito.

Abraços

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...