Autor Beitrag
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Do 11.09.03 20:13 
Hallo,

ich habe da eine Klasse, die eine weitere Klasse enthält. Beispiel:
ausblenden 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:
ausblenden 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:
ausblenden 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
ausblenden 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...

_________________
Life is a bad adventure, but the graphic is really good!
ErnestoChe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: Do 11.09.03 22:14 
Hi,

ausblenden 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.:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TClass2.SetClass1(Value: TClass1);
begin
  FClass1.FVar1 := Value.FVar1;
  // ...
  // ...
end;

das schreibe:
ausblenden 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?

_________________
Life is a bad adventure, but the graphic is really good!
ErnestoChe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 528

Win 2000 pro, CRUX 2.0
Delphi 6 Pers, Open K3
BeitragVerfasst: Do 11.09.03 22:50 
Hi,

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: 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.

_________________
Ist Zeit wirklich Geld?
Andreas Pfau Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Fr 12.09.03 13:50 
Hallo,

Danke! Frage beantwortet :D

_________________
Life is a bad adventure, but the graphic is really good!