Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Klasse kopieren statt wildes gepointer.


FinnO - Fr 01.10.10 15:57
Titel: Klasse kopieren statt wildes gepointer.
Moin,

habe mich heute im Informatikunterricht erstmals mit einem etwas verrückten Problem auseinandersetzen müssen:

Folgende Situation - wir haben eine wunderschöne pupseinfache Basisklasse, die ich hier unten mal eben aufgeschrieben habe. Ich würde jetzt recht gerne eine Kopie eines Objekts einer Klasse basteln.


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:
type
  TZahl = Class
  private
    FValue : Integer;
  public
    property Value : Integer read FValue write FValue;
    
    constructor create(AValue : Integer); overload;

    procedure Display(ed : TEdit); 
  end;

implementation

constructor TZahl.Create(AValue : Integer); 
begin
  inherited create;
  FValue := AValue;
end;

procedure TZahl.Display(ed : TEdit); 
begin
  ed.Text := IntToStr(FValue);
end;
end.


bekannt ist ja, dass der Compiler im Hintergrund gerne mal herumpointert:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  a, b : TZahl;
begin
  a := TZahl.Create(25); 
  b := a; 
  b.Value := 30;

  a.Display(edA);
  b.Display(edB);
end;


Die Folge ist: in beiden Edits steht 30. Das liegt daran, dass im Hintergrund still und heimlich das andere Objekt referenziert wird. Wie kann ich jetzt eine Klasse sinnvoll kopieren, das heißt, ein Objekt eins zu eins an anderer Stelle einsetzen, dann aber alleinstehend bearbeiten, ohne erst einen anderen überladenen Constructor oder wasweißich selbst zu basteln?

LG


Lemmy - Fr 01.10.10 16:08

Hi,

ganz einfach: eine neue Instanz anlegen und die relevanten Daten des Objektes kopieren. Die VCL bietet dafür die Methoden Assign bzw. AssingTo an. Wenn Du diese einsetzten willst, überschreibst Du einfach die AssignTo bei der entsprechenden Klasse und machst dort die Zuweisung.

Grüße