Registering for-in enumerators

<< Click to Display Table of Contents >>

Navigation:  Using Delphi classes and functions >

Registering for-in enumerators

To use an object of some class in for-in statement it is necessary to register a class enumerator.

Class enumerator is a descendant of abstract THtScriptEnumerator class:

 

  THtScriptEnumerator = class
  public
    ///<summary> Create enumerator for Instance object</summary>
    constructor Create(const Instance: TObject); virtualabstract;
    ///<summary> Move to next item. Return false if end of list is reached </summary>
    function Next: boolean; virtualabstract;
    ///<summary> Get current item </summary>
    procedure GetCurrent(var Value: variant); virtualabstract;
  end;

 

Example of enumerator implementation:

 

constructor TStringListEnumerator.Create(const Instance: TObject);
begin
  fIndex := -1;
  fList := Instance as TStringList;
end;
 
procedure TStringListEnumerator.GetCurrent(var Value: variant);
begin
  Value := fList[fIndex]
end;
 
function TStringListEnumerator.Next: boolean;
begin
  inc(fIndex);
  Result := fIndex < fList.Count;
end;

 

Registering class enumerator:

 

  with HtScriptGlobal.RegisterClass('Create()', @TList.Create, TList) do
  begin
    EnumeratorClass := TListEnumerator;
  end;