Autor Beitrag
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Fr 17.02.06 13:04 
Mahlzeit :-)

Ich habe eine Klasse von TPersistent abgeleitet da ich Objekte "klonen" muss also alle Eigenschaften des einen auf die des anderen Objektes übertragen will.

Leider bekomme ich zur Laufzeit "<Klassename> kann nicht zu Klasse kopiert werden <Klassename>" zurück :(

Ich bin mir nicht sicher, ob ich auch noch AssignTo überschreiben muss, da das bei TPersistent.Assign aufgerufen wird.

Ich habe das so gemacht

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
TmyClass = class(TPersistent)
  protected
  ...
  public
    ...
    procedure Assign(Source: TMyClass); reintroduce;
   end;

...


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TMyClass.Assign(Source: TMyClass);
begin
  inherited Assign(TPersistent(Source)); //hier "abschälen"
  self.fX:= Source.fX;
  self.fY:=Source.fY;
  self.fId:=Source.fID;
  ...
end;


und die Methode wird auch aufgerufen, ich kann aber garnicht in TPersistent.Assign rein, dann kommt schon die Meldung hoch. Ich kann auch Keine Breakpoints in Classes TPersistent.Assign machen :?
digi_c Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Fr 17.02.06 14:53 
Ich habs doch aus eigener Kraft geschafft(jaja was so ein deftiges Spaghetti Bolognese alles anrichtet ;)) und zwar hatte ich ein leicht falsches Verständnis wie Assign arbeitet (so eine Enterprise Edition mit Sources der VCL hat schon ihre Vorteile :D) und zwar:

1.Assignist nur eine Hülle für AssignTo(dieses wird in TPersistent.Assignaufgerufen oder falls es in der richtigen Klasse nicht implementiert ist kommt der Fehler)

2.Das AssignToprüft zuerst ob Dest von der selben Klasse ist und transferiert dann die Werte. Die Klassen darunter wissen ja nichts davon. Falls das nicht der Fall ist wird das AssignToder Vorgängerklasse aufgerufen, was im Falle von TPersistent ebenfalls zu dieser Meldung führt!)


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
TmyClass = class(TPersistent)
  protected
  ...
  public
  ...
    procedure Assign(Source: TPersistent); override//muss genauso TPersistent sein, ansonsten kommt ein Bruch in der Vererbung vor
    procedure AssignTo(Dest: TPersistent);override;
   end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TmyClass .Assign(Source: TPersistent);
begin
  inherited Assign(Source); // ja kann man eigentlich auch weglassen :-)
end;


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TmyClass .AssignTo(Dest: TPersistent);
begin
  if Dest is TmyClass then
  begin
    TmyClass(Dest).ID:= fID;
    TmyClass(Dest).X:=fX;
    TmyClass(Dest).Y:=fY;
    ...
  end
  else inherited AssignTo(Dest);
end;