Bonjour,

Quelle est la meilleure solution pour cloner une TStringList contenant des objets ? Je précise que je souhaite que les objets de la propriété Objects doivent eux aussi être clonés. Ci-dessous un bout de code qui fonctionne, mais qui ne me semble pas terrible.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
unit Unit4;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
type
  TParam = class ( TPersistent )
  private
    FID : Integer;
  public
    constructor Create(pID : Integer);
    destructor Destroy; override;
    procedure Assign(Source: TPersistent); override;
  end;
 
  TParams = class ( TObject )
  public
    FList : TStringList;
    constructor Create(); overload;
    destructor Destroy; override;
    procedure Assign( Source: TParams );
    procedure AddParam( pLib : String; pParam: TParam);
    function Duplicate(): TParams;
  end;
 
  TForm4 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;
 
var
  Form4: TForm4;
 
implementation
 
{$R *.dfm}
 
{ TParams }
 
procedure TParams.AddParam(pLib: String; pParam: TParam);
begin
  self.FList.AddObject(pLib, pParam);
end;
 
procedure TParams.Assign(Source: TParams);
var
  iCptObj: Integer;
  lParam : TParam;
begin
  if ( Source is TParams ) then
  begin
    FList.Assign( Source.FList );
    for iCptObj := 0 to FList.Count-1 do
    begin
      FList.Objects[iCptObj] := TParam.Create(-1);
      lParam := TParam(FList.Objects[iCptObj]);
      lParam.Assign( Tparam(Source.FList.Objects[iCptObj]));
    end;
  end;
end;
 
constructor TParams.Create;
begin
  FList := TStringList.Create(true);
end;
 
destructor TParams.Destroy;
begin
  FList.Clear;
  FreeAndNil( FList );
  inherited;
end;
 
function TParams.Duplicate: TParams;
begin
  Result := TParams.Create();
    Result.Assign( self );
end;
 
{ TParam }
 
 
procedure TParam.Assign(Source: TPersistent);
begin
  //inherited;
  FID := TParam(Source).FID;
end;
 
constructor TParam.Create(pID: Integer);
begin
  FID := pID;
end;
 
procedure TForm4.Button1Click(Sender: TObject);
var
  Params1 : TParams;
  Params2 : TParams;
  lParam : TParam;
  icptParam: Integer;
  lMsg : String;
begin
  Params1 := TParams.Create;
  lParam := TParam.Create(1);
  Params1.AddParam('UN', lParam);
  lParam := TParam.Create(2);
  Params1.AddParam('DEUX', lParam);
 
  Params2 := Params1.Duplicate;
  for icptParam := 0 to Params2.FList.Count-1 do
  begin
    lMsg := Params2.FList[icptParam] + ' '+IntToStr(TParam(Params2.FList.Objects[icptParam]).FID);
    ShowMessage('Params2['+ IntToStr(icptParam)+ '] : ' + lMsg);
  end;
  Params1.Free;
  Params2.Free;
end;
 
destructor TParam.Destroy;
begin
  ShowMessage('Destruction TPAram');
  inherited;
end;
 
end.