Classe itérateur
De Wiki1000
(Différences entre les versions)
Ligne 6 : | Ligne 6 : | ||
|- | |- | ||
|[[Open (IscrEnumerator)|Open]] | |[[Open (IscrEnumerator)|Open]] | ||
− | |procedure Open | + | |procedure Open; |
|- | |- | ||
|[[MoveNext (IscrEnumerator)|MoveNext]] | |[[MoveNext (IscrEnumerator)|MoveNext]] | ||
Ligne 31 : | Ligne 31 : | ||
fIndex: Integer; | fIndex: Integer; | ||
//IscrEnumerator | //IscrEnumerator | ||
− | procedure Open | + | procedure Open; |
function MoveNext:boolean; | function MoveNext:boolean; | ||
procedure GetCurrent(var Dest:variant); | procedure GetCurrent(var Dest:variant); | ||
Ligne 37 : | Ligne 37 : | ||
end; | end; | ||
− | procedure ProcessusB.Open | + | procedure ProcessusB.Open; |
begin | begin | ||
fIndex := -1; | fIndex := -1; |
Version du 10 février 2012 à 10:41
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 :
Open | procedure Open; |
MoveNext | function MoveNext:boolean; |
GetCurrent | procedure GetCurrent(var Dest:variant); |
GetIndex | function GetIndex:Integer; |
Exemple:
Dans cet exemple la classe ProcessusB supporte l'interface itérateur :
Type ProcessusB = class fCursor : Cursor; fIndex: Integer; //IscrEnumerator procedure Open; function MoveNext:boolean; procedure GetCurrent(var Dest:variant); function GetIndex:Integer; end; procedure ProcessusB.Open; begin fIndex := -1; end; function ProcessusB.MoveNext: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.GetCurrent(var Dest:variant); begin Dest := fCursor.Instance; end; function ProcessusB.GetIndex: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;