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

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

Excell как OLE Object


harisma ©   (2012-11-12 17:21:00) 

Работаю с Excell как с OLE Object. Создаю его так:

var
 ex, wb, ws, sb: oleVariant;
begin
   Ex := CreateOleObject('Excel.Application');
   SB := Ex.DisplayStatusBar;
   Ex.Interactive := False;
   Ex.ScreenUpdating := False;
   Ex.DisplayStatusBar := False;
   WB := Ex.Workbooks.Add(-4167);                
   WS := WB.WorkSheets[1];                        
........

Далее идет заполнение сетки листа данными, включая форматирование, формулы, данные и т. д.
То есть, в цикле бегается по исходным данным, также оформленным в виде сетки, и заполняется страница книги в Excell.
Сам процесс сбрасывания данных отображается на прогрессбаре в программе.
Приложение Excell запущено в фоновом режиме. Когда все данные сброшены, только тогда делаем Excell видимым пользователю.
Вот финальная часть кода:

   Ex.Visible := True; // Только теперь делаем приложение видимым
   Ex.Interactive := True;
   Ex.ScreenUpdating := True;
   Ex.DisplayStatusBar := SB;

И все бы тут хорошо, но на форме с прогресссбаром есть кнопка "Прервать". При нажатии на нее сброс данных в книгу Excell прекращается, но само приложение так и остается запущеным в фоновом режиме (это видно в диспетчере задач).
Поэтому вопрос: как программно "убить" именно этот процесс Excell, если была нажата кнопка "Прервать", причем чтобы случайно не был "убит" чужой процесс.


harisma   (2012-11-12 18:32:00) [1]

Нашел решение :)!!!
Надо перед Ex.Quit еще выставить Ex.DisplayAlerts := False. Тогда все классно закрывается.


Anatoly Podgoretsky   (2012-11-12 18:27:00) [2]

> harisma  (12.11.2012 18:06:02)  [2]

Ну так использую не Ole, а COM объект


harisma   (2012-11-12 18:06:00) [3]


> if Нажата_кнопка_прервать then
> begin
>  Ex.Quit;
>  Ex := null;
> end;

Так уже пробовал - не срабатывает :( Все равно остается в памяти процесс.
А если написать 2 раза quit (как советуют на одном из форумов), тогда ругается что так делать нельзя :(


Ega23   (2012-11-12 17:49:00) [4]

if Нажата_кнопка_прервать then
begin
 Ex.Quit;
 Ex := null;
end;


Наверх

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