Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.01;
Скачать: CL | DM;

Вниз

Ошибка Excel при вызове из Делфи   Найти похожие ветки 

 
sapsi   (2004-07-15 08:46) [0]

Добрый день.
Делаю следующий отчет:
 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 08:52) [1]

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


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

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


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


//Проверка инсталляции СОМ объекта на машине
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;


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

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

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


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

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


 
Prohodil Mimo ©   (2004-07-15 09:51) [6]

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:58) [7]

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


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

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


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

А так?

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).


 
YurikGL ©   (2004-07-15 11:43) [10]


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


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



Страницы: 1 вся ветка

Текущий архив: 2004.08.01;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.057 c
14-1089822555
Мазут Береговой
2004-07-14 20:29
2004.08.01
Где можно скачать Metallica.


1-1089970612
DeMoN_Astra
2004-07-16 13:36
2004.08.01
Работа с меню


3-1089034813
Lizard
2004-07-05 17:40
2004.08.01
MySQL & Delphi7


1-1089925895
Fedor Sumkin
2004-07-16 01:11
2004.08.01
Работа с плагинами


1-1089721108
Роман
2004-07-13 16:18
2004.08.01
наследование форм