1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
unit Main;
// Enumérer tous les objets d'une classe en utilisant la nouvelle syntaxe de for..in .
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Borland.Vcl.StdCtrls, System.ComponentModel;
type
TPeopleEnumerator = class; // Forward déclaration
// Objet manipulé
TPerson = class
Name: String;
DateOfBirth: TDateTime;
Gender : Char;
constructor Create (AName: String; ADateOfBirth: TDateTime; AGender: Char);
end;
// Liste d'objets, conteneur pour le type TPerson
TPeopleList = class
strict private
List : TList;
function GetCount: Integer;
function GetPerson(idx: Integer): TPerson;
procedure SetPerson(idx: Integer; const Value: TPerson);
public
Constructor Create;
function Add (Person: TPerson): Integer;
procedure Delete (idx: Integer);
property Person [idx: Integer] : TPerson read GetPerson write SetPerson; default;
property Count: Integer read GetCount;
//Méthode nécessaire pour la prise en charge de l'itération
Function GetEnumerator: TPeopleEnumerator;
end;
// Afin que la collection soit énumérable, elle doit implémenter une suite de méthodes
// comme indiqué ci dessous.
// Enumérateur pour la classe conteneur.
TPeopleEnumerator = class
strict private
CurrentPos: Integer;
PeopleList : TPeopleList;
public
constructor Create (AList : TPeopleList);
function GetCurrent: TPerson;
//Membre de classse nécessaire pour la prise en charge de l'itération
function MoveNext :Boolean; // Méthode publique
property Current : TPerson read GetCurrent; // Propriété en Read Only
end;
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Déclarations privées}
public
{ Déclarations publiques}
PeopleList : TPeopleList;
end;
var
Form1: TForm1;
implementation
{$R *.nfm}
{ TPerson ---------------------------------------------------------- }
constructor TPerson.Create (AName: String; ADateOfBirth: TDateTime; AGender: Char);
begin
Inherited Create;
Name:=AName;
DateOfBirth:=ADateOfBirth;
Gender:=AGender;
end;
{ TPeopleEnumerator ---------------------------------------------------}
constructor TPeopleEnumerator.Create(AList: TPeopleList);
begin
inherited Create;
PeopleList := AList;
CurrentPos := -1;
end;
function TPeopleEnumerator.GetCurrent: TPerson;
begin
Result := PeopleList[CurrentPos];
end;
function TPeopleEnumerator.MoveNext: Boolean;
begin
if CurrentPos < PeopleList.Count-1 then
begin
Inc(CurrentPos);
Result := True;
end
else
Result := False;
end;
{ TPeopleList --------------------------------------------------- }
function TPeopleList.GetCount: Integer;
begin
Result:=List.Count;
end;
function TPeopleList.GetPerson(idx: Integer): TPerson;
Begin
Result:=TPerson(List[idx]);
end;
procedure TPeopleList.SetPerson(idx: Integer; const Value: TPerson);
Begin
List[idx]:=Value;
end;
function TPeopleList.Add (Person: TPerson): Integer;
Begin
Result:=List.Add(TObject(Person));
end;
procedure TPeopleList.Delete (idx: Integer);
Begin
List.Delete(idx);
end;
function TPeopleList.GetEnumerator: TPeopleEnumerator;
begin
Result := TPeopleEnumerator.Create(Self);
end;
Constructor TPeopleList.Create;
begin
Inherited create;
List:=TList.Create;
end;
//Exemple d'énumération de la classe TPeopleList
Procedure TForm1.Button1Click(Sender: TObject);
var Person : TPerson; // Doit être une variable locale
begin
// Ajout d'élément
PeopleList.Add(TPerson.Create('Daniel',StrToDate('15/03/1973'),'M'));
PeopleList.Add(TPerson.Create('Monique',StrToDate('05/05/1973'),'F'));
// Itération sur la classe
for Person in PeopleList do
ListBox1.Items.Add(Person.Name);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
PeopleList:= TPeopleList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
PeopleList.Free;
end;
end. |
Partager