Sobre validação de Data
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
Curtidas 0
Respostas
Rssampaio
08/06/2005
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.
GOSTEI 0
Bruno Belchior
08/06/2005
eu já uso o 9...
GOSTEI 0
Sandra
08/06/2005
Bruno,
Teste a function [b:aec74a0958]TryStrToDate[/b:aec74a0958]. Um exemplo:
Mais informações, no help do Delphi. :D
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
GOSTEI 0
Bruno Belchior
08/06/2005
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...
GOSTEI 0
Marco Salles
08/06/2005
: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 :?: :?: :?:
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 :?: :?: :?:
GOSTEI 0
Bruno Belchior
08/06/2005
sim Marcos é o que sempre utilizei mas a empresa que trabalho faz questão de utilizar data-aware...
GOSTEI 0
Marco Salles
08/06/2005
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 :?: :?: :?:
GOSTEI 0
Bruno Belchior
08/06/2005
blz vou testar
GOSTEI 0
Bruno Belchior
08/06/2005
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... :?:
GOSTEI 0
Marco Salles
08/06/2005
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...
GOSTEI 0
Bruno Belchior
08/06/2005
eu realmente uso o OnValidate mas quanto a recursividade não está acontecendo não...
GOSTEI 0
Marco Salles
08/06/2005
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 :?:
GOSTEI 0
Bruno Belchior
08/06/2005
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!
GOSTEI 0
Marco Salles
08/06/2005
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
[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
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
GOSTEI 0
Bruno Belchior
08/06/2005
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...
GOSTEI 0
Bruno Belchior
08/06/2005
refiz dessa forma e deu certo (mesmo sem atribuir nil ao evento), mas o gozado é que tinha já tentado atribuir isso mas... de qualquer forma funcionou então uma abração e valew...
GOSTEI 0
Marco Salles
08/06/2005
refiz dessa forma e deu certo (mesmo sem atribuir nil ao evento), mas o gozado é que tinha já tentado atribuir isso mas... de qualquer forma funcionou então uma abração e valew...
Contece coisas piores.. Vai entender
GOSTEI 0
Bruno Belchior
08/06/2005
como [b:e68bc979c8]nóis[/b:e68bc979c8] goianos dizemos: [b:e68bc979c8]Teve bão[/b:e68bc979c8]...
GOSTEI 0
Danilorsa
08/06/2005
Pessoal, legal esse tópico...
Não uso nada de função recursiva não... Mas uso o SetText Também...
Defina uma função ValidaDataMascara.
function ValidaDataMascara(pText: String):Boolean;
begin
ValidaDataMascara := False;
// Verifica se data válida
try
if Trim(pText) <> ´/ /´ then
begin
StrToDate(pText);
ValidaDataMascara := True;
end
else
ValidaDataMascara := False
except
Application.MessageBox(´A data informada está inválida !´,PChar(Application.Title),MB_OK + MB_ICONWARNING);
ValidaDataMascara := False;
end;
end;
Bem.. até aqui tudo bem...
Defina a mascara do seu campo: !99/99/9999;1;_
Seu evento on setText fica assim:
procedure TForm1.TabelaCAMPODATASetText(
Sender: TField; const Text: String);
begin
{:
Verifica se a data é válida
Resolve problema de campos de data com máscara
}
if not ValidaDataMascara(Text) then
Sender.Clear
else
Sender.AsString := Text;
end;
E pra mim foram resolvidos os problemas...
Um abraço, galera...
Não uso nada de função recursiva não... Mas uso o SetText Também...
Defina uma função ValidaDataMascara.
function ValidaDataMascara(pText: String):Boolean;
begin
ValidaDataMascara := False;
// Verifica se data válida
try
if Trim(pText) <> ´/ /´ then
begin
StrToDate(pText);
ValidaDataMascara := True;
end
else
ValidaDataMascara := False
except
Application.MessageBox(´A data informada está inválida !´,PChar(Application.Title),MB_OK + MB_ICONWARNING);
ValidaDataMascara := False;
end;
end;
Bem.. até aqui tudo bem...
Defina a mascara do seu campo: !99/99/9999;1;_
Seu evento on setText fica assim:
procedure TForm1.TabelaCAMPODATASetText(
Sender: TField; const Text: String);
begin
{:
Verifica se a data é válida
Resolve problema de campos de data com máscara
}
if not ValidaDataMascara(Text) then
Sender.Clear
else
Sender.AsString := Text;
end;
E pra mim foram resolvidos os problemas...
Um abraço, galera...
GOSTEI 0