Hola:
Creo que para lo que pretendes hacer, no es buena idea heredar nuevas clases puesto que esos objetos TField te los crea Delphi por defecto y por muchos
casts que hagas a tus clases definidas, las propiedades que hay son las que hay.
Puedes utilizar la propiedad
tag que te comenta Román de dos formas para lo que pretendes. En primer lugar te defines un tipo
record que almacenará las variables (aquí no le llamo propiedades) que quieres asociar a cada TField. Luego te propongo dos ideas:
1) Defines un tipo puntero que apunte a dicho record, y aprovechas la propiedad tag, que es de tipo integer y ocupa 4 bytes, lo mismo que cualquier puntero, para almacenar una referencia a dicho puntero (haciendo un moldeado de tipo de
Integer a Pointer para que el compilador dé su visto bueno). De hechjo, es una de las funcionalidades que se indican en la ayuda de Delphi para la propiedad
tag:
Código:
PInfoField = ^TInfoField;
TInfoField = record
EnGrid : Boolean;
EnVerde : Boolean;
NumColumna : Integer;
...
end;
// Para asociar esa información a un objeto TField
procedure AsiociaInfo (AField: TField; EG, EV: Boolean; NC: Integer);
var
PInfo : PInfoField;
begin
GetMem (PInfo, SizeOf(TInfoField));
PInfo^.EnGrid := EG;
PInfo^.EnVerde := EV;
PInfo^.NumColumna := NC;
...
AField.Tag := Integer(PInfo);
end;
procedure MuestraDatos (AField: TField);
var
P : PInfoField;
begin
P := PInfoField(AField.Tag);
if P.EnGrid then ShowMessage ('Engrid');
if P.EnVerde then ShowMessage ('EnVerde');
ShowMessage (IntToStr(P.NumColumna));
end;
// Acordarse de liberar memoria de estos registros al cerrar aplicación
procedure LiberarMemoriaFields;
var
j : Integer;
P : PInfoField;
begin
for j:=0 to DataSet.FieldCount - 1 do
// esta es una manera algo burda de comprobar que hay Info asociada
if DataSet.Fields[j].Tag <> 0 then
begin
P := PInfoField(DataSet.Fields[j].Tag);
FreeMem (P, SizeOf(TInfoField));
end;
end;
2) Otra forma de hacer todo esto sería, usando el mismo tipo record que antes, crear un
array dinámico que almacene todas las infos, y la propiedad tag indicaría el índice a la info correspondiente en dicho array, de esta forma te ahorras trabajar con punteros y cuando terminas con todo es Delphi mismo quien se ocupa de liberar el array, no tienes que hacerlo tú a mano. Aquí te pongo el código:
Código:
TInfoField = record
EnGrid : Boolean;
EnVerde : Boolean;
NumColumna : Integer;
...
end;
var
ListInfo : Array of TInfoField;
// Para asociar esa información a un objeto TField
procedure AsiociaInfo (AField: TField; EG, EV: Boolean; NC: Integer);
begin
SetLength (ListInfo, Length(ListInfo) + 1);
with ListInfo[High(ListInfo)] do
begin
EnGrid := EG;
EnVerde := EV;
NumColumna := NC;
...
end;
AField.Tag := High(ListInfo);
end;
procedure MuestraDatos (AField: TField);
var
P : TInfoField;
begin
P := ListInfo[AField.Tag];
if P.EnGrid then ShowMessage ('Engrid');
if P.EnVerde then ShowMessage ('EnVerde');
ShowMessage (IntToStr(P.NumColumna));
end;
En esta segunda opción hay que tener en cuenta que todos los tags valen por defecto 0, que equivaldría al primer elemento de la lista.
Suerte