Classe itérateur
Une classe métier peut être utilisée comme itérateur dans une instruction ForEach à condition de supporter une interface technique d'itération.
Cette interface est définie par les quatre méthodes suivantes :
| iteOpen | procedure iteOpen; |
| iteMoveNext | function iteMoveNext:boolean; |
| iteGetCurrent | procedure iteGetCurrent(var Dest:variant); |
| iteGetIndex | function iteGetIndex:Integer; |
Exemple:
Dans cet exemple la classe ProcessusB supporte l'interface itérateur :
Type
ProcessusB = class
fCursor : Cursor;
fIndex: Integer;
//IscrEnumerator
procedure iteOpen;
function iteMoveNext:boolean;
procedure iteGetCurrent(var Dest:variant);
function iteGetIndex:Integer;
end;
procedure ProcessusB.iteOpen;
begin
fIndex := -1;
end;
function ProcessusB.iteMoveNext:boolean;
begin
if fIndex=-1 then
begin
fCursor.ClassName := 'ClassC';
fCursor.Open;
end
else fCursor.Next;
Result := not fCursor.Eoi;
if not Result
then fCursor.Close
else fIndex := fIndex+1;
end;
procedure ProcessusB.iteGetCurrent(var Dest:variant);
begin
Dest := fCursor.Instance;
end;
function ProcessusB.iteGetIndex:Integer;
begin
Result := fIndex;
end;
Ce processus est utilisé par un autre processus comme itérateur :
Type
ProcessusA = class
procedure doProcess(inst:ClassC);
function TestForEach:Integer;
end;
procedure ProcessusA.doProcess(inst:ClassC);
begin
withP transaction do
begin
inst.unEntierC := inst.unEntierC+1;
end;
end;
function ProcessusA.TestForEach:Integer;
var iterator:ProcessusB; inst:ClassC; count:Integer;
begin
iterator := ProcessusB.Create;
foreach inst in iterator index count do
begin
doProcess(inst);
end;
Result := 1+count;
end;