Field - campos calculado em runtime

Top  Previous  Next

Criando campos calculados em RunTime

====================================

 

Este exemplo é completo.

Cria 3 tipos de campos calculados: Integer, String e DateTime, os campos codigo e nome 

são da tabela mesmo. Quando o usuário pressiona o botão Button1 o programa faz um novo

select e cria os campos calculados. funcionou bem em Delphi5

--------------------------------------------------------------------------------------

var

  fCampo  : TStringField;

  fNome   : TStringField;

  fCodigo : TFloatField;

  fFloat  : TFloatField;

  fData   : TDateField;  

 

implementation

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  Query.Select('codigo, nome from funcionarios');

  Query.Active := False;

  // Campo nome

  fNome := TStringField.Create(Self);

  fNome.FieldName    := 'nome';

  fNome.FieldKind    := fkData;

  fNome.Size         := 30;

  fNome.DisplayWidth := 30;

  fNome.DataSet      := Query;

  // Campo Código

  fCodigo := TFloatField.Create(Self);

  fCodigo.FieldName    := 'codigo';

  fCodigo.FieldKind    := fkData;

  fCodigo.DisplayWidth := 10;

  fCodigo.DataSet      := Query;

  // Campo Calculado

  fCampo              := TStringField.Create(Self);

  fCampo.FieldName    := 'Inicial';

  fCampo.FieldKind    := fkCalculated;

  fCampo.Alignment    := taCenter;

  fCampo.Size         := 1;

  fCampo.DisplayWidth := 1;

  fCampo.DataSet      := Query;

  // Campo Calculado

  fFloat              := TFloatField.Create(Self);

  fFloat.FieldName    := 'Mult';

  fFloat.FieldKind    := fkCalculated;

  fFloat.Alignment    := taCenter;

  fFloat.DisplayWidth := 10;

  fFloat.DataSet      := Query;

  // Campo Calculado

  fData               := TDateField.Create(Self);

  fData.FieldName    := 'Data';

  fData.FieldKind    := fkCalculated;

  fData.Alignment    := taCenter;

  fData.DisplayWidth := 10;

  fData.DataSet      := Query;

 

  // Ativa a Query...

  Query.Active       := True;

 

  // Cria as colunas (OPCIONAL) usado para criar os titles.

  with Grid.Columns do

  begin

    Items[0].Title.Caption := 'Cód.';

    Items[1].Title.Caption := 'Nome';

    Items[2].Title.Caption := 'Letra Inicial';

    Items[3].Title.Caption := '2x Cód.';

    Items[4].Title.Caption := 'Data';

  end;

end;

 

procedure TForm1.FormDestroy(Sender: TObject);

begin

  // Se o campo foi criado tira-o da memória

  if Assigned(fCampo)  then fCampo.Free;

  if Assigned(fNome)   then fNome.Free;

  if Assigned(fCodigo) then fCodigo.Free;

end;

 

procedure TForm1.QueryCalcFields(DataSet: TDataSet); // <------ Preste atenção para criar este evento!!

begin

  Query.FieldByName('Inicial').asString := Copy(Query.Campo('nome'),1,1);

  Query.FieldByName('mult').asFloat     := Query.GetInteger('codigo') * 2;

  Query.FieldByName('data').asDateTime  := Now;

end;

 

procedure TForm1.FormShow(Sender: TObject);

begin

  Query.Select('codigo,nome from funcion');

  with Grid.Columns do

  begin

    Items[0].Title.Caption := 'Cód.';

    Items[1].Title.Caption := 'Nome';

  end;

end;