Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Klasse in der Klasse zuweisen


Andreas Pfau - Do 11.09.03 20:13
Titel: Klasse in der Klasse zuweisen
Hallo,

ich habe da eine Klasse, die eine weitere Klasse enthält. Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
type
  TClass1 = class
  private
    FVar1: TSomething;
    FVar2: TSomething;
    procedure SetVar1(Value: TSomething);
    procedure SetVar2(Value: TSomething);
  public
    Var1: TSomething read FVar1 write SetVar1;
    Var2: TSomething read FVar2 write SetVar2;
  end;

  TClass2 = class
  private
    FClass1: TClass1;
  public
    Class1: TClass1 read FClass1 write FClass1;
  end;

So, jetzt habe ich den Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
var
  Class2: TClass2;
begin
  Class2 := TClass2.Create;
  Class2.Class1.Var1 := Something;

Was passiert da? Wird dann wirklich NUR der Wert von Class2.Class1.Var1 geändert, oder wird die gesamte Klasse (Class1) neu initialisiert? Und noch was: ich will so was hier machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  TClass2 = class
  private
    FClass1: TClass1; 
    SetClass1(Value: TClass1);
  public
    Class1: TClass1 read FClass1 write SetClass1;
  end;

Was muss jetzt in SetClass1() stehen, damit ich auch NUR das in Class1 ändere, was ich im code angebe? Wenn ich jetzt

Delphi-Quelltext
1:
  Class1 := Value;                    

reinschreibe, wird dann wirklich nur Class2.Class2.SetVar1() aufgerufen, oder wird Class1 komplett neu geschreiben???

Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt...


ErnestoChe - Do 11.09.03 22:14

Hi,


Delphi-Quelltext
1:
2:
3:
4:
5:
var 
  Class2: TClass2; 
begin 
  Class2 := TClass2.Create; 
  Class2.Class1.Var1 := Something;


Hier kriegt nur Var1 den Wert Something. Ausserdem ist das nicht die Klasse sondern ein Objekt bzw. Instanz der Klasse TClass1.

In SetClass1 schreibst du z.B.:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TClass2.SetClass1(Value: TClass1);
begin
  FClass1.FVar1 := Value.FVar1;
  // ...
  // ...
end;


So kannst du die ganzen Properties von FClass1 setzen.

Aber so ganz hab ich dich nicht verstanden. Am besten du erklärst es nochmal.

MFG

- Ernesto -


Andreas Pfau - Do 11.09.03 22:19

Hallo,

Erst mal, hast Recht, es ist eine Instanz, keine Klasse.

OK, dann Danke für deine Hilfe :D Mir ist auf einmal alles klar.

Nur eine weitere Frage: Wenn ich statt

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TClass2.SetClass1(Value: TClass1);
begin
  FClass1.FVar1 := Value.FVar1;
  // ...
  // ...
end;

das schreibe:

Delphi-Quelltext
1:
2:
3:
4:
procedure TClass2.SetClass1(Value: TClass1);
begin
  FClass1 := Value;
end;

Was passiert dann? Wird dann...
1) Jede Eigenschaft von Class1 einzeln gesetzt oder
2) Die Instanz Class1 durch die Instanz Value ersetzt?


ErnestoChe - Do 11.09.03 22:50

Hi,


Delphi-Quelltext
1:
FClass1 := Value;                    


Das geht so nicht. Objekte einer Klasse in Delphi sind von Haus aus Zeiger. So würden beide auf den selben Speicherbereich zeigen. Das würde bedeuten das ein Zeiger dabei verloren geht und ein Speicherleck entsteht. Das kann nur zu unerwünschten Ergebnissen führen.

Wenn du ein Objekt kopieren willst, kommt es auf die Vorfahr-Klasse an. Viele Klassen haben die Methode Assign mit der das bequem geht. Ansonsten gehe die Properties einzeln durch.

MFG

- Ernesto -


AndyB - Do 11.09.03 23:39

ErnestoChe hat folgendes geschrieben:
Viele Klassen haben die Methode Assign mit der das bequem geht.

Wenn man eigene Felder zur Klasse hinzufügt, muss man natürlich Assign überschreiben und die eigenen Felder per FFeld := Source.FFeld kopieren. Ganz automatisch geht das also auch nicht.


Andreas Pfau - Fr 12.09.03 13:50

Hallo,

Danke! Frage beantwortet :D