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.