GARANTIR DESCONTO

Fórum Sobre validação de Data #284109

08/06/2005

0

Pessoal, há tempo isso me incomoda, tenho um campo Date (Firebird) e uso as minhas validações no OnValidade do TField, e quando eu saio do campo de data antes de executar o meu OnValidate o delphi gera uma exceção do próprio TDateField com uma mensagem genérica dizendo que a data não é válida, agora eu pergunto como tirar essa mensagem genérica do delphi?


Bruno Belchior

Bruno Belchior

Responder

Posts

08/06/2005

Rssampaio

Vc está utilizando mascara no campo de data? Se vc tiver verifique se na mascara vc tá usando 1 na mascara. Caso esteja substitua 1 por 9.


Responder

Gostei + 0

08/06/2005

Bruno Belchior

eu já uso o 9...


Responder

Gostei + 0

09/06/2005

Sandra

Bruno,

Teste a function [b:aec74a0958]TryStrToDate[/b:aec74a0958]. Um exemplo:
var
  data: TDateTime;
begin
  if (TryStrToDate(DBEdit1.Text, data)) then begin
    // Data válida
  end else begin
    // Data inválida
  end;
end;


Mais informações, no help do Delphi. :D


Responder

Gostei + 0

09/06/2005

Bruno Belchior

eu faço essa validação no OnValidate só que o delphi antes de executar o OnValidate parece que executa uma validação de Data (no caso nos campos TDateField) eu gostaria era de desativar isso...


Responder

Gostei + 0

09/06/2005

Marco Salles

:idea:
Talvez , não seria mais fácil ao inves de ´desativar isto´ voce usar um componente que não fosse um controle consciente de dados...

Não lhe serve esta idéia :?: :?: :?:


Responder

Gostei + 0

10/06/2005

Bruno Belchior

sim Marcos é o que sempre utilizei mas a empresa que trabalho faz questão de utilizar data-aware...


Responder

Gostei + 0

11/06/2005

Marco Salles

sim Marcos é o que sempre utilizei mas a empresa que trabalho faz questão de utilizar data-aware...


enrendo... Então sugiro que voce utilize o evento onSetText Do campo..

tipo o isto :

procedure TForm1.Table1NomeCampoSetText(Sender: TField);
begin
  try
    sender.Value:=strtodate(Text);
  except
   on E:Exception do
     begin
       // showmessage(´Data inválida´);  pode colocar mensagem ou não
       // sender.value:= se quiser corrija para un numero válido ou
      //sender.text := ´´ ;  se aceitar
     end;
end;
end;



Quando voce estiver rodando o programa va delphi , a mensagem ainda aparecerá..

Mas quando voce estiver rodando o programa via executável , o erro será tratado a tempo e a mensagem não sera vista pelo usuário.. A não ser que voce escreva uma mensagem particular


É isto que voce quer :?: :?: :?:


Responder

Gostei + 0

11/06/2005

Bruno Belchior

blz vou testar


Responder

Gostei + 0

13/06/2005

Bruno Belchior

a validação até que funcionoum, porém qualquer código que coloco no OnSetText quando eu saio do DBEdit seu valor retorna ao inicial... parece que ele cancela a alteração... :?:


Responder

Gostei + 0

14/06/2005

Marco Salles

a validação até que funcionoum, porém qualquer código que coloco no OnSetText quando eu saio do DBEdit seu valor retorna ao inicial... parece que ele cancela a alteração...


[b:39148e791f]Voce esta fazendo algum outro tipo de validação em outro evento.. Por exemplo , OnValidade... [/b:39148e791f]

O certo é ele cancelar a alteração , caso o valor não seje válido.. Mas se for ele não deveria fazer isto... Talvez o que possa estar ocorrendo , com voce , são eventos que ficam se repetindo( Tipo , um fica chamando o outro de maneira recursiva) , ai nesse caso ele pode voltar ao seu valor inicial
Então temos que talvez analisar todo um processo e não um evento isolado...


Responder

Gostei + 0

14/06/2005

Bruno Belchior

eu realmente uso o OnValidate mas quanto a recursividade não está acontecendo não...


Responder

Gostei + 0

14/06/2005

Marco Salles

eu realmente uso o OnValidate


Acho que não precisa mais , pelo menos para este campo

mas quanto a recursividade não está acontecendo não...


a algum código onexit no seu DbGrid :?:


Responder

Gostei + 0

14/06/2005

Bruno Belchior

não estou usando em um DbGrid mas sim em um DbEdit de qualquer forma não tem código no seu OnExit e passei toda a validação para o OnSetText e... de nada valeu!


Responder

Gostei + 0

14/06/2005

Marco Salles

me intigrei com isto e abri o delphi , peguei uma tabela , paradox , e escrevi e testei o código abaixo...

A Principio funcionou:::

P:S O evento ossetText que e testei Chama Table1Data_AdmissaoSetText, Troque pelo seu

procedure TForm1.Table1Data_AdmissaoSetText(Sender: TField;
  const Text: String);
var
 erro:Boolean;
 data:Tdate;
begin
begin
  try try
    erro:=False;
    data:=strToDate(text);
  except
   on E:Exception do
     begin
        erro:=True;
        showmessage(´Data inválida´); // pode colocar mensagem ou não
     end;
  end;
 finally
   begin
     if not erro then
       begin
         PlaySound(´Campainha do Windows XP´,0,snd_Async);
         TField(sender).OnSetText:=Nil;  //*************
         sender.AsDateTime:=Data;
//P:S O evento ossetText que e testei   Chama 
//Table1Data_AdmissaoSetText, Troque pelo seu
         TField(sender).OnsetText:=Table1Data_AdmissaoSetText; //******
       end;
   end;
 end;
end;
end;


[b:ad7af9490a]P:S talves as linhas de codigo gravadas por ******** Sejam desnecessária
Tente com elas e tente sem elas.. As coloquei so por precaução, Para evitar uma possivel reechamada ao evento[/b:ad7af9490a]

mas cada caso é um caso.. Tenta ai , e se não conseguir continue postando , Não desanima não...

Se eu não souber , outros possivelmente saberão


Responder

Gostei + 0

15/06/2005

Bruno Belchior

Marcos tinha feito da mesma forma que você, mas não pensei em atribuir [b:49842c02aa]nil[/b:49842c02aa] para o evento, em meus testes realmente ele entrava em um laço recursivo infinito, vou testar falow...


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar