Главная страница
    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.03 c
9-1082214981
Iks
2004-04-17 19:16
2004.08.01
Помогите плз !!!Как натянув текстуру на плоскость сделать


14-1089833539
Opilki_Inside
2004-07-14 23:32
2004.08.01
Могут ли студенты работать полный рабочий день?


1-1089881596
Yakudza
2004-07-15 12:53
2004.08.01
TWebBrowser


4-1087810017
Subdigger
2004-06-21 13:26
2004.08.01
CreateProcess


14-1089625819
АлексейК
2004-07-12 13:50
2004.08.01
Прислали недавно программку...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский