Консультация № 189368
14.05.2016, 22:36
0.00 руб.
0 5 1
Здравствуйте! Прошу помощи в следующем вопросе:

Подскажите что в коде не правильно.
По задумке должен грузить в цикле данные из XML файлов в Excel. Грузит только первую строчку, а дальше вываливает Access violation.

Код:

procedure TForm1.LoadXmlBtnClick(Sender: TObject);
var
searchresult : TSearchRec;
i : SmallInt;
text: string;
xml: TXMLDocument;
XL: Variant;
begin
XL := CreateOLEObject('Excel.Application');
XL.WorkBooks.Open(ExtractFilePath(Application.ExeName)+ 'book.xlsx');
XL.visible := true;
i := 0;
xml := TXMLDocument.Create(nil);
if FindFirst(ExtractFilePath(Application.ExeName) +'\111\'+ '*.xml',faAnyFile,searchresult)=0
then
begin
repeat
XL.WorkBooks[1].WorkSheets[1].Cells[i+4,2].Value:= searchresult.Name;
try
xml.Active := True;
xml.LoadFromFile(ExtractFilePath(Application.ExeName) +'\111\'+ searchresult.Name);
text := xml.DocumentElement.ChildNodes['info'].ChildNodes[2].ChildNodes[0].Text;
XL.WorkBooks[1].WorkSheets[1].Cells[i+4,4].Value:=text;

except
XL.WorkBooks[1].WorkSheets[1].Cells[i+4,4].Value:='неизвестно';
end;
xml.Active := False;
xml := nil;
i:=i+1;
until
FindNext(searchresult) <> 0;
FindClose(searchresult);

xml.Free;
end;
end;

Обсуждение

давно
Профессионал
153662
1070
15.05.2016, 08:07
общий
15.05.2016, 08:16
Адресаты:
Здравствуйте. У Вас программа рассчитана под определённый хмл файл?
Ошибка вылетает при исполнении строки
Код:
text := xml.DocumentElement.ChildNodes['info'].ChildNodes[2].ChildNodes[0].Text;
.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Посетитель
399482
2
15.05.2016, 23:17
общий
Добрый вечер. Да программа рассчитана под определенный xml. С xml проблем нет все загружается, но только один раз. Экспериментируя с кодом добился работы программы путем переноса
Код:
xml := TXMLDocument.Create(nil);
в цикл repeat. Вот рабочий вариант:
Код:

begin
repeat
XL.WorkBooks[1].WorkSheets[1].Cells[i+4,2].Value:= searchresult.Name;
try
xml := TXMLDocument.Create(nil);
xml.LoadFromFile(ExtractFilePath(Application.ExeName) +'\111\'+ searchresult.Name);
text := xml.DocumentElement.ChildNodes['info'].ChildNodes[2].ChildNodes[0].Text;
XL.WorkBooks[1].WorkSheets[1].Cells[i+4,4].Value:=text;
xml := nil;
except
XL.WorkBooks[1].WorkSheets[1].Cells[i+4,4].Value:='неизвестно';
end;


i:=i+1;
until
FindNext(searchresult) <> 0;
FindClose(searchresult);

xml.Free;
end;
давно
Посетитель
399482
2
15.05.2016, 23:20
общий
Правда не знаю, правильно ли так делать и в нужном ли месте находится у меня
Код:
xml.free
давно
Профессионал
153662
1070
16.05.2016, 08:50
общий
Тогда код
Код:
xml.free
надо тоже перенести в тело цикла, иначе, думаю, будет утечка памяти. Можете скинуть свой хмл файл, поэкспериментировать.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Профессионал
153662
1070
18.05.2016, 13:24
общий
это ответ
Здравствуйте, solovejkl2! Измените код
Код:
xml := TXMLDocument.Create(nil);
на
Код:
xml := TXMLDocument.Create(Application);
и всё будет работать.
[code lang=pascal h=250]procedure TForm1.LoadXmlBtnClick(Sender: TObject);
var
searchresult : TSearchRec;
i : SmallInt;
text: string;
xml: TXMLDocument;
XL: Variant;
begin
XL := CreateOLEObject('Excel.Application');
XL.WorkBooks.Open(ExtractFilePath(Application.ExeName)+ 'book.xls');
XL.visible := true;
i := 0;
xml := TXMLDocument.Create(Application);
if FindFirst(ExtractFilePath(Application.ExeName) +'\111\'+ '*.xml',faAnyFile,searchresult)=0
then
begin
repeat
XL.WorkBooks[1].WorkSheets[1].Cells[i+4,2].Value:= searchresult.Name;
try
xml.LoadFromFile(ExtractFilePath(Application.ExeName) +'\111\'+ searchresult.Name);
text := xml.DocumentElement.ChildNodes['info'].ChildNodes[2].ChildNodes[0].Text;
XL.WorkBooks[1].WorkSheets[1].Cells[i+4,4].Value:=text;
xml := nil;
except
XL.WorkBooks[1].WorkSheets[1].Cells[i+4,4].Value:='неизвестно';
end;
i:=i+1;
until
FindNext(searchresult) <> 0;
FindClose(searchresult);
xml.Free;
end;
end;[/code]
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Форма ответа