yapt
13-05-2010, 14:37:03
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.
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.
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.
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.