procedimento em dbedit

Delphi

23/08/2006

tenho um programa onde o dbedit está vinculado em um clientdataset com campo do tipo inteiro. Estou usando os recursos do clientdataset (ongettext e onsettext) para manipular os dados. Na verdade estou convertendo esse campo inteiro para horas para visualização. Então o usuario digita horas e o clientdataset grava em inteiros. O problema é que eu preciso que o dbedit tenha uma máscara com os dois pontos da hora (ex: 180:00), mas como na verdade ele é um tipo inteiro ele não aceita nada a não ser numeros. Alguem tem alguma sugestão para que esse dbedit já fique pré-formatado no formato de horas?


Roberto Rossi

Roberto Rossi

Curtidas 0

Respostas

Micheus

Micheus

23/08/2006

mas como na verdade ele é um tipo inteiro ele não aceita nada a não ser numeros
Para setar os caracteres que são aceitos no campo basta no evento OnShow (p.e.) vc definir quais os caracteres válidos para o mesmo. Assim, para um TIntegerField aceitar que vc digite os ´[i:2a2bbc6909]:[/i:2a2bbc6909]´ e não aceite mais os ´[i:2a2bbc6909].[/i:2a2bbc6909]´, ´[i:2a2bbc6909],[/i:2a2bbc6909]´, ´[i:2a2bbc6909]+[/i:2a2bbc6909]´ e ´[i:2a2bbc6909]-[/i:2a2bbc6909]´ coloque assim:
Ex. 1)
Table1Hora.ValidChars := Table1Hora.ValidChars + [´:´] - [´,´, ´.´, ´-´, ´+´];
ou, simplesmente substituir tudo
Ex. 2)
Table1Hora.ValidChars := [´0´..´9´, ´:´];
Isto levando em conta que vc está interpretando corretamente o texto digitado através do evento SetText do campo, pois haveria erro na conversão de dados quando o texto fosse transferido para o campo efetivamente.


O problema é que eu preciso que o dbedit tenha uma máscara com os dois pontos da hora (ex: 180:00), ... . Alguem tem alguma sugestão para que esse dbedit já fique pré-formatado no formato de horas?
Se é boa eu não sei, mas pelo que testei deve funcionar. No exemplo, utilizei:
- Um MaskEdit, com máscara ´!999:00;1;´ para digitação da hora formatada;
- Um DataSource ligado a tabela que contém o campo, para manipular o MaskEdit como se fosse um DBEdit;
- Os eventos GetText e SetText do campo Hora (TIntegerField);
// sempre que for movida/posicionada uma linha na tabela,
// o MaskEdit é atualizado com o valor do campo da linha atual
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: Field);
begin
  MaskEdit1.Text := Table1Hora.DisplayText;
end;

// ao sair do MaskEdit, se a tabela estiver em modo edição/inserção
// atualizamos o valor do campo com o conteúdo digitado.
// Obs.: se quizer, poderá por a tabela em edição caso não esteja
procedure TForm1.MaskEdit2Exit(Sender: TObject);
begin
  if Table1.State in [dsInsert, dsEdit] then
    Table1HoraSetText(Table1Hora, MaskEdit1.Text);
end;

// Converte a hora armazenada no inteiro para o formato string
// a ser utilizado para mostrar o valor do campo.
// Obs.: Aqui eu considerei apenas o valor inteiro como sendo
// o valor da hora inteira. Talvez não seja seu caso
procedure TForm1.Table1HoraGetText(Sender: TField; var Text: String; DisplayText: Boolean);
begin
  if not Sender.IsNull then
    Text := Sender.AsString +´:00´
end;

// Converte o texto digitado de forma obtermos novamente um
// inteiro a ser atribuído ao campo da tabela.
// Obs.: para facilitar utilizei a função StrToIntDef.
procedure TForm1.Table1HoraSetText(Sender: TField; const Text: String);
var
  PosPonto :integer;
begin
  PosPonto := Pos(´:´, Text);
  if PosPonto > 0 then
    Sender.Value := StrToIntDef(Copy(Text, 1, PosPonto-1), 0)
  else
    Sender.Value := StrToIntDef(Text, 0);
end;


Espero que ajude.
[]s


GOSTEI 0
POSTAR