Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Непонятки

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
leshek
Гость





СообщениеДобавлено: Вт Авг 24 2004 09:55    Заголовок сообщения: Непонятки Ответить с цитатой

Не могу понять, почему при исполнении ниже приведенного кода в конце вылетает Access Violation:
procedure TForm1.Button1Click(Sender: TObject);
var CoDoc: CoDomDocument;
Doc: IXMLDOMDocument;
n1,n2,n3,n4,r: IXMLDOMElement;
txt: IXMLDOMText;
attr,shed: IXMLDomAttribute;
i: Integer;
begin
DataSet.Prepare;
DataSet.Open;
Doc:=CoDoc.Create;
Doc.async:=False;
Doc.loadXML('<Header/>');
if not DataSet.IsEmpty then begin
r:=Doc.documentElement;
n1:=Doc.createElement('Sender');
txt:=Doc.createTextNode('0');
n1.appendChild(txt);
r.appendChild(n1);
n1:=Doc.createElement('Dest');
txt:=Doc.createTextNode(ToUnicode(IntToStr(pFIBDataSet1.FBN('DEPID').AsInteger)));
n1.appendChild(txt);
r.appendChild(n1);
while not DataSet.Eof do begin
n1:=Doc.createElement('CARD');
n1.selectSingleNode('CARD');
attr:=Doc.createAttribute('ID');
attr.value:=ToUnicode(IntToStr(DataSet.FBN('CARDID').AsInteger));
n1.setAttributeNode(attr);
n2:=Doc.createElement('MARK');
txt:=Doc.createTextNode(ToUnicode(DateToStr(DataSet.FBN('MARKA').AsDateTime)));
n2.appendChild(txt);
n1.appendChild(n2);
n2:=Doc.createElement('DEPART');
txt:=Doc.createTextNode(ToUnicode(IntToStr(DataSet.FBN('DEP').AsInteger)));
n2.appendChild(txt);
n1.appendChild(n2);
// ...
//Текст сокращен. В этом месте обходим Master-таблицу
// ...

n2.appendChild(txt);
n1.appendChild(n2);
if not JobsDataSet.Active then begin
JobsDataSet.Prepare;
JobsDataSet.Open;
end;
JobsDataSet.First;
n2:=Doc.createElement('JOBLIST');
while not JobsDataSet.Eof do begin
n3:=Doc.createElement('JOB');
n3.selectSingleNode('JOB');
shed:=Doc.createAttribute('JID');
shed.value:=ToUnicode(IntToStr(JobsDataSet.FBN('JID').AsInteger));
n3.setAttributeNode(shed);

// ...
// Текст сокращен в этом месте обходим Detail-таблицу
//...

n4.appendChild(txt);
n3.appendChild(n4);
n2.appendChild(n3);
JobsDataSet.Next;
n1.appendChild(n2);
r.appendChild(n1);
end;
DataSet.Next;
end;
end;
Doc.save('d:\1\ezport2.xml');
end; //<--И вот здесь вылетает Access Violation. Хотя xml-файл формируется нормально.

Где я напутал?

PS Используется Delphi7, FIBPlus 5.3, msxml parser 4 SP2
Вернуться к началу
GeX



Зарегистрирован: 03.01.2004
Сообщения: 60
Откуда: Россия, Иркутск

СообщениеДобавлено: Вт Авг 24 2004 10:26    Заголовок сообщения: Ответить с цитатой

Прикольно, я даже не пытался в этом разбираться, мне нужно чтобы все было сдвинуто чтобы структуру видеть.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
FUKS



Зарегистрирован: 14.04.2002
Сообщения: 148
Откуда: Москва

СообщениеДобавлено: Вт Авг 24 2004 12:45    Заголовок сообщения: Re: Непонятки Ответить с цитатой

leshek писал(а):
end; //<--И вот здесь вылетает Access Violation

Наводит на мысли о неосвобождённой памяти. Сам на MSVC с подобным столкнулся, хотя ошибку так и не нашёл. Под 95 при выходе из программы выскакивала ошибка, под 2000 уже нет.
А ещё под DOS пару раз встречалась такая фигня, что Си криво располагают переменные, отчего они пересекаются в памяти и запись в одну переменную портит другую (массив). Проинициализировали эту переменную при объявлении, она разместилась в другой области данных, глюк нейтрализовался.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Гость






СообщениеДобавлено: Чт Авг 26 2004 15:08    Заголовок сообщения: Re: Непонятки Ответить с цитатой

2leshek
Выложи отформатированный текст, а?
А то даже разбираться лениво...
Вернуться к началу
Гость






СообщениеДобавлено: Чт Авг 26 2004 17:33    Заголовок сообщения: Re: Непонятки Ответить с цитатой

Anonymous писал(а):
2leshek
Выложи отформатированный текст, а?
А то даже разбираться лениво...


Еще раз, отформатированный...

Код:
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
  CoDoc: CoDomDocument;
  Doc: IXMLDOMDocument;
  n1,n2,n3,n4,r: IXMLDOMElement;
  txt: IXMLDOMText;
  attr,shed: IXMLDomAttribute;
