Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Вниз

Ошибка 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.037 c
14-1089944676
StarCon
2004-07-16 06:24
2004.08.01
Дельфи 8


3-1089110896
alex-ran
2004-07-06 14:48
2004.08.01
Список пользователей БДЕ


14-1089386907
rOOse
2004-07-09 19:28
2004.08.01
HTML формы


1-1090323026
infom
2004-07-20 15:30
2004.08.01
Как вычислить текущий год обучения


14-1089620690
Stany
2004-07-12 12:24
2004.08.01
SysInternals Process Explorer (NT) Source Code





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский