Classe itérateur

De Wiki1000
(Différences entre les versions)
Ligne 5 : Ligne 5 :
 
{|class="wikitable"
 
{|class="wikitable"
 
|-
 
|-
|[[Open (IscrEnumerator)|Open]]
+
|[[iteOpen (IscrEnumerator)|iteOpen]]
|procedure Open;
+
|procedure iteOpen;
 
|-
 
|-
|[[MoveNext (IscrEnumerator)|MoveNext]]
+
|[[iteMoveNext (IscrEnumerator)|iteMoveNext]]
|function MoveNext:boolean;
+
|function iteMoveNext:boolean;
 
|-
 
|-
|[[GetCurrent (IscrEnumerator)|GetCurrent]]
+
|[[iteGetCurrent (IscrEnumerator)|iteGetCurrent]]
|procedure GetCurrent(var Dest:variant);
+
|procedure iteGetCurrent(var Dest:variant);
 
|-
 
|-
|[[GetIndex (IscrEnumerator)|GetIndex]]
+
|[[iteGetIndex (IscrEnumerator)|iteGetIndex]]
|function GetIndex:Integer;
+
|function iteGetIndex:Integer;
 
|}
 
|}
  
Ligne 31 : Ligne 31 :
 
   fIndex: Integer;
 
   fIndex: Integer;
 
   //IscrEnumerator
 
   //IscrEnumerator
   procedure Open;
+
   procedure iteOpen;
   function MoveNext:boolean;
+
   function iteMoveNext:boolean;
   procedure GetCurrent(var Dest:variant);
+
   procedure iteGetCurrent(var Dest:variant);
   function GetIndex:Integer;
+
   function iteGetIndex:Integer;
 
   end;
 
   end;
  
procedure ProcessusB.Open;
+
procedure ProcessusB.iteOpen;
 
begin
 
begin
 
  fIndex := -1;
 
  fIndex := -1;
 
end;
 
end;
  
function ProcessusB.MoveNext:boolean;
+
function ProcessusB.iteMoveNext:boolean;
 
begin
 
begin
 
   if fIndex=-1 then
 
   if fIndex=-1 then
Ligne 56 : Ligne 56 :
 
end;
 
end;
  
procedure ProcessusB.GetCurrent(var Dest:variant);
+
procedure ProcessusB.iteGetCurrent(var Dest:variant);
 
begin
 
begin
 
   Dest := fCursor.Instance;
 
   Dest := fCursor.Instance;
 
end;
 
end;
  
function ProcessusB.GetIndex:Integer;
+
function ProcessusB.iteGetIndex:Integer;
 
begin
 
begin
 
   Result := fIndex;
 
   Result := fIndex;

Version du 10 février 2012 à 15:22

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;
Tip-20px.png Tip : Le support de l'interface est testé à l'exécution et pas à la compilation

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;




Whos here now:   Members 0   Guests 0   Bots & Crawlers 1
 
Outils personnels