On 30.11.2016 12:36, Ryan Joseph wrote:
> 
> 
>> On Nov 30, 2016, at 6:24 PM, Graeme Geldenhuys 
>> <mailingli...@geldenhuys.co.uk> wrote:
>>
>> What would you iterate/enumerate in that?  I can understand iterating an
>> "array of TMyRec", but not TMyRec itself.
> 
> I have a dynamic array inside a record. I’m using a record instead of a class 
> because I want it to be stored on the stack. It’s trivial to just enumerate 
> the array inside the record but I wanted to try the more elegant solution of  
> making an enumerator for the record.

I've attached an example that shows how this *can* be done (it's not the
only way to do this however).

Regards,
Sven

program trecenum;

{$mode objfpc}

type
  TLongIntArray = array of LongInt;

  TRec = record
    arr: TLongIntArray;
  end;

  TRecEnumerator = object
  private
    fArr: TLongIntArray;
    fIndex: Integer;
    function GetCurrent: LongInt;
  public
    constructor Create(aArr: TLongIntArray);
    function MoveNext: Boolean;
    property Current: LongInt read GetCurrent;
  end;

constructor TRecEnumerator.Create(aArr: TLongIntArray);
begin
  fArr := aArr;
  fIndex := -1;
end;

function TRecEnumerator.GetCurrent: LongInt;
begin
  Result := fArr[fIndex];
end;

function TRecEnumerator.MoveNext: Boolean;
begin
  Inc(fIndex);
  Result := fIndex < Length(fArr);
end;

operator enumerator(r: TRec): TRecEnumerator;
begin
  Result.Create(r.arr);
end;

var
  r: TRec;
  i: LongInt;
begin
  r.arr := TLongIntArray.Create(42, 53, 96, 29);

  for i in r do
    Writeln(i);
end.
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to