• Domingo 29 de Septiembre de 2024, 02:21

Autor Tema:  Txmldocument En Una Unit Sin Form O En Runtime  (Leído 1370 veces)

dodongoxp

  • Visitante
Txmldocument En Una Unit Sin Form O En Runtime
« en: Viernes 10 de Marzo de 2006, 13:32 »
0
holas

bueno.. esto es una aportacion espero les ayude en algo...

bueno todo empezo cuando queria usar TXMLDocument en una clase sin forma o usarlo en runtime para usos rapidos en mi aplicacion ...

hice una exhaustiva busqueda en google y me percate de que hay un bug en el TXMLDocument que le impide funcionar sin un owner.. entonces encontre por hay unos truquillos para hacerlo correr en una clase sin forma o en runtime aqui esta como la manera en la que funciona


para hacerlo correr en runtime

tienes que usar la interface delphi de TXMLDocument que es _di_IXMLDocument en su lugar de esta manera

_di_IXMLDocument xmldoc = LoadXMLDocument("c:\\archivovalido.xml");
xmldoc->Active = true;

o en su defecto


_di_IXMLDocument xmldoc = LoadXMLData("<ArchivoXml></ArchivoXml>");
xmldoc->Active = true;


y asi ya se manipula como siempre... y esta interface liberara el objeto automaticamente cuando se descontinue su uso saliendo del scope

esta manera solo funciona si se declara xmldoc en el mismo scope donde se manipula ...

y para usarse TXMLDocument en una clase sin form...se hace un truco para pasarle un TDataModule como owner para poder ser manipulado normalmente ..
de esta manera me funciono

declaracion de clase TXmlOps en XmlOps.h

class TXmlOps
{
private:

  TDataModule *dm;
  TXMLDocument *xd;

public:

  __fastcall TXmlOps();
  void __fastcall GetActive();

};

implementacion de clase TXmlOps en XmlOps.cpp


__fastcall TXmlOps::TXmlOps()
{

  dm = new TDataModule(NULL);
  xd = new TXMLDocument(dm);
  xd->DOMVendor = GetDOMVendor("MSXML");
  xd->NodeIndentStr = "  ";
  xd->Options = xd->Options << doNodeAutoIndent;
  xd->ParseOptions = xd->ParseOptions << poValidateOnParse;

}


void __fastcall TXmlOps::GetActive()
{

  xd->Active = true;

}

ya posteriormente puedes llenar la clase con mas metodos que te sean utiles para manipular TXMLDocument

para usar esa clase seria de esta manera:

TXmlOps *XmlOps = new TXmlOps();

ya que si lo haces de esta manera

TXmlOps *XmlOps;

habra un access violation .. ya que el truco se efectua en el constructor de la clase para poder manipular TXMLDocument sin form

recuerda incluir estos includes en la unit(en el .h) donde tengas tu TXMLDocument

#include <msxmldom.hpp>
#include <XMLDoc.hpp>
#include <xmldom.hpp>
#include <XMLIntf.hpp>

esto ha sido probado en borland c++ builder 6 enterprise y borland c++ builder 2006 architect

se desconoce su funcionamiento en versiones anteriores o diferentes ediciones del producto

no tomo credito alguno por lo que aqui muestro ya que esto no es mas que una recopilacion de informacion que encontre en internet y la puse en practica...

espero que les sirva a todo aquello que use esta clase

SALUDOS :hola: