Ver Mensaje Individual
  #1  
Antiguo 13-05-2010
Avatar de yapt
yapt yapt is offline
Miembro
 
Registrado: sep 2006
Ubicación: España
Posts: 258
Reputación: 18
yapt Va por buen camino
Asignar 'array property' con record.elemento

Bueno,

en primer lugar disculpas por el título. La verdad es que no sé ni como describirlo de una forma concreta.

Se trata de lo siguiente (adjunto código muy sencillo y completo que he preparado para la ocasión). Solo hay que crear un form y un botón y al compilar, veo un bonito:

E2064 Left side cannot be assigned to

El caso es que es una clase que tiene un field que es un record y, como tal, tiene elementos dentro del record.

La cuestión es cómo acceder, de forma directa, a los elementos DENTRO del propio record.

Bueno, creo que con el ejemplo se vé claramente. Y no puede ser muy dificil, porque hay muchos componentes que usan esto (aunque no con Records, sino con Sub-Clases).

Cualquier ayuda será bien recibida.

Gracias.



Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

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

  TPadre = class
  strict private
    FNumHijos:   byte;
    FHijos   :   array of TRecHijo;
    function  GetHijo(const Index: Integer): TRecHijo;
    procedure SetHijo(const Index: Integer; const Value: TRecHijo);
  published
    property HijosCount: Byte                             read FNumHijos;
  public
    constructor Create;
    destructor  Destroy; override;
    property Hijo[const Index: Integer]: TRecHijo read GetHijo  write SetHijo;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
  private
    Padre : TPadre;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Padre.Hijo[1].campo1 := 'Hola';  //<<<<----- Aqui falla.
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Padre := TPadre.Create;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Padre.Free;
end;

{ TPadre }

constructor TPadre.Create;
begin
  inherited;
  FNumHijos  := 10;
  SetLength(FHijos, FNumHijos);
end;

destructor TPadre.Destroy;
begin
  inherited;
end;

function TPadre.GetHijo(const Index: Integer): TRecHijo;
begin
  result := FHijos[index];
end;

procedure TPadre.SetHijo(const Index: Integer; const Value: TRecHijo);
begin
  FHijos[Index] := Value;
end;

end.

Última edición por yapt fecha: 13-05-2010 a las 14:38:17. Razón: Había olvidado poner el error.
Responder Con Cita