Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка Excel при вызове из Делфи [D5, Win2k]


sapsi ©   (2004-07-15 08:46:00) 

Добрый день.
Делаю следующий отчет:
 xlApp:=CreateOleObject('Excel.Application');
 xlbook:=XLApp.Workbooks.Add(xlWbatWorkSheet);
 xlsheet:=xlbook.sheets[1];
 xlsheet.name:='Статистика';
 xlsheet.pagesetup.Orientation:=xlLandscape;

Дальше идет заполнение ячеек таблицы, форматирование их и т.п.

Затем
 XLApp.Visible:=true;
 XLApp:=null;
Здесь все нормально, но после закрытия (вручную) Excel или
отчета возникает следующая ошибка:

"EXCEL.EXE - Ошибка приложения".
Инструкция по адресу "0x650161fe" обратилась к памяти по адресу "0x650161fe". Память не может быть "read".

Раньше таких проблем не было.
Что может быть не так?
Спасибо.


YurikGL   (2004-07-15 11:43:00) [1]


> Раньше в данном юните у меня уже было формирование отчета
> в Excel - все работало. Когда добавил по аналогии формирование
> отчета несколько другого типа и на другое событие, появилась
> вышеописанная проблема. Причем как после закрытия отчета
> первого типа так и второго. Все переменные xlapp,xlsheet1,xlsheet,xlbook
> и т.п. - глобальные.


Может дело в том, что xlapp ты обнуляешь, с xlsheet нет? Поставь на событие onQuit (если не ошибаюсь) обnullение всех xlsheet-в и xlbook-в.


Itsme   (2004-07-15 10:30:00) [2]

А так?

procedure TFAnM.ReleaseExcel;
begin
if Assigned(IXLSApp) then begin
  if (IXLSApp.Workbooks.Count>0) and (not IXLSApp.Visible[0]) then begin
     IXLSApp.WindowState[0]:=TOLEEnum(xlMinimized);
     IXLSApp.Visible[0]:=true;
     if not (csDestroying in ComponentState) then Self.SetFocus;
     Application.BringToFront;
     end;
  end;
  FreeAndNil(FIXLSApp);
end;

У меня работает без проблем. Это и еще много интересного взято из статьи Евгения Старостина "По волнам интерграции" (найдено в DelphiKingdom).


Edward   (2004-07-15 10:16:00) [3]

Лучше всего переменные сделать локальными, тогда не надо заботиться об их чистке вида XLApp:=Unassigned;
А поскольку они у тебя глобальные, нужно быть точно уверенным в каждый момент времени а правильно ли они указываю на объекты, и вообще того они вида.


sapsi   (2004-07-15 09:58:00) [4]

Раньше в данном юните у меня уже было формирование отчета в Excel - все работало. Когда добавил по аналогии формирование отчета несколько другого типа и на другое событие, появилась вышеописанная проблема. Причем как после закрытия отчета первого типа так и второго. Все переменные xlapp,xlsheet1,xlsheet,xlbook и т.п. - глобальные.
Работа с Excel в другом юните другой формы осталось нормальным.


Prohodil Mimo   (2004-07-15 09:51:00) [5]

Zamechal podobnoje na Win2000, izredka na WinXP, no ne kazhdij raz i ne na kazhdoj mashine. Reshil, chto vozmozhno ne vsjo ili ne tak ustanovil/nastroil sistemu.


sapsi   (2004-07-15 09:49:00) [6]

XLApp.Quit, как понимаю, закроет Excel. Не дав просмотреть отчета


Думкин   (2004-07-15 09:43:00) [7]

Перед
XLApp:=Unassigned;
поставь
XLApp.Quit

Затем неплохо бы проверять не запущено ли еще экземпляров и т.п.


Edward   (2004-07-15 09:42:00) [8]


//Проверка инсталляции СОМ объекта на машине
function IsOLEObjectInstalled(ProgID: String): Boolean;
var ClassID: TCLSID;
begin
 Result := Succeeded( CLSIDFromProgID( PWideChar( WideString( ProgID)), ClassID));
end;
//Вызов Excel
procedure RunExcel(ReportNumber: Integer; Action: Integer = xlShowFile);
var ExcelApp, WorkBook, Sheet: OleVariant;
   OldCursor: TCursor;
   FileXLS: string;
begin
 OldCursor := Screen.Cursor;
 Screen.Cursor := crHourGlass;
 try
   //Установлен ли Excel?
   if not IsOLEObjectInstalled( ProgID) then
     begin
       Application.MessageBox(PChar('MS Excel не установлен!'),
                              PChar(Application.Title),
                              MB_OK + MB_ICONSTOP);
       Exit;
     end;
   try
     //Создание нового экземпляра Excel
     ExcelApp := CreateOleObject( ProgID);
     //Отключаем реакцию Excel на события, чтобы ускорить вывод информации
     ExcelApp.Application.EnableEvents := False;
     //Создать книгу по шаблону
     FileXLS := _IniParams.REPORTS_FOLDER + '\' + ИмяФайлаШаблона;
     //Если файл шаблона существует
     if FileExists( FileXLS) then
       WorkBook := ExcelApp.Workbooks.Add( FileXLS)
     else
       begin
         Application.MessageBox(PChar('Файл шаблона [' + FileXLS + '] не найден!'),
                                PChar(Application.Title),
                                MB_OK + MB_ICONSTOP);
         //Просто добавляем книгу из шаблона по умолчанию
         WorkBook := ExcelApp.Workbooks.Add;
       end;
     //Вывод отчета

     //Здесь делаем заполнение отчета

     //Включаем реакцию Excel на события
     ExcelApp.Application.EnableEvents := True;
     //Делаем его видимым
     if not VarIsEmpty(ExcelApp) then
       begin
         ExcelApp.Visible := True;
         if ExcelApp.WindowState = TOLEEnum(xlMinimized) then
           ExcelApp.WindowState := TOLEEnum(xlNormal);
         ExcelApp.ScreenUpdating := True;
       end;
   except
      //Ошибка!!!
      On E: Exception do begin
        Application.MessageBox(PChar(E.Message),
                               PChar(Application.Title),
                               MB_OK + MB_ICONERROR);
        if not VarIsNull(ExcelApp) then begin
          //Не сохраняем книгу без выдачи запроса подтверждения сохранения
          WorkBook.Close(False);
          //Завершаем работу Excel
          ExcelApp.Application.Quit;
        end;
      end;
   end;
 finally
   Screen.Cursor := OldCursor;
 end;
end;


sapsi   (2004-07-15 09:20:00) [9]

Спасибо. К сожалению, не помогло.


YurikGL   (2004-07-15 08:52:00) [10]

Пользовал
XLApp:=Unassigned;
Проблем не было.


Наверх

Титульная страница Поиск, карта сайта Написать письмо