| Предыдущая тема :: Следующая тема | 
	
	
		| Автор | Сообщение | 
	
		| 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. Однако это не помогло.
 Что же касается области видимости переменных-объектов, то все они у меня объявляются, создаются, используются (и должны уничтожаться) внутри одной (и только одной) процедуры.
 |  | 
	
		| Вернуться к началу |  | 
	
		|  | 
	
		|  |