« Classe itérateur » : différence entre les versions
Aucun résumé des modifications |
m (Remplacement du texte — « category:Tahoe » par « Category:Version650 ») |
||
| (Une version intermédiaire par le même utilisateur non affichée) | |||
| Ligne 95 : | Ligne 95 : | ||
end; | end; | ||
</source> | </source> | ||
[[category:Objets itérateurs]] | [[category:Objets itérateurs]] | ||
[[category: | [[category:Interface itération]] | ||
[[Category:Version650]] | |||
Dernière version du 9 avril 2013 à 09:19
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 :
<source lang="delphi">
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; </source>
Ce processus est utilisé par un autre processus comme itérateur :
<source lang="delphi"> 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; </source>