Лидеры рейтинга

ID: 226425

Konstantin Shvetski

Модератор

967

Россия, Северодвинск


ID: 165461

Лангваген Сергей Евгеньевич

Советник

689

Россия, Московская обл.


ID: 398750

Елена Васильевна

Специалист

402

Беларусь, Гомель


ID: 401284

Михаил Александров

Академик

270

Россия, Санкт-Петербург


ID: 400669

epimkin

Профессионал

186


ID: 401888

puporev

Профессор

163

Россия, Пермский край


ID: 137394

Megaloman

Мастер-Эксперт

146

Беларусь, Гомель


8.3.3

05.03.2021

JS: 2.4.4
CSS: 4.4.1
jQuery: 3.5.1


 

Создание программ на языках Pascal, Delphi и Lazarus.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)


Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 279
Gluck
Статус: 8-й класс
Рейтинг: 194
puporev
Статус: Профессор
Рейтинг: 163
 

Перейти к консультации №:
 

Консультация онлайн # 189368
Раздел: • Pascal / Delphi / Lazarus
Автор вопроса: solovejkl2 (Посетитель)
Дата: 14.05.2016, 22:36
Поступило ответов: 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;

Состояние: Консультация закрыта

Ответ # 273814 от Евгений/Genia007/ (Профессионал)

Здравствуйте, solovejkl2! Измените код

xml := TXMLDocument.Create(nil);
на
xml := TXMLDocument.Create(Application);
и всё будет работать.
Код (Pascal) :: выделить код
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;


Консультировал: Евгений/Genia007/ (Профессионал)
Дата отправки: 18.05.2016, 13:24

Рейтинг ответа:

+1

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 189368

Евгений/Genia007/

Профессионал

ID: 153662

1

= общий = |  15.05.2016, 08:07 |  цитировать |  профиль |  личное сообщение
solovejkl2:

Здравствуйте. У Вас программа рассчитана под определённый хмл файл?
Ошибка вылетает при исполнении строки

text := xml.DocumentElement.ChildNodes['info'].ChildNodes[2].ChildNodes[0].Text;
.

Последнее редактирование 15.05.2016, 08:16 Евгений/Genia007/ (Профессионал)

=====
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

solovejkl2

Посетитель

ID: 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;

solovejkl2

Посетитель

ID: 399482

3

= общий = |  15.05.2016, 23:20 |  цитировать |  профиль |  личное сообщение

Правда не знаю, правильно ли так делать и в нужном ли месте находится у меня

xml.free

Евгений/Genia007/

Профессионал

ID: 153662

4

= общий = |  16.05.2016, 08:50 |  цитировать |  профиль |  личное сообщение

Тогда код

xml.free
надо тоже перенести в тело цикла, иначе, думаю, будет утечка памяти. Можете скинуть свой хмл файл, поэкспериментировать.

=====
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.