Jak napisać property write w klasie generycznej

0
unit Unit1;
interface

type
  TMyArray<TValue> = class
  private
    FArray        : array of TValue; 
    function  Get( AIndex: integer ): TValue;
  public
    property    Items[Index:integer]: TValue read Get ; default;   
  end;

implementation

function  TMyArray<TValue>.Get( AIndex: integer ): TValue;
begin
  result := Item(AIndex);
end;

-------------------------------------------------------------------------

unit Unit2;
interface
uses
  Unit1;
type
  TDane = record
    number   : integer;
    text        : string;
    condition : boolean;
  end;

var
  dane : TMyArray<TDane>;

implementation

dane := TMyArray<TDane>.Create;
{ wczytanie danych do dane }

jak napisać property write i settera żeby możliwe było w ww klasie wykonanie:

dane[i].number := 1;

Edited:
używam delphi XE2

0
procedure TMyArray<TValue>.Set(AIndex: integer; const AValue: TValue);

Nie wystarczy?

0

wtedy wywołanie:

 dane[i].number := 1;

wywali :

  "Left side cannot be assigned"

musiał bym robić coś takiego

var
   tmp : TDane;
begin
  tmp := dane[i] ;
  tmp.number := 1;
  dane[i] := tmp;
end;
0

No ale zmieniłeś property na property Items[Index:integer]: TValue read Get write Set; default, tak?

0

dokładnie tak. Tylko użyłem nazwy Setter bo set jest keywordem.

Edited:
Słyszałem, że starsze wersje delphi wywalały tylko warrninga i można była kozystać z takiego zapisu.

0

kilka przemyśleń na temat. Może kogoś natchnie.

  1. Gdyby nie był to typ generyczny to można było by zrobić oddzielne property do każdego pola rekordu.
    Ale jest generyczny więc wewnątrz klasy nie mam pojęcia jakie pola będzie miał rekord, czy w ogóle rekordem będzie.

  2. Użyć RTTI, ( chyba tak się powinno dać )

      procedure setPropertyRecordField( ANazwaPola: String; AWartosc: Variant);

uzywając RTTI ustawić dane pole wewnątrz klasy.

  1. W metodzie Get zwracać wskaźnik na TValue.

  2. Jeśli nie ma możliwości zrobienia tego wprost:

Patryk27 napisał(a):
procedure TMyArray<TValue>.Set(AIndex: integer; const AValue: TValue);

to może ja wcale nie powinienem chcieć tego robić. I tylko mojemu niedouczonemu umysłowi wydaje się, ze tego chce.
A tak naprawdę powinno się to zrobić w ogóle innym mechanizmem.

1

Nikt Ci nic nie pisze, to może ja.

m_Lesiu napisał(a):

Słyszałem, że starsze wersje delphi wywalały tylko warrninga i można była kozystać z takiego zapisu.

Zabieg taki nie jest możliwy (przynajmniej w znanych mi "starszych wersjach"). Nawet gdy nie chodzi o klasę generyczną (w "starszych wersjach" takich klas nie było :-)) mającą property typu record w wyniku takiego kodowania mamy komunikat Left side cannot be assigned to.

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