Autor Beitrag
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 29.07.04 15:44 
Hallo,

ich bilde eine XML Struktur in einem TreeView ab. Nun würde ich gerne das jeweilige XMLNode Objekt an das repräsentierende TreeNode hängen. Folgende Zeile lässt sich zwar Compilieren, wobei ActNode den Typ IXMLNode hat und ActChild den Typ tTreeNode, funktioniert aber nciht wie geelott.
ausblenden Delphi-Quelltext
1:
2:
3:
ActChild := tree_nav.Items.AddChildObject(aTreeNode,
                           ActNode.NodeName,
                           Addr(ActNode));

Denn beim Versuch es so wieder aus zu lesen:
ausblenden Delphi-Quelltext
1:
IXMLNode(ActChild.Data).NodeName;					

wird eine Zugriffsverletzung gemeldet. Auch eine Typprüfung mit dem IS Operrator ist nicht möglich. Das ganze sehr wahrscheinlich weil IXMLNode "nur" ein Interface ist.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
{ IXMLNode }

  IXMLNode = interface
    ['{395950C0-7E5D-11D4-83DA-00C04F60B2DD}']


Kennt jemand von euch eine Möglichkeit, wie ich mit diesem Interface in meinem Sinne nutzen kann?

Gruß
Klabautermann
mirage228
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 338

Win 7 Prof.
Delphi 2005 Prof., Delphi 2010 Prof.
BeitragVerfasst: Do 29.07.04 16:02 
Hi,

wenn du TXMLDocument und damit TXMLNode und co. verwendest, sollte es funktionieren.

Diese sind meineswissens nach von TInterfacedObject abgeleitet, dass wiederum von TObject abgeleitet ist.

mfG
mirage228

_________________
May the source be with you, stranger.
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 29.07.04 17:24 
Hi,
mirage228 hat folgendes geschrieben:
wenn du TXMLDocument und damit TXMLNode und co. verwendest, sollte es funktionieren.

ich verwende tXMLDocument, dieses liefert mir aber beim Zugrif IXMLBode Objekte. Wenn ich z.B. folgende Zeile Compilieren will:
ausblenden Delphi-Quelltext
1:
ActXMLNode := XML.DocumentElement.ChildNodes['Knoten1']					

wobei XML ein tXMLDocument ist und ActXMLNode ein tXMLNode, bekomme ich eine Fehlermeldung weil ChildNodes genau so wie DocumentElement den Typ IXMLNode hat, also ein Typenkonpflikt vorliegt. Wie kann ich aus tXMLDocument eine tXMLNode auslesen?

Gruß
Klabautermann
mirage228
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 338

Win 7 Prof.
Delphi 2005 Prof., Delphi 2010 Prof.
BeitragVerfasst: Do 29.07.04 17:57 
Hi,

Spontan fällt mir da auch nichts mehr ein... aber:

wenn es dir nicht zu viel Aufwand ist, kannst du auch das TVirtualTreeView von Mike Lischke mal ausprobieren.

Dort kannst du an die Daten eines TreeNode einen record "anhängen", das natürlich einen Eintrag vom Typ IXMLNode haben kann.

Das VirtualListView findest du unter www.delphi-gems.com. Am Anfang ist es etwas schwer zu verstehen, aber wenn sich das Demo mal verinnerlicht, ist man von den möglichkeiten vollends begeistert.

_________________
May the source be with you, stranger.
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 29.07.04 21:27 
Hi,

ich kenne den VirtualTreeView, technisch währe es kein Problem, aber eigendlich möchte ich nicht drauf zurück greifen (erst dann von den Standard Komponenten abweichen wenn es umbedingt nötig wird ;)). Wie werden Interfaces eigendlich im Speicher behandelt? Ich meine einen Record (bzw. einen Pointer auf diesen) könnte ich ja auch an den normalen Tree anhängen. Das werde ich morgen mal probieren, danke für den Tip.

Gruß
Klabautermann
Klabautermann Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Fr 30.07.04 06:35 
Hallo,

wunderbar, mit folgenden hilfsdatentypen lässt sich die IXMLNode problemlos anhängen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
tMyTreeData = RECORD
    XMLNode : IXMLNODE;
  end; // tNavTreeData

  pMyTreeData = ^tMyTreeData;


Damit ist das Problem gelöst, und ich muss jetzt nur noch eine funktion Schreiben um dem nun Dynamisch reserviereten Speicher wieder frei zu geben.

Danke für den Denkanstoß.

Klabautermann
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Fr 30.07.04 10:30 
Moín,

ich vermute mal das deine probleme mit dem referenz-count der COM objekte zusammenhängen. Vermutlich wird der ref-count nicht erhöht, wenn du sie in einem pointer ablegst, da delphi das dann, wegen mangelnder typiesierung, nicht erkennen kann. Würdest du _AddRef und _release manuell aufrufen, müsste es wieder gehen, da der ref-count sonst sofort auf 0 geht und das COM-objekt selbstmord begeht :?:

_________________
mfg.
mâximôv