Ver Mensaje Individual
  #10  
Antiguo 01-10-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Reputación: 22
andres1569 Va por buen camino
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
__________________
Guía de Estilo

Última edición por andres1569 fecha: 01-10-2003 a las 17:02:21.
Responder Con Cita