![]() |
Interface-Element in TStrings.Objects schreiben
Hallo Leute,
ich bin dabei, eine XML-Datei mit TXMLDocument auszulesen. Dabei sollen bestimmte Nodes für einen späteren gebrauch gespeichert werden. Dies mache ich so:
Delphi-Quellcode:
Wenn ich hinterher wieder auf das Object zugreifen will, dann kommt eine Zugriffsverletzung.
var
Objects: TStrings; XMLNode: IXMLNode; begin {...} Objects.AddObject(XMLNode.Attributes['name'], TXMLNode(XMLNode));
Delphi-Quellcode:
Wahrscheinlich speichere ich oben die Instanz falsch ab, aber wie mache ich es richtig??
for i := 0 to Pred(Objects.Count) do
XMLNode := TXMLNode(Objects.Objects[i]); MfG Stevie |
Re: Interface-Element in TStrings.Objects schreiben
Du versuchst ein Interface in eine "richtige" Instanz zu boxen.
Interfaces sind in Delphi32 keine wirklichen Objektreferenzen (versuche einfach mal "SomeInterface is TObject" ;) ). Du musst also einen Cast auf IXmlNode statt TXmlNode machen um das Ding aus der Liste zu kriegen. BTW: Warum machst du das über eine StringList? Das ist doch nun wirklich ganz schön umständlich und unleserlich. (Dieses ewige sich-einen-wolf-rumgecaste....) |
Re: Interface-Element in TStrings.Objects schreiben
Ok, dann erklär ich am besten gleich mein Anliegen, du hast bestimmt ne Idee...
Ich iteriere über mein XML-Dokument und möchte mir bestimmte Nodes merken, um später direkt auf diese Nodes zuzugreifen. Ich kann aber keine IXMLNode in Objects speichern, weil dort ein TObject-Element erwartet wird... Soll ich mir nen Interface-Pointer-Array machen?? Nachtrag: Ich hab's jetzt so gemacht:
Delphi-Quellcode:
Objects.AddObject(ObjectName, Pointer(XMLNode));
Delphi-Quellcode:
Ok, ist etwas viel rumgecaste, aber was soll's... :roll:
XMLNode := IXMLNode(Pointer(Objects.Objects[i]));
|
Re: Interface-Element in TStrings.Objects schreiben
Zitat:
Du kannst Interfacepointer auf in TStrings.Objects[] unterbringen; das wird aber etwas heikel wegen der Referenzzählung. (ich würd's nicht empfehlen)
Delphi-Quellcode:
XMLNode: IXMLNode;
begin {...} XMLNode.AddRef; // sonst verabschiedet sich das Object hinter dem Interface Objects.AddObject(XMLNode.Attributes['name'], TObject(Pointer(XMLNode))); {...} // und später freigeben for i :=0 to objects.Count-1 do begin XMLNode := IXMLNode(Pointer(Objects.Objects[i])); XMLNode.Release; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:21 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