Fórum deixar um campo com mascara aceitar branco???? #285962
24/06/2005
0
Tenho um clientdataset com vários fields, e um deles é um campo data. Este campo tem máscar de data..
se o usuário inserir uma data e gravar no banco de dados e depois quiser deixá-la em branco dá erro na máscara..
Como faço para que este campo aceite valor em branco..
No banco de dados o campo não está configurado pára not null..
veja que se gravar a primeira vez em branco não dá erro..
Agradeço a atenção de todos
Cabelo
Curtir tópico
+ 0Posts
24/06/2005
Marco Salles
Gostei + 0
24/06/2005
Tnaires
Já enfrentei esse problema. Tente o seguinte:
- escreva essa procedure no seu programa (acima da cláusula private):
procedure TFrmPadrao.EdtDataChange(Sender: TObject); var Edit: TDBEdit; begin Edit := (Sender as TDBEDit); if (Edit.DataSource.DataSet.State in [dsInsert, dsEdit]) and (Edit.Text = ´ / / ´) then Edit.Field.Clear; end;
- aponte essa procedure para o evento OnChange do TDBEdit associado ao seu campo data.
Vc pode colocar essa procedure no form padrão do seu sistema, e sair apontando os eventos dos DBEdits necessários nos forms filhos.
Não sei se há maneira mais simples, mas foi a maneira q eu encontrei.
Abraços
P.S. - a máscara q eu usei foi ´!99/99/9999;1; ´
Gostei + 0
24/06/2005
Cabelo
!99/99/00;1;
procedure TFrmPadrao.EdtDataChange(Sender: TObject); var Edit: TDBEdit; begin Edit := (Sender as TDBEDit); if (Edit.DataSource.DataSet.State in [dsInsert, dsEdit]) and (Edit.Text = ´ / / ´) then Edit.Field.Clear; end;
Colega.. mas estou usando um DBGrid e não um DBEdit, e esta rotina irá fazer a verificação todas as vezes que mexer no campo, o que perde e muita a performance quando estiver trabalhando on-line..
deve haver uma outra forma de resolver este problema..
mesmo assim muito obrigado..
Gostei + 0
24/06/2005
Marco Salles
Tente tirar os zeros
Gostei + 0
24/06/2005
Marco Salles
Talvez no seu caso não resolva... :cry: :cry: :cry:
Bem sugiro que escreva o seguinte código no evento OnsetText DOCampo
Exemplo:
procedure TForm1.Table1DataSetText(Sender: TField; const Text: String); begin if Text = ´ / / ´ then sender.clear else Sender.AsDateTime:= StrToDate(Text); end;
[b:8c53e5d6fb]p:s para a mascara ]!99/99/00;1;[/b:8c53e5d6fb]
Se funcionar ou parcialmente funcionar esta rotina pode ser alterada e modificada segundo a sua necessidade especifica...
Gostei + 0
25/06/2005
Maxadens
procedure TForm1.TabelaCampoSetText(Sender: TField;
const Text: String);
begin
if Text = ´ / / ´ then
Tabela.campo.clear
else
Tabela.campo := StrToDate(text);
end;
Inclusive, você pode tratar erros de datas inválidas nesse evento que vai ficar legal.
Gostei + 0
25/06/2005
Marco Salles
[b:eeef0667a9]Foi o que eu disse em minha última citação[/b:eeef0667a9]
Gostei + 0
25/06/2005
Maxadens
Mas valeus!
Gostei + 0
27/06/2005
Cabelo
Funciona perfeitamente..
O Problema é que este evento funciona como o evento keypress do edit..
Faz a verificação em todas as vezes que mexo no grid, e não posso trabalhar assim, pois tenho muitos campos e além de tudo trabalha on-line, o que acarreta na perda de performance.
Não existe nenhuma máscara que me permite brancos?
Gostei + 0
27/06/2005
Tnaires
Eu, e talvez outros colegas do fórum, recorremos a esta ´gambiarra´ justamente pq esse problema [b:26a410d092]parece[/b:26a410d092] ser uma espécie de bug da validação de máscaras da VCL do Delphi. Talvez vc tenha q procurar uma outra suíte de componentes q não apresente esse problema.
Gostei + 0
27/06/2005
Cabelo
Trabalho com CLX, nem VCL é..
Vou pesquisar um pouco, qualquer coisa posto aquí se encontrar algo..
Obrigado pela atenção de todos.
Gostei + 0
28/06/2005
Cabelo
alguém?
Gostei + 0
28/06/2005
Marco Salles
Se voce for mais puder me esclarecer melhor eu agradeço
Mas se voce esta mexendo no Grid ele tem que fazer a verificação.. É errado isto :?: :?: :?:
Por outro lado , ele tem que verificar [size=18:3086488c2d][b:3086488c2d]somente[/b:3086488c2d][/size:3086488c2d] o campo do Registro que esta selecionado...Veja que se voce explicar esses passos Melhor podem aparecer dicas de [b:3086488c2d]desabilitar e habilitar o evento onsetText no momento certo[/b:3086488c2d]... Assim , teste de verificações desnecessários , não acontecerão...
Por exemplo..Toda vez que o dataSource muda de estado Habilita o evento OnsetText... Ou coisa do tipo , toda vez que a coluna do Grid Correspondente recebe o foco.. Vamos supor que seu campo Data esta no Grid na cluna 3...[b:3086488c2d] Note uma idéia do código[/b:3086488c2d]
procedure TForm1.DBGrid1ColEnter(Sender: TObject); begin if (DbGrid1.SelectedIndex=3)and(O Estado e de edicao ou Irserção) Then begin Habilita o evento OnsetText; end else Desabilita o evento onsetText end;
[b:3086488c2d]Entendeu aonde eu quero chegar... [/b:3086488c2d]Acho que desta forma é possível voce minimizar os efeitos de uma chamda desnecessária a um evento
Se voce não souber como fazer para habilitar e desabilitar um [b:3086488c2d]evento , post ai[/b:3086488c2d]
Mas tb gostaria de sua observaçoes pois ate agora não entendi muito bem o que se esta passando... Eu lembro que este evento onsetText é realizado muitas vezes quando se esta desenhando no Grid.. Fora iisto eu to sem entender
Gostei + 0
29/06/2005
Cabelo
é o seguinte..
Todas as vezes que mexo em uma linha do grid, tenho que gravar os dados em um vetor do tipo record, mas esta gravação é muito rápida. Tenho que percorrer todos os campos na hora de gravar, linha a linha, e isto irá fazer dispara o evento OnSelText, o quê iria causar muita perda de performance..pois iria verificar os campos, mesmo os já verificados a cada post, todos os registros.. entendeu?
por isso não posso usar o evento, já que ele iria, neste caso, funcionar como o keypress do edit..
Tem ceretza que não existe uma máscara que opere com valores em branco?
Gostei + 0
29/06/2005
Marlon Spiess
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)