Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2015, 22:26   #1
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
Вопрос повторное использование компонента

добрый день,
использую в программе объект TXMLDocument для создания xml:
Код:
procedure TForm2.BitBtn3Click(Sender: TObject);
var  xml: TXMLDocument;
    i, j: integer;
    today : TDateTime;
begin
    xml:=XMLDocument1.Create(nil);
    xml.Active:=True;
      // создаем
      with Xml do
        begin
          // создаем корневой узел
          with AddChild ('Body') do
            begin
              // создаем дочерний узел
              with AddChild ('info') do
                begin
                today := Now;
...................................................................
              end;
            end;  // with

        end;  // with: создаем
 
      // записываем
        xml.SaveToFile (name_test+'.xml');

end;
при однократном вызове этой процедуры все работает на ура. Но, если после первого создания файла, попытаться создать еще один, то получаю exception - Project Project1.exe raised exception class EOleException with message 'Only one top level element is allowed in an XML document'. Верно ли я понимаю, что при повторном вызове почему то используется предыдущий объект xml? Пробовал добавить
Код:
xml.Destroy;
xml:=Nil;
в конец процедуры, но тогда получаю ошибку 'Acces violation at address ...'.
Буду очень благодарен совету
marwell. вне форума Ответить с цитированием
Старый 12.04.2015, 22:32   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

XMLDocument1.Create это что? TXMLDocument.Create
И xml.Free в конце обязательно, а то утечки будут
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.04.2015, 08:25   #3
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
XMLDocument1.Create это что? TXMLDocument.Create
И xml.Free в конце обязательно, а то утечки будут
Спасибо большое! повторное создание теперь работает!

А при считывании из готового xml такой же метод не подходит?
Код:
procedure TForm2.FormShow(Sender: TObject);
var xml: TXMLDocument;
    nodelist: IXMLNodeList;
    c: integer;
begin
  xml:=TXMLDocument.Create(nil);
  xml.LoadFromFile(mydir+'\'+loadxml);
  xml.Active:=True;
  nodelist:=xml.DocumentElement.ChildNodes; //здесь получаю ошибку 'Invald pointer operation'
  name_test:=nodelist[0].ChildNodes.Nodes[0].Text;
  c:=nodelist[1].ChildNodes.Count;
..........................................
  xml.Free;
end;
marwell. вне форума Ответить с цитированием
Старый 13.04.2015, 09:35   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Код:
nodelist:=xml.DocumentElement.ChildNodes;
Есть ли они, ноды? Попробуйте сначала определить количество детей, прежде чем получать их все.
Чему равно loadxml? Путь который Вы собираете корректен?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 13.04.2015 в 09:38.
Utkin вне форума Ответить с цитированием
Старый 13.04.2015, 10:33   #5
lexaltd
Форумчанин
 
Регистрация: 21.07.2008
Сообщений: 192
По умолчанию

Цитата:
Сообщение от marwell. Посмотреть сообщение
Спасибо большое! повторное создание теперь работает!

А при считывании из готового xml такой же метод не подходит?
Код:
procedure TForm2.FormShow(Sender: TObject);
var xml: TXMLDocument;
    nodelist: IXMLNodeList;
    c: integer;
begin
  xml:=TXMLDocument.Create(nil);
  xml.LoadFromFile(mydir+'\'+loadxml);
  xml.Active:=True;
  nodelist:=xml.DocumentElement.ChildNodes; //здесь получаю ошибку 'Invald pointer operation'
  name_test:=nodelist[0].ChildNodes.Nodes[0].Text;
  c:=nodelist[1].ChildNodes.Count;
..........................................
  xml.Free;
end;
Ошибка скорей всего возникает тут
Код:
xml.Free;
Если да то тут написано почему, и как
http://www.cyberforum.ru/delphi-begi...ead857173.html
lexaltd вне форума Ответить с цитированием
Старый 13.04.2015, 12:14   #6
marwell.
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 63
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Код:
nodelist:=xml.DocumentElement.ChildNodes;
Есть ли они, ноды? Попробуйте сначала определить количество детей, прежде чем получать их все.
Чему равно loadxml? Путь который Вы собираете корректен?
путь к фалу корректен.
вот пример файла:
Код:
<Body>
   <info>
      <Name>rt</Name>
      <Date>13.04.2015</Date>
      <Quest_Count>2</Quest_Count>
   </info>
   <questions>
      <q0>rt</q0>
      <q1>tr</q1>
   </questions>
   <answers>
      <a0>
         <ans0>rt</ans0>
         <ans1>rt</ans1>
         <ans2>rt</ans2>
      </a0>
      <a1>
         <ans0>7</ans0>
         <ans1>77</ans1>
         <ans2>777</ans2>
      </a1>
   </answers>
</Body>
с
Код:
showmessage(IntToStr(xml.ChildNodes.Count));
получаю количество=1(хотя должно быть 3?) и 'No active document' на
Код:
nodelist:=xml.DocumentElement.ChildNodes;

Последний раз редактировалось marwell.; 13.04.2015 в 12:15. Причина: добавил про путь к файлу
marwell. вне форума Ответить с цитированием
Старый 13.04.2015, 13:02   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Мне кажется один это само тело body (могу ошибаться). Попробуйте добавить стандартный заголовок, типа
Цитата:
<?xml version="1.0" encoding="WINDOWS-1251"?>
и какой-нибудь комментарий.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Повторное использование формы kogtishka Общие вопросы Delphi 1 16.04.2012 19:57
Повторное использование структуры Karmadon Общие вопросы C/C++ 2 29.02.2012 12:00
Использование компонента idUdpClient без компонента TForm. Riply Компоненты Delphi 2 18.02.2011 21:21
Использование компонента TreeView girz БД в Delphi 8 01.06.2009 10:28
Использование внешнего компонента Gray[cLmT] Общие вопросы Delphi 1 16.04.2008 10:18