Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Вопрос по TXMLDocument


Автор: korotkov 5.11.2006, 23:27
Вопрос по TXMLDocument

Использую Borland C++Builer 6.0 + VirtualTreeView ...
Перевожу пример из http://quadr0.pochta.ru/VirtualTreeview/virtualtreeview_pdf.zip
( http://forum.vingrad.ru/topic-97620/unread-1/hl/virtualtreeview/index.html )
сохранения дерева VirtuaTreeView в XML файл.

Код

  TXMLDocument *XMLDocument;

  XMLDocument = new TXMLDocument("");

  try{
    XMLDocument->Active = True;
    XMLDocument->Encoding = "UTF-16";
    XMLDocument->AddChild("VirtualTreeView");
    XMLDocument->Options = XMLDocument->Options << doNodeAutoIndent;

    SaveXML(VST->RootNode, XMLDocument->DocumentElement);

    XMLDocument->SaveToFile("vt.xml");
  }
  __finally{
    //FreeAndNil(XMLDocument);
    delete XMLDocument;
  }


Компилится, но программа вылетает по EAccessViolation при попытке получения XMLDocument->DocumentElement

В design режиме, если положить компонент на форму TXMLDocument, то все Ок, а в runtime беда smile

Что я делаю не так?

Автор: _hunter 6.11.2006, 12:30
в конструктор строку передавать нельзя (не тот конструктор вызовется)
и DOMVendor установить не помешалобы:
Код

    TXMLDocument* xmlDocument = new TXMLDocument(Application);
      xmlDocument->DOMVendor = GetDOMVendor("MSXML"); 
      xmlDocument->Active = true;

так же неплохо бы проверить когда AV кидается (при вызове "XMLDocument->DocumentElement" или при работе SaveXML())

Автор: korotkov 6.11.2006, 16:47
еслиб все так было просто ;)

В примере на Delphi конструктор действительно вызывается с параметром self, а далее удаляется ...

На C++Buildere 6 конструктор объявлен как TXMLDocument(const DOMString AFileName);

и на TXMLDocument* xmlDocument = new TXMLDocument(Application); соответственно ругается smile

> xmlDocument->DOMVendor = GetDOMVendor("MSXML");
наверное это установлено поумолчанию в конструкторе!?
но добавил ... теперь и на ней вылетает!!!

>так же неплохо бы проверить когда AV кидается (при вызове "XMLDocument->DocumentElement" или при работе SaveXML())
вылетает именно на DocumentElement, проверил, точнее даже на ...

Код

__fastcall DelphiInterface<T>() : info(0)
{}


в модуле systobj.h

Все это незаладилось с перевода куска кода не Delphi, там конструктор TXMLDocument вызывается с параметром self, а в Builder конструктор просит строку имя!!!

Код

  XMLDocument := TXMLDocument.Create(Self);
  try
    with XMLDocument do
    begin
      Active := True;
      Encoding := 'UTF-16';
      AddChild('VirtualTreeview');
      Options := Options + [doNodeAutoIndent];
    end;
    SaveXML(VT.RootNode, XMLDocument.DocumentElement);
    XMLDocument.SaveToFile('vt.xml');
  finally
    FreeAndNil(XMLDocument);
  end;


Вот такие пироги!

Повторюсь, это все не работает если создавать как написано выше в runtime, а если кинуть на форму XMLDocument, то все Ок!

Автор: _hunter 6.11.2006, 17:22
Цитата(korotkov @  6.11.2006,  16:47 Найти цитируемый пост)
На C++Buildere 6 конструктор объявлен как TXMLDocument(const DOMString AFileName);

их там два...

еще тут:
http://groups.google.com/group/borland.public.cppbuilder.internet.web/browse_frm/thread/5ec60bdd5a7fae56/
почитай...

Автор: korotkov 6.11.2006, 18:35
>их там два...
а подробнее можно ...

компилятор ругается если я в качестве параметра ставлю this или Application, говорит нет такого:
Could not find a match for TXMLDocument::TXMLDocument(...)

я так понимаю отсюда и ноги растут!;)

>почитай...
Разве что это:
>XmlDoc=new TXMLDocument(TName);
Do not do that.  TXMLDocument does not work properly when instantiated
dynamically.  Use the IXMLDocument interface directly, ie:
_di_IXMLDocument XmlDoc; 

но на чем это утверждение основывается, проверю ...

Вопрос свелся к ... :

как в runtime создать XML документ и сохранить его на диск, с применением TXMLDocument

Автор: Vyacheslav 7.11.2006, 17:11
Ну так есть такая проблем с TXMLDocument.
А кто мешает использовать   _di_IXMLDocument?

Автор: korotkov 9.11.2006, 00:00
>Ну так есть такая проблем с TXMLDocument.
так в чем проблема заключается, где об этом ...

>А кто мешает использовать   _di_IXMLDocument?
да, вместо:  
TXMLDocument *XMLDocument = new TXMLDocument("");
пишу:
_di_IXMLDocument XMLDocument = NewXMLDocument();
работает!

Но я уже бросил компоненту на форму и ... ;)

Так в чем суть разница, накручено как-то с этим вопросом!  smile  

На каком варианте остановиться?

Автор: Vyacheslav 9.11.2006, 10:45
Если есть возможнность добавить компонент в дизайне, то используй TXMLDocument, если - нет, то di_IXMLDocument. 
Во всяком случае я другого решения в свое время не смог найти

Автор: korotkov 9.11.2006, 15:37
>Если есть возможнность добавить ...
а более глубоко не копал? Исходники и прочее ... в чем суть разница?!

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)