Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Interface-Element in TStrings.Objects schreiben (https://www.delphipraxis.net/40138-interface-element-tstrings-objects-schreiben.html)

Stevie 11. Feb 2005 12:10


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:
var
  Objects: TStrings;
  XMLNode: IXMLNode;
begin
  {...}
  Objects.AddObject(XMLNode.Attributes['name'], TXMLNode(XMLNode));
Wenn ich hinterher wieder auf das Object zugreifen will, dann kommt eine Zugriffsverletzung.
Delphi-Quellcode:
for i := 0 to Pred(Objects.Count) do
  XMLNode := TXMLNode(Objects.Objects[i]);
Wahrscheinlich speichere ich oben die Instanz falsch ab, aber wie mache ich es richtig??

MfG
Stevie

Robert_G 11. Feb 2005 12:20

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....)

Stevie 11. Feb 2005 12:25

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:
XMLNode := IXMLNode(Pointer(Objects.Objects[i]));
Ok, ist etwas viel rumgecaste, aber was soll's... :roll:

shmia 11. Feb 2005 12:48

Re: Interface-Element in TStrings.Objects schreiben
 
Zitat:

Zitat von Stevie
Soll ich mir nen Interface-Pointer-Array machen??

Nö, dann nimm besser TInterfaceList.
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 18:23 Uhr.

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