Вниз
Скачать: CL | DM;

Связь узлов TTreeView с элементами IXMLDOMDocument   Найти похожие ветки 

 
pyJIoH ©   (2006-06-09 14:39) [0]

В качестве парсера XML использую - DOM интерфейс IXMLDOMDocument2,
По его элементам рекурсивно строю дерево в TTreeView

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

Если хранить в TreeNode.Data указатель на элемент из XMLDOMDocument"a
как его потом юзать?


 
Reindeer Moss Eater ©   (2006-06-09 15:16) [1]

Юзать как указатель на интерфейс


 
pyJIoH ©   (2006-06-09 15:39) [2]

можно подробней?
указатель на весь интерфейс или на XMLDOMNode например?
не силен в этой теме пока


 
Сергей М. ©   (2006-06-09 15:43) [3]


> Если хранить в TreeNode.Data указатель на элемент из XMLDOMDocument"a
> как его потом юзать?


IXMLDOM(TreeNode.Data).SomeMethod


 
Reindeer Moss Eater ©   (2006-06-09 16:10) [4]

указатель на весь интерфейс или на XMLDOMNode например?

Это уж как тебе приспичит. Пойнтер он и есть пойнтер. Указывать может на что угодно.


 
pyJIoH ©   (2006-06-13 10:32) [5]

Спасибо за ответы

Вообщем по началу при создании узлов
я сохранял ссылку таким образом:
...
 TreeNode.Data := Pointer(XMLDOMNode);
...

Но при попытке вызвать в событии OnChange
моего TreeView:
...
IXMLDOMNode(Node.Data).SomeMethod получал AV.
...

Если я правильно понял, это из-за того,
что счетчик ссылок у объекта не увеличивался

Сейчас я накидал такой код:
type
 PXMLNodeInfo = ^TXMLNodeInfo;
 TXMLNodeInfo = record
   DOMNode: IXMLDOMNode
 end;
...
 NodeInfo^.DOMNode := XMLDOMNode;
 TreeNode.Data := NodeInfo;
...
procedure OnChange();
begin
 PXMLNodeInfo(Node.Data)^.DOMNode.SomeMethod;
end;

Все работает.

Еще пару вопросов:
Не происходит ли в интерфейсе
каких либо непредвиденных изменений информации?
точнее код выше работоспособен на 100%?

Есть ли у IXMLDOMNode какой-нибудь уникальный иденификатор
чтобы не хранить ссылку на объект, и уже искать по нему?


 
Сергей М. ©   (2006-06-13 10:37) [6]


> Если я правильно понял, это из-за того,
> что счетчик ссылок у объекта не увеличивался


Правильно понял.

Можно было сделать проще:

XMLDOMNode._AddRef;
TreeNode.Data := Pointer(XMLDOMNode);

При этом при уничтожении TreeNode не забыть сделать

IUnknown(TreeNode.Data)._Release;

иначе сч-к ссылок не будет сбалансирован



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.025 c
2-1151993523
Urvin
2006-07-04 10:12
2006.07.23
статическая переменная?


3-1147930342
Baks
2006-05-18 09:32
2006.07.23
Две БД сразу


6-1142583177
Derr
2006-03-17 11:12
2006.07.23
Метод OnExecute в Indy10


15-1150177750
Ega23
2006-06-13 09:49
2006.07.23
С Днём рождения! 10 июня


15-1150910869
Piter
2006-06-21 21:27
2006.07.23
Теплообмен в трубах




   Наверх