Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

чем можно заменить TXMLDocument? [D7, XP]


Dysan ©   (2006-08-03 15:35:00) 

обнаружил что происходят утечки памяти при использовании XML интерфейсов, т.к. создаю обьекты типа TXMLDocument
не в дезигн-тайме, то использую его интерфейс IXMLDocument.
не посоветуете чем заменить дельфёфский XML парсер ?


palva   (2006-08-03 20:32:00) [1]

Возможно где-то осталась необнуленная ссылка... Если Destroy срабатывает без исключения, то, наверно, таким образом и можно побороться с утечкой памяти, хотя лучше найти ошибку.


Плохиш   (2006-08-03 19:16:00) [2]


> palva ©   (03.08.06 17:52) [9]

Да, в справке по TXMLDocument об этом написано, но у человека, по его словам, память не освобождается, значит где-то он вводит нас в заблуждение.


palva   (2006-08-03 17:52:00) [3]

Плохиш ©   (03.08.06 15:53) [4]
Объект с интерфейсами удаляется сам, когда обнуляется счетчик ссылок на интерфейс. См. реализацию метода _Release в объекте TInterfacedObject - там есть обращение к Destroy. Можно запустить такую программу и посмотреть, как это работает:

{$APPTYPE CONSOLE}
type
 IC = interface
   procedure P1;
 end;

 CC = class(TInterfacedObject, IC)
   procedure P1;
   destructor Destroy; override;
 end;

 procedure CC.P1;
 begin
   WriteLn('CC.P1')
 end;

 destructor CC.Destroy;
 begin
   Writeln('Destroying');
   Inherited Destroy;
 end;

var
 ic1: IC;
 cc1: CC;  
begin
 cc1 := CC.Create;
 ic1 := cc1;
 ic1.P1; // печатает CC.P1
 ic1 := Nil; // печатает Destroying
 cc1.Free; // Exception увы
end.


alles   (2006-08-03 17:31:00) [4]

тут показывают как бегать по XML -у
http://www.codenet.ru/progr/delphi/stat/delphi_xml.php


alles   (2006-08-03 17:29:00) [5]

Можно по другому сделать. Пример ф-ий из рабочего проекта
Function  LoadXMLFromFile(FileName:ShortString):Variant;
begin
if FileExists(FileName) then
      begin
        Result := CreateOleObject('Microsoft.XMLDOM');
        Result.load(FileName);
        if Result.parseError.reason <> '' then
           begin
                 ShowMessage('Error load XML:''admInf.~xml''.Error: '+Result.parseError.reason);
                 exit;
           end;
      end;    
end;

можно тут прочитать про это
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/b9f053cf-84cf-4a1c-9d7e-b3aabf9830a2.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/4ead2a13-de31-487e-b826-53f132f25cbb.asp


Dysan   (2006-08-03 16:33:00) [6]

нужно еще подключить XMLIntf


Dysan   (2006-08-03 16:32:00) [7]

а нету у IXMLDocument метода Free или Destroy !
как удалить по другому я не знаю, но кажеться когда то давнол спрашивал мне именно так и сказали его удалять!


Плохиш   (2006-08-03 15:53:00) [8]


> Dysan ©   (03.08.06 15:47) [2]
>
> var
> xml:IXMLDocument;
> begin
> xml:=TXMLDocument.Create(nil); - создал
> xml:=nil; - удалил

Да, что ты такое говоришь, обнилил ссылку, а объект остался. Объекты удаляются в делфи вызовом деструктора.


Kolan   (2006-08-03 15:52:00) [9]

И это
> http://magistral-rw.ru/pub/pic1.jpg

в новом проекте?

Хотел попробовать, но Undeclared identifier: 'IXMLDocument'XMLDoc подключил, что еще надо?


Dysan   (2006-08-03 15:47:00) [10]


var
xml:IXMLDocument;
begin
xml:=TXMLDocument.Create(nil); - создал
xml:=nil; - удалил

а решил я так потому что прикрутил альтернативный манагер памяти и он при запуске программы выдает такую мессагу
http://magistral-rw.ru/pub/pic1.jpg


Kolan   (2006-08-03 15:39:00) [11]

С XML я не работал, но сильно сомневаюсь что дело в нем... На пустом проекте проверял? И код дай как создаешь - удаляешь...


Наверх

Титульная страница Поиск, карта сайта Написать письмо