Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.10.31;
Скачать: [xml.tar.bz2];

Вниз

TXMLDocument   Найти похожие ветки 

 
Stenfit   (2010-08-06 15:21) [0]

В консольном приложении вызывается процедура проверки содержимого xml-фала находящегося в zip-файле. Для доступа использую компоненты ZIPForge + delphi"йский XML парсер.


procedure chk_pack(file_name: string);
 var
   All, I: Integer;
   src_pack, xml_src: TStream;
   xml_obj: TXMLDocument;
   zip_obj: TZIPForge;
 begin
   src_pack := TFileStream.Create(file_name, fmOpenRead or fmShareDenyNone);
   try
     zip_obj := TZIPForge.Create(nil);
     try
       zip_obj.OpenArchive(src_pack, False);
       try
         xml_src := TMemoryStream.Create;
         try
           zip_obj.ExtractToStream("info.xml", xml_src);
           xml_src.Position := 0;
           xml_obj := TXMLDocument.Create(nil);
           try
             xml_obj.LoadFromStream(xml_src);
             with xml_obj.DocumentElement do // <- ОШИБКА
               if SameText(NodeName, "update") then
               begin
                 { ... }
               end
               else { ... } ;
           finally
             xml_obj.Free;
           end;
         finally
           xml_src.Free;
         end;
       finally
         zip_obj.CloseArchive;
       end;
     finally
       zip_obj.Free;
     end;
   finally
     src_pack.Free;
   end;
 end;


Вручную создаю и удаляю объект TXMLDocument с AOwner = nil. В этом и проблема. При обращении к свойству DocumentElement вызывается вылетает AccessViolation. Если же AOwner = Self - все OK отрабатывает. В чем проблема?


 
Юрий Зотов ©   (2010-08-06 15:30) [1]

When TXMLDocument is created without an Owner , it behaves like an interfaced object. That is, when all references to its interface are released, the TXMLDocument instance is automatically freed. When TXMLDocument is created with an Owner , however, it behaves like any other component, and is freed by its Owner .


 
Stenfit   (2010-08-06 15:36) [2]

И что теперь делать? Функция будет вызываться единожды и не зависеть от других функции консольного приложения.  Как передать Owner?

Вот так будет работать..., но это маразм брать одну функцию в класс.


TMyClass = class(TComponent)
   public
     function IsOKPack(const file_name: string): Boolean;
   end;


 
Юрий Зотов ©   (2010-08-06 15:51) [3]

Достаточно изменить объявление переменной:
xml_obj: IXMLDocument;
и убрать вызов
xml_obj.Free


 
Stenfit   (2010-08-06 15:53) [4]

спасибо. тему можно закрывать.


 
Медвежонок Пятачок ©   (2010-08-06 16:30) [5]

достаточно никогда не вызывать фри если создал с оунером=нил



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

Форум: "Начинающим";
Текущий архив: 2010.10.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.003 c
4-1240980041
ForumReader
2009-04-29 08:40
2010.10.31
Как получить список всех "дочек" элемента, если они одинаковы?


15-1279743038
KilkennyCat
2010-07-22 00:10
2010.10.31
В году этак 1998-ом я проходил курсы сварщика оптоволокна.


2-1280927589
mylasthit
2010-08-04 17:13
2010.10.31
Подмогите с выбором компонента...


15-1279906954
Ламо777
2010-07-23 21:42
2010.10.31
Хоть я и не моряк, но тронуло


15-1280014034
Иксик
2010-07-25 03:27
2010.10.31
Контекстная реклама или совпадение???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский