Classe itérateur
De Wiki1000
(Différences entre les versions)
m (Remplacement du texte — « category:Tahoe » par « Category:Version650 ») |
|||
(3 révisions intermédiaires par un utilisateur sont masquées) | |||
Ligne 5 : | Ligne 5 : | ||
{|class="wikitable" | {|class="wikitable" | ||
|- | |- | ||
− | |[[ | + | |[[iteOpen (IscrEnumerator)|iteOpen]] |
− | |procedure | + | |procedure iteOpen; |
|- | |- | ||
− | |[[ | + | |[[iteMoveNext (IscrEnumerator)|iteMoveNext]] |
− | |function | + | |function iteMoveNext:boolean; |
|- | |- | ||
− | |[[ | + | |[[iteGetCurrent (IscrEnumerator)|iteGetCurrent]] |
− | |procedure | + | |procedure iteGetCurrent(var Dest:variant); |
|- | |- | ||
− | |[[ | + | |[[iteGetIndex (IscrEnumerator)|iteGetIndex]] |
− | |function | + | |function iteGetIndex:Integer; |
|} | |} | ||
Ligne 31 : | Ligne 31 : | ||
fIndex: Integer; | fIndex: Integer; | ||
//IscrEnumerator | //IscrEnumerator | ||
− | procedure | + | procedure iteOpen; |
− | function | + | function iteMoveNext:boolean; |
− | procedure | + | procedure iteGetCurrent(var Dest:variant); |
− | function | + | function iteGetIndex:Integer; |
end; | end; | ||
− | procedure ProcessusB. | + | procedure ProcessusB.iteOpen; |
begin | begin | ||
fIndex := -1; | fIndex := -1; | ||
end; | end; | ||
− | function ProcessusB. | + | function ProcessusB.iteMoveNext:boolean; |
begin | begin | ||
if fIndex=-1 then | if fIndex=-1 then | ||
Ligne 56 : | Ligne 56 : | ||
end; | end; | ||
− | procedure ProcessusB. | + | procedure ProcessusB.iteGetCurrent(var Dest:variant); |
begin | begin | ||
Dest := fCursor.Instance; | Dest := fCursor.Instance; | ||
end; | end; | ||
− | function ProcessusB. | + | function ProcessusB.iteGetIndex:Integer; |
begin | begin | ||
Result := fIndex; | Result := fIndex; | ||
Ligne 95 : | Ligne 95 : | ||
end; | end; | ||
</source> | </source> | ||
− | |||
[[category:Objets itérateurs]] | [[category:Objets itérateurs]] | ||
− | [[category: | + | [[category:Interface itération]] |
+ | [[Category:Version650]] |
Version actuelle en date du 9 avril 2013 à 10: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 :
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;