TFields em run time

 

Apenas um exemplo de código de como manipular TFields em run time.

  • Criar TFields sem utilizar TDataSet.FieldDefs
  • Clonar Fields
  • TDataSetField: Manipular TFields aninhados
procedure TFormDBUtils.ButtonCreateFieldsClick(Sender: TObject);
  function CreateField(DataSet: TDataSet; FieldClass: TFieldClass;
    const FieldName: string = ''): TField;
  begin
    Result:= FieldClass.Create(DataSet);
    Result.FieldName:= FieldName;
    if Result.FieldName = '' then
      Result.FieldName:= 'Field' + IntToStr(DataSet.FieldCount +1);
    Result.FieldKind := fkData;
    Result.DataSet:= DataSet;
    Result.Name:= DataSet.Name + Result.FieldName;
    if Result is TStringField then
      Result.Size:= 10; // apenas lembrar de definir TField.Size
  end;

  procedure CreateFields(DataSet: TDataSet; FieldClass:
    TFieldClass; Count: Integer);
  var
    I: Integer;
  begin
    for I := 1 to Count do
      CreateField(DataSet, FieldClass);
  end;

  procedure CloneFields(DS1, DS2: TDataSet);
  var
    I: Integer;
    F: TField;
  begin
    for I := 0 to DS1.FieldCount - 1 do
    begin
      F:= CreateField(DS2, TFieldClass(DS1.Fields[I].ClassType),
        DS1.Fields[I].FieldName);
      F.Size:= DS1.Fields[I].Size;
      if DS1.Fields[I] is TDataSetField then
        CloneFields(TDataSetField(DS1.Fields[I]).NestedDataSet,
          TDataSetField(DS2.Fields[I]).NestedDataSet);
    end;
  end;

var
  DS1, DS2: TClientDataSet;
  DSField: TDataSetField;
begin
  DS1:= TClientDataSet.Create(Self);
  CreateFields(DS1, TStringField, 10);
  DSField:= TDataSetField(CreateField(DS1, TDataSetField));
  CreateFields(DSField.NestedDataSet, TStringField, 5);

  // clone
  DS2:= TClientDataSet.Create(Self);
  CloneFields(DS1, DS2);

  DS1.CreateDataSet;
  DS2.CreateDataSet;
end;
 
 
 

0 Comments

 

You can be the first one to leave a comment.

 

Leave a Comment

 




XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>