Tablica rekordów jako właściwość klasy

0

Tym razem to ja potrzebuję pomocy...

Dany mamy rekord:

TR = record
  PoleX: TTypX;    //jakiś typ prosty
  PoleY: TTypY;    //      j.w.
  (...)  
end;

oraz klasę:

TKlasa = class
  private
    FRecs: Array of TR;
    procedure SetRec(Index: Integer; R: TR);
    function GetRec(Index: Integer): TR;
  public
    property Recs[Index: Integer]: TR read GetRec write SetRec;
    (...)
end;

function TKlasa.GetRec(Index: Integer): TR;
begin
  Result:= FRecs[Index];
end;

procedure TKlasa.SetRec(Index: Integer; R: TR);
begin
  // tutaj coś
end;

Dostęp do właściwości ma się odbywać przez metody SetRec i GetRec. O ile odczyt w dowolnym miejscu kodu nie sprawia problemów:

Pole:= Klasa.Recs[K].PoleX;

tak siedzę i nie mogę wymyśleć jak ma wyglądać metoda do zapisu, aby można było przypisać dane do rekordu poprzez

Klasa.Recs[K].PoleX:= Pole;

Z pewnych względów nie chcę mieszać w to wskaźników ani klas, bo albo skomplikuje się kod, który i tak dojeżdża powoli do granicy przejrzystości (a nie mam czasu na przepisanie od nowa po raz n-ty), albo wzrośnie zupełnie niepotrzebnie zużycie pamięci (dziedziczenie po TObject).
Zwykle do zapisu właściwości typu tablicowego (tablica Integerów, Stringów czy czegoś równie prostego) wystarcza

 
procedure TKlasa.SetProp(Index: Integer; Prop: TProp);   // TProp = Integer albo coś
begin
  FProp[Index]:= Prop;
end;

Dla tablicy rekordów to nie wystarcza (błąd "Left side cannot be assigned to"). O ile to możliwe chciałbym również uniknąć tworzenia oddzielnych właściwości (tablic) dla każdego pola rekordu (niezbyt to eleganckie, a i linijek kodu przybywa), choć aktualnie wydaje się to najrozsądniejszy pomysł...

Czy ktoś z szanownych forumowiczów ma jakąś sugestię? Podobny problem był już poruszany, ale nie doczekał się jasnego rozwiązania.

0
procedure TKlasa.SetRec(Index: Integer; R: TR);
begin
  FRecs[Index].PoleX := R.PoleX;
  FRecs[Index].PoleY := R.PoleY;
end;

powinno być ok

0

Niestety. Podczas kompilacji pojawia się wspomniany błąd, przy próbie przypisania wartości:

Klasa.Recs[K].PoleX:= Pole;

Co ciekawe, pomoc Delphi wydaje się milczeć o stosowaniu rekordów (pojedynczych) jako właściwości klas i metodach dostępu do nich (gdzieś wynalazłem, że do każdego pola rekordu trzeba oddzielną właściwość), a co dopiero całych tablic...

0

ano fakt - mus zamienić rekord na klasę

0

Tutaj wystarczy wykonać mały manewr "w celu zmylenia przeciwnika":

procedure TKlasa.SetRec(Index: Integer;const R: TR);
begin
  FRecs[Index]:=R;
end;
var
  Rekord:TR;
  Klasa:TKlasa;
  Index:Integer;
begin
  jakiś kod...
  Index:=JakisInteger;
  Rekord.PoleX:=CosTam;
  Rekord.PoleY:=CosTam;
  Klasa.Recs[Index]:=Rekord;
  jakiś kod...
end;
0

hmmmm, no tak. Na to nie wpadłem...
Trochę kombinowane, ale jak dla mnie to wystarcza. Grunt, że działa.
Dzięki wielkie!

1 użytkowników online, w tym zalogowanych: 0, gości: 1