Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 Заголовок сообщения: |
|
|
Прикольно, я даже не пытался в этом разбираться, мне нужно чтобы все было сдвинуто чтобы структуру видеть. |
|
Вернуться к началу |
|
|
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.
Однако подозреваю, что вся суть в моем неправильном ипользовании ms xml parser. Вот и прошу, чтобы ткнули носом в мою ошибку. |
|
Вернуться к началу |
|
|
dAnIK SeNT
Зарегистрирован: 11.06.2004 Сообщения: 43 Откуда: Казань
|
Добавлено: Пт Авг 27 2004 09:08 Заголовок сообщения: |
|
|
Во-первых, у меня есть некоторое сомнение в строчке
По-моему, правильно будет сделать так:
Код: | Doc := CoDomDocument.Create; |
Во-вторых, я что-то не заметил, чтобы объект Doc уничтожался.
В конце функции, перед end'ос должно быть:
И вообще - следует внимательно смотреть, где у тебя создаются объекты, и не забывать их уничтожить, как только они перестают быть нужны. С другой стороны, надо также проверять, не используются ли объекты уже после их уничтожения. Возможно, это поможет избавиться от ошибки. _________________ Cисадмин - образ жизни. Программист - диагноз... |
|
Вернуться к началу |
|
|
Гость
|
Добавлено: Пт Авг 27 2004 14:30 Заголовок сообщения: |
|
|
dAnIK SeNT писал(а): | Во-вторых, я что-то не заметил, чтобы объект Doc уничтожался. В конце функции, перед end'ос должно быть:
|
Вся правда в том, что у переменной типа IXMLDOMDocument (IXMLDOMDocument2) нет метода Free.
dAnIK SeNT писал(а): | И вообще - следует внимательно смотреть, где у тебя создаются объекты, и не забывать их уничтожить, как только они перестают быть нужны. С другой стороны, надо также проверять, не используются ли объекты уже после их уничтожения. Возможно, это поможет избавиться от ошибки. |
Уничтожение объектов (метод Free) доступен через сокласс CoDOMDocument, а переменная CoDoc у меня (при пошаговом исполнении этой процедуры) inaccessible here due to optimization. Я читал статью на "Королевстве Delphi", в которой говорится, что достаточно (в нашем примере) сделать тогда произойдет уничтожение объекта Doc. Однако это не помогло.
Что же касается области видимости переменных-объектов, то все они у меня объявляются, создаются, используются (и должны уничтожаться) внутри одной (и только одной) процедуры. |
|
Вернуться к началу |
|
|
|