Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Mit TList<TMyClass>.Add neues Objekt erzeugen


Nano-Ware - Do 12.04.12 14:53
Titel: Mit TList<TMyClass>.Add neues Objekt erzeugen
Hey,


Delphi-Quelltext
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:
type
  TMC = class
    public
      a : String;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  a, b : TMC;
  list : TList<TMC>;
begin
  list := TList<TMC>.Create;
  a := TMC.Create;
  a.a := 'First';
  list.Add(a);
  a.a := 'Second';
  list.Add(a);

  for b in list do
    begin

      ShowMessage(b.a); //gibt 2x Second aus

    end;

end;

Ich hätte gerne, dass dieser Code First und dann Second ausgibt. Wie mache ich das denn am geschicktesten?


Delphi-Quelltext
1:
2:
3:
i := list.Add(a);
list.items[i] := TMC.Create;
list.items[i].CopyFrom(a); //Methode, die dann nur die Eigenschaft "String (a)" kopiert und nicht nur die Refferenz


Das funktioniert schon, ist aber nicht wirklich schön.

Danke für Verbesserungsvorschläge


Nersgatt - Do 12.04.12 15:01

Du fügst ja nur zu der Liste eine Instanz von TMC hinzu.
Nach dem list.Add(a) verweisen sowohl a, als auch list.Items[0] auf die selbe Instanz. Nach dem 2. list.add(a) verweist auch list.items[1] auf wieder die selbe Instanz von TMC! Dann führen schon 3 Wege nach Rom.

Du musst nach Zeile 22 ein a := TMC.Create einfügen, um eine neue, separate Instanz zu erstellen.


Nano-Ware - Do 12.04.12 15:11

Okay da hätte ich eigentlich auch selbst draufkommen können. Aber wenn ich jetzt zwei TList habe und eine davon mit verschiedenen Objekten gefüllt ist. Wie clone ich dir, damit beide anfangs den selben Inhalt haben, aber unabhängig voneinander sind?


Nersgatt - Do 12.04.12 15:19

Mit Zielliste.Assign(Quellliste);
Aber mich dünkt, dass Du da vielleicht ein konzeptionelles Problem hast, bei dem, was Du vor hast... :lupe:


Gausi - Do 12.04.12 15:50

Wenn die Objekte in den Listen hinterher unabhängig sein sollen, dann reicht das assignen der Liste nicht aus - dabei werden ja nur die Pointer kopiert. Dann müssen auch alle Objekte doppelt erzeugt werden.