Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: IUnknown / XML-Link im TreeView

  Alt 22. Aug 2007, 18:47
Zitat von StTüff:
... dass ich den XPath des tatsächlichen Knotens mit den Knoten, die (bzw. deren Zeiger) im Treeview hinterlegt sind vergleichen soll. Habe ich das jetzt richtig wiedergegeben?
Ja, genau.
Zitat von StTüff:
Das ist theoretisch natürlich möglich. Da ich dann aber beim durchlaufen der Schleife für jeden Knoten im TreeView den XPath ermitteln müsste, ist das auch aufwendiger (zumindest rechenintensiver).
Das stimmt natürlich, zu mal der Pfad nicht von DOM geliefert wird.
Für MSXML könnte das so aussehen:
Delphi-Quellcode:
function GetFullNodePath(node:IXMLDOMNode):string;
var
   i : Integer;
   n : IXMLDOMNode;
begin
   if node.nodeType=NODE_DOCUMENT then
      Result := ''
   else if Assigned(node.parentNode) then
      // rekursiver Aufruf
      Result := GetFullNodePath(node.parentNode)+'/'+node.nodeName
   else
      Result := node.nodeName;

   // Anzahl der Vorgänger mit gleichem Namen feststellen
   n := node.previousSibling;
   i := 1;
   while Assigned(n) do
   begin
      if (n.nodeName = node.nodeName) and (n.nodeType = NODE_ELEMENT) then
         Inc(i);
      n := n.previousSibling;
   end;
   if i > 1 then
      Result := Result + '['+IntToStr(i)+']';
end;
Zitat von StTüff:
Ich würde schon gerne bei der einfacheren Lösung bleiben, wenn sich nicht herausstellt, dass es hier grundsätzliche Dinge gibt, die dagegen sprechen.
Da es die meiste Zeit funktioniert hoffe ich den Grund noch zu finden, warum es manchmal ohne das Zutun des Anwenders schief geht. Ich hoffe zusätzlich darauf, dass sich das Problem dann einfach beheben lässt. Momentan kenne ich aber noch nicht ein mal den Grund, warum es in so seltenen Fällen daneben geht.
Wenn ein Element oder Attribut verändert wird, gibt es evtl. 2 Instanzen des gleichen Knotens.
Ein Knoten kann auch mit .cloneNode() kopiert werden.
Auch wenn man über die Grenzen eines Threads (oder Appartment ?) geht, haben zwei Interfacepointer verschiedene Adressen.

Würde den sourcecode mal so ändern:
Delphi-Quellcode:
    u_chekNode := PNodeState(form1.TrView_Struktur.
                  Items[cnt].Data).XMLNode as IXMLDOMNode;
    if u_chekNode = LinkedXMLNode then
So spart man sich eine Interfaceumwandlung.
Vielleicht sollte man die 2. Umwandlung auch einsparen und einen Cast-Operator nehmen:
Delphi-Quellcode:
    u_chekNode := IXMLDOMNode(PNodeState(form1.TrView_Struktur.
                  Items[cnt].Data).XMLNode);
    if u_chekNode = LinkedXMLNode then
Manchmal ist es so, dass man verschiedene Interfacepointer bekommt, je nach dem
in welcher Reihenfolge man die Interface umgewandelt.
Das hat mit Aggregation und Containment zu tun und ist nicht einfach zu verstehen.
Andreas
  Mit Zitat antworten Zitat