Ver Mensaje Individual
  #2  
Antiguo 13-05-2010
Avatar de Lord Delfos
Lord Delfos Lord Delfos is offline
Miembro
 
Registrado: ene 2008
Ubicación: Tandil, Argentina
Posts: 558
Reputación: 17
Lord Delfos Va por buen camino
Ah... Es que los registros son medio HDP...

Verás, cuando uno llama a la propiedad izquierdo, Delphi va a llamar al GetHijo ¿Verdad? Bueno, pero GetHijo es una función, y la función devuelve una copia del registro original. Y esa copia es, por defecto, de sólo lectura. Ahí está el problema.

Si uno hace algo así:

Código Delphi [-]

type
  TRec = record
     campo1: string;
     campo2: Boolean;
  end;

  type PRec = ^TRec; // <---------------------------

  type TAlgo = class
    private
      FDatos: array of TRec;
      function GetDato(const Indice: Integer): PRec;
      procedure SetDato(const Indice: Integer; const Valor: PRec);
    public
      property Datos[const Indice: Integer]: PRec read GetDato write SetDato;
    end;

function TAlgo.GetDato(const Indice: Integer): PRec;
begin
  Result:= @FDatos[Indice];
end;

procedure TAlgo.SetDato(const Indice: Integer; const Valor: PRec);
begin
  FDatos[Indice]:= Valor^;
end;

MiObjeto.Datos[3].Campo1:= 'Hola'; // <--- funciona

Esto funciona, pero ¿porqué? Bueno, porque ahora estás devolviendo un puntero al original, y como la dereferencia en los registros (el ^) es automática, pues termina andando sin que tengas que agregar el ^ al hacer la asignación.

¿Se entiende lo que digo? Espero que sí, sino pues... que te ayude otro. Digo, volvé a preguntar y trato de explicarlo mejor.

Saludongos.
Responder Con Cita