![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
чем можно заменить 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 я не работал, но сильно сомневаюсь что дело в нем... На пустом проекте проверял? И код дай как создаешь - удаляешь...