Fórum deixar um campo com mascara aceitar branco???? #285962

24/06/2005

0

Colegas..

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

Cabelo

Responder

Posts

24/06/2005

Marco Salles

como esta sua mascara...


Responder

Gostei + 0

24/06/2005

Tnaires

Olá
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; ´


Responder

Gostei + 0

24/06/2005

Cabelo

[quote:6f4241a447=´Marco Salles´]como esta sua mascara...[/quote:6f4241a447]

!99/99/00;1;



Olá 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; ´


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..


Responder

Gostei + 0

24/06/2005

Marco Salles

!99/99/00;1;

Tente tirar os zeros


Responder

Gostei + 0

24/06/2005

Marco Salles

!99/99/00;1; Tente tirar os zeros


Talvez no seu caso não resolva... :cry: :cry: :cry:

Colega.. mas estou usando um DBGrid e não um DBEdit,


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...


Responder

Gostei + 0

25/06/2005

Maxadens

no evento OnSetText do campo vc coloca o codigo seguinte:

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.


Responder

Gostei + 0

25/06/2005

Marco Salles

no evento OnSetText do campo vc coloca o codigo seguinte: 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.


[b:eeef0667a9]Foi o que eu disse em minha última citação[/b:eeef0667a9]


Responder

Gostei + 0

25/06/2005

Maxadens

O Marco... falta de atenção minha! :D
Mas valeus!


Responder

Gostei + 0

27/06/2005

Cabelo

Colegas..

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?


Responder

Gostei + 0

27/06/2005

Tnaires

Caro Cabelo,
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.


Responder

Gostei + 0

27/06/2005

Cabelo

Entendí, mas estou pior ainda..rsrsrs

Trabalho com CLX, nem VCL é..

Vou pesquisar um pouco, qualquer coisa posto aquí se encontrar algo..

Obrigado pela atenção de todos.


Responder

Gostei + 0

28/06/2005

Cabelo

Sobe.. :lol:

alguém?


Responder

Gostei + 0

28/06/2005

Marco Salles

Amigo cabelo, eu não to entendendo algums detalhes em sua ´pstagem
Se voce for mais puder me esclarecer melhor eu agradeço

O Problema é que este evento funciona como o evento keypress do edit..


Faz a verificação em todas as vezes que mexo no grid


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


Responder

Gostei + 0

29/06/2005

Cabelo

Marcos..

é 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?


Responder

Gostei + 0

29/06/2005

Marlon Spiess

Uma idéia, em vez de validar no seu grid, faça a validação no field dentro da table, no onValidate. Assim só passará pela rotina se vc modificar alguma informação do field.


Responder

Gostei + 0

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

Aceitar