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 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
| interface
uses
Classes, RTLConsts;
type
TSubElement = class;
TMainElement = class;
TItemsEnumerator = class;
TKindSubElement = (se_Piece1, se_Piece2,.......); {Ajouter tous les sorte d sous éléments}
TComonParams = class(TObject)
private
FCoef: Double;
function GetCoef: double;
procedure SetCoef(const Value: double);
public
property Coef: double read GetCoef write SetCoef;
{Definir toutes les propriétés communes à elt Principal et sous-élément}
end;
TSubElement = class(TObject)
private
FComonParams: TComonParams;
FKind: TKindSubElement;
function GetComonParams: TComonParams;
procedure SetComonParams(const Value: TComonParams);
public
constructor Create;
destructor Destroy; override;
property ComonParams: TComonParams read GetComonParams write SetComonParams;
property Kind: TKindSubElement read FKind write FKind;
{Ajouter les propriétés spécifiques à un subElement...}
end;
{Se poser la question : Savoir si les "subElements" }
{Pour gérer la liste des subElements càd MainElemnt (élément principal)}
TMainElement = class(TStringList)
private
FComonParams: TComonParams;
function GetComonParams: TComonParams;
procedure SetComonParams(const Value: TComonParams);
function GetSubElement(Index: Integer): TSubElement;
protected
public
destructor Destroy; override;
property ComonParams: TComonParams read GetComonParams write SetComonParams;
constructor Create;
{Ajouter les propriétés spécifiques à un MainElement}
procedure Clear; override;
procedure Delete(Index: Integer); override;
function Add(const ListLabel: string; const AObject: TObject):Integer; overload;
{Pour l'itérateur}
function GetItemsEnumerator: TItemsEnumerator;
procedure ForEachSubElement(Method: TNotifyEvent);
procedure Execute(Method: TNotifyEvent);
{Décrire les méthodes qui seront utilisées par l'itérateur}
procedure Traitement1(Sender: TObject);
{Décrire les méthodes ...}
{Une propriété tableau pour accéder à un subElement sans avoir besoin de le caster}
property SubElement[Index: Integer]: TSubElement read GetSubElement;
end;
{Pour l'itérateur}
TItemsEnumerator = class
private
FIndex: Integer;
FStrings: TStrings;
public
constructor Create(AStrings: TStrings);
function GetCurrent: TObject;
function MoveNext: Boolean;
property Current: TObject read GetCurrent;
end;
implementation
{ TComonParams }
function TComonParams.GetCoef: double;
begin
Result := FCoef;
end;
procedure TComonParams.SetCoef(const Value: double);
begin
FCoef := Value;
end;
{ TSubElement }
function TSubElement.GetComonParams: TComonParams;
begin
Result := FComonParams;
end;
procedure TSubElement.SetComonParams(const Value: TComonParams);
begin
FComonParams := Value;
end;
constructor TSubElement.Create;
begin
Inherited Create;
FComonParams := TComonParams.Create;
end;
destructor TSubElement.Destroy;
begin
FComonParams.Free;
inherited;
end;
{ TMainElement }
function TMainElement.GetComonParams: TComonParams;
begin
Result := FComonParams;
end;
procedure TMainElement.SetComonParams(const Value: TComonParams);
begin
FComonParams := Value;
end;
constructor TMainElement.Create;
begin
Inherited Create;
FComonParams := TComonParams.Create;
end;
destructor TMainElement.Destroy;
begin
Clear;
inherited;
end;
procedure TMainElement.Delete(Index: Integer);
begin
if (Index < 0) or (Index >= Count) then Error(@SListIndexError, Index);
if Assigned(Objects[Index]) then Objects[Index].Free;
inherited Delete(Index);
end;
procedure TMainElement.Clear;
var
I: Integer;
begin
for I := Pred(Count) downto 0 do
Delete(I);
end;
function TMainElement.Add(const ListLabel: string; const AObject: TObject): Integer;
begin
Result := AddObject(ListLabel,AObject);
end;
function TMainElement.GetSubElement(Index: Integer): TSubElement;
begin
if (Index < 0) or (Index >= Count) then Error(@SListIndexError, Index);
Result := TSubElement(Objects[Index]);
end;
function TMainElement.GetItemsEnumerator: TItemsEnumerator;
begin
Result := TItemsEnumerator.Create(Self);
end;
procedure TMainElement.ForEachSubElement(Method: TNotifyEvent);
begin
with GetItemsEnumerator do
while MoveNext do Method(Current);
end;
procedure TMainElement.Traitement1(Sender: TObject);
begin
if Assigned(Sender) and
Sender.ClassType.InheritsFrom(TSubElement) then
with TSubElement(Sender) do begin
{décrire ici le traitement sur le sous-element}
end;
end;
procedure TMainElement.Execute(Method: TNotifyEvent);
begin
ForEachSubElement(Method);
end;
{ TItemsEnumerator }
constructor TItemsEnumerator.Create(AStrings: TStrings);
begin
inherited Create;
FIndex := -1;
FStrings := AStrings;
end;
function TItemsEnumerator.MoveNext: Boolean;
begin
Result := FIndex < FStrings.Count - 1;
if Result then
Inc(FIndex);
end;
function TItemsEnumerator.GetCurrent: TObject;
begin
Result := FStrings.Objects[FIndex];
end; |
Partager