Привязка узла XML к узлу дерева - PullRequest
3 голосов
/ 20 марта 2012

Я хочу просмотреть XML с помощью TTreeView.Чтобы связать узлы дерева с узлами XML с атрибутами, я использовал следующий синтаксис:

var tv: TTreeView; tn1, tn2: TTreeNode; xn: IXMLNode;

if xn.AttributeNodes.Count > 0 then
  tn2 := tv.Items.AddChildObject( tn1, xn.NodeName, @xn )
else
  tn2 := tv.Items.AddChild( tn1, xn.NodeName );

.. и позже в программе:

var  tv: TTreeView; pxn: ^IXMLNode; i: integer;

pxn := tv.Selected.Data;
for i := 0 to iXML.AttributeNodes.Count-1 do
  ShowMessage ( pxn^.AttributeNodes[i].LocalName + ' = ' +
                pxn^.AttributeNodes[i].Text );

, что приводит к исключению ..Насколько я могу понять, это связано с тем, что я указываю на интерфейс, а не на объект.

Можно ли ссылаться на фактический объект XML вместо интерфейса?Что произойдет с этой ссылкой, если новые XML-узлы будут вставлены или удалены из дерева?

Или есть другое прямое решение?

Вся помощь приветствуется!

1 Ответ

4 голосов
/ 20 марта 2012

не используйте операторы @ и ^, интерфейсы уже являются ссылками

первый код:

var tv: TTreeView; tn1, tn2: TTreeNode; xn: IXMLNode;

if xn.AttributeNodes.Count > 0 then
  tn2 := tv.Items.AddChildObject( tn1, xn.NodeName, Pointer(xn) )
else
  tn2 := tv.Items.AddChild( tn1, xn.NodeName );

второй код (не забудьте проверить, назначены ли данные)

var  tv: TTreeView; pxn: IXMLNode; i: integer;

if Assigned(tv.Selected) and Assigned(tv.Selected.Data) then begin
  pxn := IXMLNode(tv.Selected.Data);
  for i := 0 to iXML.AttributeNodes.Count-1 do
    ShowMessage ( pxn.AttributeNodes[i].LocalName + ' = ' +
                  pxn.AttributeNodes[i].Text );
end;

Просто поищите в сети дополнительную информацию об интерфейсах, классах и различиях между ними.Хорошая информация: http://blog.synopse.info/post/2012/02/29/Delphi-and-interfaces

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...