Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Zugriffsverletzung beim TObjectDictionary.Add (https://www.delphipraxis.net/202195-zugriffsverletzung-beim-tobjectdictionary-add.html)

Incocnito 9. Okt 2019 07:09

AW: Zugriffsverletzung beim TObjectDictionary.Add
 
Objektkopie?
Hat das Objekt ein "Assign", oder wie genau?
Delphi-Quellcode:
StringList1 := TStringList.Create();
StringList2 := StringList1;
StringList1.Free();
StringList2.Add('Something'); // <- Alles Kaputt, so geht das natürlich nicht!
Für den höchst unwahrscheinlichen Fall, dass du das meintest.

haentschman 9. Okt 2019 07:24

AW: Zugriffsverletzung beim TObjectDictionary.Add
 
Zitat:

Hat das Objekt ein "Assign", oder wie genau?
Normal macht man das klassisch mit Assign. Meine "Datenobjekte" haben auch Listen mit Objekten. Deshalb benutze ich gern folgendes:
Delphi-Quellcode:
class function TToolsJson.ObjectCopyJson(Value: TObject): TObject;
var
  MarshalObj: TJSONMarshal;
  UnMarshalObj: TJSONUnMarshal;
  JSONValue: TJSONValue;
begin
  Result := nil;
  MarshalObj := TJSONMarshal.Create;
  try
    UnMarshalObj := TJSONUnMarshal.Create;
    try
      JSONValue := MarshalObj.Marshal(Value);
      try
        if Assigned(JSONValue) then
          Result := UnMarshalObj.Unmarshal(JSONValue);
      finally
        JSONValue.Free;
      end;
    finally
      UnMarshalObj.Free;
    end;
  finally
    MarshalObj.Free;
  end;
end;
...nur leider funktioniert das nicht immer. :( Wie man an dem o.g. Fehler erkennen kann, werden Dictioniaries nicht wieder richtig erzeugt. Ich habe deshalb wieder nur auf Liste umgestellt.

Der schöne Günther 9. Okt 2019 09:00

AW: Zugriffsverletzung beim TObjectDictionary.Add
 
Zitat:

Zitat von haentschman (Beitrag 1449324)
Moin...8-)
Zitat:

Eine Idee habe ich noch...aber erst morgen früh.
...Fazit: Eine Objektkopie mit Maschal/UnMarschal nimmt den Comparer nicht mit. :?

Ja, leider.
Siehe auch hier:
https://stackoverflow.com/a/49636496/2298252

Incocnito 9. Okt 2019 15:32

AW: Zugriffsverletzung beim TObjectDictionary.Add
 
Sowas geht auch nur ansatzweise?
Ich hätte gesagt, da es sich ja nur um den Typen "TObject" handelt,
weiß Delphi eh nicht, was zu tun ist und stellt nur irgendeinen Mist her.
Ich bin total verwirrt! Das ist für mich schon quasi EDV-Magie! :oops:

Uwe Raabe 9. Okt 2019 15:39

AW: Zugriffsverletzung beim TObjectDictionary.Add
 
Zitat:

Zitat von Incocnito (Beitrag 1449381)
Das ist für mich schon quasi EDV-Magie!

Das dazugehörige Zauberwort heißt RTTI.

haentschman 10. Okt 2019 05:51

AW: Zugriffsverletzung beim TObjectDictionary.Add
 
Moin...:P
Zitat:

Ich hätte gesagt, da es sich ja nur um den Typen "TObject" handelt,
Du bekommst schon das raus was du reinsteckst. Du mußt nur das Ergebnis TObject auf deinen Typ casten.
Delphi-Quellcode:
BlubbCopy := TBlubb(TTools.ObjectCopy(Blubb));

generic 10. Okt 2019 10:01

AW: Zugriffsverletzung beim TObjectDictionary.Add
 
Zitat:

Zitat von haentschman (Beitrag 1449301)
Bitteschön...:P
Delphi-Quellcode:
FRoleRightDict := TUserRoleRightDict.Create([doOwnsValues]); // gleicher Fehler

Wenn ich mir die Exception und den Stacktrace anschaue, dann glaube ich eher das es am KEY liegt.
Ähnlich wie bei den Values, kann auch der KEY owned werden.

haentschman 10. Okt 2019 10:09

AW: Zugriffsverletzung beim TObjectDictionary.Add
 
Zitat:

Wenn ich mir die Exception und den Stacktrace anschaue, dann glaube ich eher das es am KEY liegt.
Dem widerspricht die fast tägliche Benutzung / Implementierung eines Dictionaries. :wink: Die diesem Falle war aber eine Objektkopie des Datenobjektes mit enthaltenem Dictionary verantwortlich. Mit der Kopie ist der FComparer intern nicht instanziert worden. :?

Danke...:wink:

Uwe Raabe 10. Okt 2019 11:40

AW: Zugriffsverletzung beim TObjectDictionary.Add
 
Zitat:

Zitat von haentschman (Beitrag 1449421)
diesem Falle war aber eine Objektkopie des Datenobjektes mit enthaltenem Dictionary verantwortlich. Mit der Kopie ist der FComparer intern nicht instanziert worden.

Das liegt vermutlich daran, daß nicht der gewünschte Construktor von TDictionary aufgerufen wurde, sondern der von TObject, weil UnMarshal nach einem parameterlosen Constructor sucht. Und Interface-Felder werden offenbar nicht serialisiert.

haentschman 10. Okt 2019 11:44

AW: Zugriffsverletzung beim TObjectDictionary.Add
 
Zitat:

Und Interface-Felder werden offenbar nicht serialisiert.
...genau. :P


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:24 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz