Приветствую всех ! Пытаюсь реализовать классовую имитацию записи содержащей, содержащего простые элементы и массивы записей (уж не знаю как еще назвать то, что я делаю ). Т.е. запись:| Код | TCCD = record c, //Код судна(C1/1) cs: Word; //Код предприятия(C1) //... f: array of record x: Byte; //Режим промысла N: String; //Разрешение на промысел z, //Код района промысла(C3/1) c, //Код объекта лова(C3/2) o: Word; //Код судовладельца, чьи квоты осваивает судно w, //Улов за текущие сутки(C3/3) ws: Double; //Суммарный улов за период с начала года(C3/4) end; end;
|
пытаюсь реализовать в виде класса:| Код | //вылов объетов промысла TRCatch = record x: Byte; //Режим промысла N: String; //Разрешение на промысел z, //Код района промысла(C3/1) c, //Код объекта лова(C3/2) o: Word; //Код судовладельца, чьи квоты осваивает судно w, //Улов за текущие сутки(C3/3) ws: Double; //Суммарный улов за период с начала года(C3/4) end;
PRCatch = ^TRCatch;
TCatch = class private FArList: TList; FPRCatch: PRCatch; function GetElement(Index: integer): TRCatch; procedure SetElement(Index: integer; Value: TRCatch); public constructor Create; destructor Destroy; override; property Element[Index: integer]: TRCatch read GetElement write SetElement; default; end;
TTypeCCD = class public c, //Код судна(C1/1) cs: Word; //Код предприятия(C1) //...
//вылов f: TCatch;
constructor Create; destructor Destroy; override; end;
implementation
{ TCatch }
constructor TCatch.Create; begin FArList:=TList.Create; end;
destructor TCatch.Destroy; begin FreeAndNil(FArList); inherited; end;
function TCatch.GetElement(Index: integer): TRCatch; begin Assert((Index>=0) and (Index<FArList.Count), 'Выход за пределы массива !'); Result:=TRCatch(FArList[Index]^); end;
procedure TCatch.SetElement(Index: integer; Value: TRCatch); begin Assert((Index>=0) and (Index<=FArList.Count), 'Выход за пределы массива !'); New(FPRCatch); FPRCatch^:=Value; if (Index>=0) and (Index<FArList.Count) then FArList[Index]:=FPRCatch else FArList.Add(FPRCatch); end;
{ TTypeCCD }
constructor TTypeCCD.Create; begin f:=TCatch.Create; end;
destructor TTypeCCD.Destroy; begin FreeAndNil(f); inherited; end;
|
Проблема в том, что мне хотелось бы получить более полноценную имитацию записи, с возможностью присвоения полям вложенного в запись массива значений. Другими словами нужно реализовать следующее: | Код | var test :TCCD; begin SetLength(test.f, 1); test.f[0].x:=1; //<--функционал данной строки нужно повторить end;
|
, но пока не выходит: | Код | var test: TTypeCCD; begin test:=TTypeCCD.Create; test.f[1].x:=1; //<--получаем ошибку (Left side cannot be assigned to) end;
|
Возможно ли такое реализовать ? PS: вариант с присвоением записи целиком не предлагать: | Код | var test :TTypeCCD; c: TRCatch; begin c.x:=1; test:=TTypeCCD.Create; test.f[1]:=c; end;
|
|