[Delphi] Criando campos dinâmicos
2010
Bom dia meu povo.
Dia desses precisei criar dinamicamente algumas colunas em um TClientDataset. Normalmente um uso a propriedade FieldDefs por ser mais fácil de manipular e evitar problemas de MemoryLeaks. Mas nesse caso específico eu precisava dos campos como novos objetos, portanto tinham de herdar diretamente de TField. Assim, após algum trabalho, cheguei no resultado abaixo.
procedure CriaField_Integer(cFieldName: String; cDisplayLabel: String; fFieldKind: TFieldKind; nDisplayWidth: Integer; var ds: TClientDataSet; lVisible: Boolean);
begin
with TIntegerField.Create(Self) do
begin
FieldName := cFieldName;
Name := ds.Name + UpperCase(FieldName);
FieldKind := fFieldKind;
Size := 0;
DisplayLabel := cDisplayLabel;
DisplayWidth := nDisplayWidth;
Visible := lVisible;
DataSet := ds;
end;
end;
procedure CriaField_Boolean(cFieldName: String; cDisplayLabel: String; fFieldKind: TFieldKind; nDisplayWidth: Integer; var ds: TClientDataSet; lVisible: Boolean);
begin
with TBooleanField.Create(Self) do
begin
FieldName := cFieldName;
Name := ds.Name + UpperCase(FieldName);
FieldKind := fFieldKind;
DisplayLabel := cDisplayLabel;
DisplayWidth := nDisplayWidth;
Visible := lVisible;
DataSet := ds;
end;
end;
procedure CriaField_DateTime(cFieldName, cDisplayLabel: String; fFieldKind: TFieldKind; nDisplayWidth: Integer; var ds: TClientDataSet; lVisible: Boolean);
begin
with TDateTimeField.Create(Self) do
begin
FieldName := cFieldName;
Name := ds.Name + UpperCase(FieldName);
FieldKind := fFieldKind;
Size := 0;
DisplayLabel := cDisplayLabel;
DisplayWidth := nDisplayWidth;
Visible := lVisible;
DataSet := ds;
end;
end;
procedure CriaField_Float(cFieldName: String; cDisplayLabel: String; fFieldKind: TFieldKind; nPrecision, nDisplayWidth: Integer; cDisplayFormat: String; var ds: TClientDataSet; lVisible: Boolean);
begin
with TFloatField.Create(Self) do
begin
FieldName := cFieldName;
Name := ds.Name + UpperCase(FieldName);
FieldKind := fFieldKind;
Size := 0;
Precision := nPrecision;
DisplayLabel := cDisplayLabel;
DisplayWidth := nDisplayWidth;
DisplayFormat := cDisplayFormat;
Visible := lVisible;
DataSet := ds;
end;
end;
Como por aqui não tem muita orientação à objetos, não fiz muita firula, quem sabe eu dou uma melhorada nesse código outro dia, ou vocês mesmos o fazem.


Comment