Форум: "Основная";
Текущий архив: 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.035 c