begin
  DataSet.Prepare;
  DataSet.Open;
  Doc:=CoDoc.Create;
  Doc.async:=False;
  Doc.loadXML('<Header/>');
  if not DataSet.IsEmpty then begin
    r:=Doc.documentElement;
    n1:=Doc.createElement('Sender');
    txt:=Doc.createTextNode('0');
    n1.appendChild(txt);
    r.appendChild(n1);
    n1:=Doc.createElement('Dest');
    txt:=Doc.createTextNode(ToUnicode(IntToStr(pFIBDataSet1.FBN('DEPID').AsInteger)));
    n1.appendChild(txt);
    r.appendChild(n1);
   while not DataSet.Eof do begin
      n1:=Doc.createElement('CARD');
      n1.selectSingleNode('CARD');
      attr:=Doc.createAttribute('ID');
      attr.value:=ToUnicode(IntToStr(DataSet.FBN('CARDID').AsInteger));
      n1.setAttributeNode(attr);
      n2:=Doc.createElement('MARK');
      txt:=Doc.createTextNode(ToUnicode(DateToStr(DataSet.FBN('MARKA').AsDateTime)));
      n2.appendChild(txt);
      n1.appendChild(n2);
      n2:=Doc.createElement('DEPART');
      txt:=Doc.createTextNode(ToUnicode(IntToStr(DataSet.FBN('DEP').AsInteger)));
      n2.appendChild(txt);
      n1.appendChild(n2);
//
// Текст сокращен. Здесь обходим Master-таблицу
//
      if not JobsDataSet.Active then begin
        JobsDataSet.Prepare;
        JobsDataSet.Open;
      end;
      JobsDataSet.First;
      n2:=Doc.createElement('JOBLIST');
      while not JobsDataSet.Eof do begin
        n3:=Doc.createElement('JOB');
        n3.selectSingleNode('JOB');
        shed:=Doc.createAttribute('JID');
        shed.value:=ToUnicode(IntToStr(JobsDataSet.FBN('JID').AsInteger));
        n3.setAttributeNode(shed);
        n4:=Doc.createElement('JNAME');
        txt:=Doc.createTextNode(ToUnicode(JobsDataSet.FBN('JNAME').AsString));
        n4.appendChild(txt);
        n3.appendChild(n4);
        n4:=Doc.createElement('FDAT');
        txt:=Doc.createTextNode(ToUnicode(DateToStr(JobsDataSet.FBN('FDAT').AsDateTime)));
//
// Текст сокращен. Здесь обходим Detail-таблицу
//
        n4.appendChild(txt);
        n3.appendChild(n4);
        n2.appendChild(n3);
        JobsDataSet.Next;
        n1.appendChild(n2);
        r.appendChild(n1);
      end;
      DataSet.Next;
  end;
  end;
  Doc.save('d:\1\ezport2.xml');
end;<--И вот здесь (после окончания процедуры) вылет с Access Violation


Я также пробовал адаптировать пример, взятый с Borland'овского CodeCentral - все равно Access Violation. Sad
Однако подозреваю, что вся суть в моем неправильном ипользовании ms xml parser. Вот и прошу, чтобы ткнули носом в мою ошибку.
Вернуться к началу
dAnIK SeNT



Зарегистрирован: 11.06.2004
Сообщения: 43
Откуда: Казань

СообщениеДобавлено: Пт Авг 27 2004 09:08    Заголовок сообщения: Ответить с цитатой

Во-первых, у меня есть некоторое сомнение в строчке
Код:
Doc:=CoDoc.Create;

По-моему, правильно будет сделать так:
Код:
Doc := CoDomDocument.Create;


Во-вторых, я что-то не заметил, чтобы объект Doc уничтожался.
В конце функции, перед end'ос должно быть:
Код:
Doc.Free;


И вообще - следует внимательно смотреть, где у тебя создаются объекты, и не забывать их уничтожить, как только они перестают быть нужны. С другой стороны, надо также проверять, не используются ли объекты уже после их уничтожения. Возможно, это поможет избавиться от ошибки.
_________________
Cисадмин - образ жизни. Программист - диагноз...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Гость






СообщениеДобавлено: Пт Авг 27 2004 14:30    Заголовок сообщения: Ответить с цитатой

dAnIK SeNT писал(а):
Во-вторых, я что-то не заметил, чтобы объект Doc уничтожался. В конце функции, перед end'ос должно быть:
Код:
Doc.Free;

Вся правда в том, что у переменной типа IXMLDOMDocument (IXMLDOMDocument2) нет метода Free.

dAnIK SeNT писал(а):
И вообще - следует внимательно смотреть, где у тебя создаются объекты, и не забывать их уничтожить, как только они перестают быть нужны. С другой стороны, надо также проверять, не используются ли объекты уже после их уничтожения. Возможно, это поможет избавиться от ошибки.

Уничтожение объектов (метод Free) доступен через сокласс CoDOMDocument, а переменная CoDoc у меня (при пошаговом исполнении этой процедуры) inaccessible here due to optimization. Я читал статью на "Королевстве Delphi", в которой говорится, что достаточно (в нашем примере) сделать
Код:
Doc:=nil
тогда произойдет уничтожение объекта Doc. Однако это не помогло.
Что же касается области видимости переменных-объектов, то все они у меня объявляются, создаются, используются (и должны уничтожаться) внутри одной (и только одной) процедуры.
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...