![]() |
AW: Kopie eines Klassenobjekts erstellen
Verstanden was du da gerade geschrieben hast, habe ich leider nicht :pale:
Stellen 100 Properties denn ein Problem dar? Speicherverbrauch meiner Anwendung mit und ohne Klassenobjekten im Detail mit 0 Klassenobjekten bei Programmstart 9,2 MB mit 70 Klassenobjekten 10,7 MB. |
AW: Kopie eines Klassenobjekts erstellen
Meine Aussage bezog sich auf den Post von QuickAndDirty zuvor
|
AW: Kopie eines Klassenobjekts erstellen
Ich mach es z. B. so:
Delphi-Quellcode:
Anmerkung: Die Methoden BeginUpdate() und EndUpdate() habe ich selbst implementiert weil es sie in in TPersistent nicht gibt. (Delphi 2009)
TtoTreeNodeAttribute = class(TtoCollectionItem)
private FData: TtoData; FName: String; ... protected procedure SetName(Value: String); procedure SetData(Value: TtoData); ... public ... procedure AssignTo(Dest: TPersistent); override; published property Name: String read FName write SetName; property Data: TtoData read FData write SetData; ... end; ... procedure TtoTreeNodeAttribute.AssignTo(Dest: TPersistent); var DestObj: TtoTreeNodeAttribute; begin inherited AssignTo(Dest); if Dest is TtoTreeNodeAttribute then begin DestObj := TtoTreeNodeAttribute(Dest); DestObj.BeginUpdate; try DestObj.FData.Assign(FData); DestObj.FName := FName; ... finally DestObj.EndUpdate; end; end; end; procedure TtoTreeNodeAttribute.SetName(Value: String); begin if (FName <> Value) and (Value <> '') then FName := Value; end; procedure TtoTreeNodeAttribute.SetData(Value: TtoData); begin FData.Assign(Value); end; ... |
AW: Kopie eines Klassenobjekts erstellen
Delphi-Quellcode:
Bei ein paar Properties kein Problem. Bei alles über 50 aufwendig und doppelter Aufwand, wenn irgendwas geändert werden muss. Mal von der Gefahr abgesehen, wenn man vergisst AssignTo ebenfalls zu erweitern wenn man die Klasse erweitert.
DestObj.FData.Assign(FData);
DestObj.FName := FName; |
AW: Kopie eines Klassenobjekts erstellen
Zitat:
|
AW: Kopie eines Klassenobjekts erstellen
Zitat:
Zitat:
Sonst, wenn das besser ist, nehme ich Tigüs Idee ( ![]() Das mit Json lasse ich wegen dem Argument, dass Embarcadero das ja oft kaputt macht., Zitat:
|
AW: Kopie eines Klassenobjekts erstellen
Zitat:
|
AW: Kopie eines Klassenobjekts erstellen
Laut Windows Process Explorer, direkt nach Programmstart wenn alles geladen wurde:
TObject, private bytes 19.704 K, working set 31,644 K TPersistent, private bytes 19.648 K, working set 31.536 K Es gibt sicherlich einen anderen Unterschied irgendwo aber der scheint bei mir noch so klein zu sein, dass man ihn nicht merkt. Die paar Byte sind heute eh egal und auf die kommts auch nicht an bei einer Speicherreservierung von rund 30 MB. Ich habe das jetzt auch mal was genauer gemacht. Ob das richtig ist, weiß ich aber nicht. Ich bin alle Objekte durchgegangen, habe deren Größe mit InstanceSize bestimmt, addiert und am Ende ausgegeben. Für TPersistent bekomme ich 22680, für TObject auch 22680. Es geht mir keineswegs darum ein paar bytes zu sparen. Ich frage mich nur, warum man TObject mit eigenem Assign, was vielleicht sogar noch anfällig ist, nehmen sollte, obwohl TPersistent doch schon alles liefert. |
AW: Kopie eines Klassenobjekts erstellen
Zitat:
Zitat:
|
AW: Kopie eines Klassenobjekts erstellen
Zitat:
Dann deckt sich das ja mit meinem Fund Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz