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

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

Почему плодятся процессы EXCEL.EXE (D6, Excel 2000)


Страницы:   1 2

Ольга ©   (2004-12-10 18:07:00) 

Создаю объект:
Excel:= CreateOleObject('Excel.Application');
Excel.WorkBooks.Open(NameFileExl);
Excel.Visible:=True;

Закрываю приложение EXCEL стандартным способом, смотрю в "Диспетчере" - процесс остается висеть.

Сколько раз запускаю программу - столько процессов создается.
Как их не плодить? Или хотя бы как их программно убивать?


Ольга   (2004-12-13 10:21:00) [1]

Так и не удалось мне разгадать сию загадку.
Программа до Excel.Visible:=True (добавила еще Excel.UserControl:=True) как положено доходит. Пользователь, как положено xls-файл закрывает, нажимает кнопку "Выход" (Excel:=Unassigned) в дельфовской программе, а процесс ... остается.
Самое интересное, что повторить такое безобразие у меня самой не получилось. Выдернула из программы (она довольно навороченная) этот кусок - работает правильно.
Все, сдаюсь. Делаю переменную Excel локальной и ОК.
Всем спасибо!


GuAV   (2004-12-12 14:06:00) [2]

Ольга   (12.12.04 11:18) [21]

Ошибку у меня повторить не получилось. (D7, Office XP SP2) Завершение XL происходит в фиинализации Excel и Sheet.

Так, если выходить через ExitProcess, то процесс остаётся в памяти, но если добавить Excel:=Unassigned; Sheet:=Unassigned; то не остаётся.

Нужно искать или причину невыполнения финализации
Report; или место где затираются Excel и Sheet. В приведенном коде этого нет.

В коде есть другая ошибка.

> Try
>         Excel:= CreateOleObject('Excel.Application');
>         Excel.WorkBooks.Open('c:\tmp\1.xls');
>  except    
>         Excel.Quit;
>         Excel:=UnAssigned;
>   end;

Что Вы хотели добиться такой обработкой исключения ?
В случае исключения (например нет файла) оно будет обработано и следущий после этого код будет выполнен, хотя XL уже закрыт.


Суслик   (2004-12-12 13:28:00) [3]

я бы еще посветовал сделать Excel.UserControl := True; рядом с visible := true

Атрибут UserControl весьма загадочен. Его роль не совсем соответствует описанию. В частности _иногда_ если создать файл excel, сохранить и оставить открытым, то если из explor  открыть сохраненный файл, то оба окна ексель (и новое и то, где октрыт исходный файл) становятся невидимыми и снять их можно только через список задач. Данная особенность исправлялась только UserControl := True. Почему? Не знаю - из документации это не следует.


Piter   (2004-12-12 13:14:00) [4]

Нету никакого косяка, но после того как окошко Excel'а появилось:

Ольга   (12.12.04 11:18) [21]
Excel.Visible:=True;


какие проблемы? Это окошко нужно закрыть крестиком, чтобы не было процесса!

Или у тебя код просто не доходит до Excel.Visible:=True. Что такое отладчик знаем?


Ольга   (2004-12-12 11:18:00) [5]

По просьбе уважаемого GuAV Привожу листинги 2 модулей.

Unit Main Form:
unit Main;

interface
                             
uses  
Windows, Messages, SysUtils, Classes, Graphics, ontrols, Forms, Dialogs, Db, ADODB, Grids, DBGrids, StdCtrls, ExtCtrls, ComCtrls, Buttons, ToolWin, Menus, Variants, Excel2000;

type
 TFMain = class(TForm)
 SpeedButton1: TSpeedButton;
 SpeedButton2: TSpeedButton;
 ...

var
 FMain: TFMain;

implementation

uses Report;

procedure TFMain.SpeedButton2Click(Sender: TObject);
begin
 FormReport;
end;

procedure TFMain.SpeedButton1Click(Sender: TObject);
begin
  Close;
  Excel:=Unassigned;
end;

end.

Unit Report Form:

unit Report;

interface

uses   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  StdCtrls, ExtCtrls, Menus, Db, ADODB, Grids, DBGrids, ComCtrls, ComObj,  ActiveX, Excel2000, Variants, idGlobal;

var
 Excel, Sheet: Variant;
 procedure FormReport;
 
implementation

uses Main;

procedure FormReport;
begin
  DecodeDate(rabdate,y,m,d);
  Try
         Excel:= CreateOleObject('Excel.Application');
         Excel.WorkBooks.Open('c:\tmp\1.xls');
  except    
         Excel.Quit;
         Excel:=UnAssigned;
  end;
  Excel.DisplayAlerts:=False;
  Excel.SheetsInNewWorkBook:=1;
  Sheet:=Excel.ActiveWorkBook.WorkSheets[1];
  Sheet.Cells[4, 2]:= DateToStr(rabdate);
  ....
  Excel.Visible:=True;
end;

end.

Так где здесь косяк?


GuAV   (2004-12-11 14:48:00) [6]

Ольга   (11.12.04 13:42) [15]
Так и не поняла - почему я не могу очистить глобальную переменную, объявленную в связанном модуле, из главного?


Код "не-главного" модуля в студию. И заодно, что происходит при выходе из приложения.

Завершение процесса должно происходить в финализации модуля, где объявлен Excel, или на строке Excel := Unassigned;


Digitman   (2004-12-11 14:29:00) [7]


> Ольга


видишь ли, каждый модуль имеет раздел interface

если ты объявишь некий идентификатор в этом разделе, то все прочие модули будут "видеть" этот идентификатор и будут способны его использовать, если сошлются на него в uses одного из своих разделов

чаще говорят, что "идентификатор, объявленный в разделе interface некоего модуля, имеет глобальную область видимости для всех модулей данного проекта"


aus   (2004-12-11 14:19:00) [8]

Назови его как хочешь, он главнее не станет, они вполне равноправны.
Но это уже не по теме вопроса...


Ольга   (2004-12-11 14:02:00) [9]

Главным я назвала тот, к которому привязано приложение через Main Form


aus   (2004-12-11 13:59:00) [10]

>Так и не поняла - почему я не могу очистить глобальную переменную, объявленную в связанном модуле, из главного?

Глобальную переменную можно использовать в любом модуле (и "очистить" в том числе).
А как ты определяешь, какой модуль главный, а какой связанный?


Ольга   (2004-12-11 13:42:00) [11]

Пишет автор вопроса.
Да, переменная Excel у меня глобальная, но объявляется не в главном модуле, а в другом, связанным с главным по uses.
Excel:=UnAssigned прописано в главном на закрытие формы.
С вашей помощью нашла 2 выхода:
1. Перенести объявление Exсel: OleVariant; на главную форму.
2. Сделать Exсel локальной.

Оба работают, всем спасибо!

Но, чтобы расставить все точки над "и":
Так и не поняла - почему я не могу очистить глобальную переменную, объявленную в связанном модуле, из главного?

И еще. Советы типа Excel.Quit;
Зачем нужна эта команда (пользователь ведь сам должен определить, когда закрыть файл) и на какое событие ее назначать?


GuAV   (2004-12-10 21:43:00) [12]

GanibalLector ©   (10.12.04 21:26) [12]
З.Ы.Чудеса,однако...никогда б не подумал


И где чудеса ? Честно никогда не использовал глобальные XLи. Просто знаю что варианты как строки иницилизируются Unassigned и финализируются при выходе из области видимости.


GanibalLector   (2004-12-10 21:35:00) [13]

А если использовать глобально XLApp и в конец кода добавить XlApp:=Unassigned то тоже процесс умирает.
З.Ы.Вроде разобрались ;)


GanibalLector   (2004-12-10 21:26:00) [14]

Кстати,только что поигрался с глоб.\локальными переменными для такого кода.

XLApp:=CreateOleObject('Excel.Application');
XLApp.Visible:=true;
XLApp.WorkBooks.Open('C:\test.xls');
XLApp.WorkBooks[1].WorkSheets[1].Name:='test ;)';
XLApp.WorkBooks[1].Sheets[1].Cells[3,2]:='GanibalLector';

так вот,если XLApp локальная,то после закрытия Excel его процесс сразу уничтожается,а если глобальная,то висит до закрытия программы.
З.Ы.Чудеса,однако...никогда б не подумал


DiamondShark   (2004-12-10 21:19:00) [15]


> GanibalLector ©   (10.12.04 21:14) [10]

А самому в словарь заглянуть?

ссылка-- значение, уникально идентифицирующее объект или переменную во время выполнения;

Подробнее, извиняюсь, не могу: подробный ликбез денег стоит.


GanibalLector   (2004-12-10 21:14:00) [16]

2 DiamondShark

> Если эксель закрыть, когда в программе есть ссылка на
> него (или на любой вложенный объект), то да, процесс
>экселя остаётся.
> Но он завершается как только освободить все ссылки на
> него.

Что Вы имеете ввиду под словом "ссылка"?Подробнее плз.


DiamondShark   (2004-12-10 21:13:00) [17]


> Leonid Troyanovsky   (10.12.04 21:11) [7]

Неправда, что плодятся.
Не плодятся, а запускаются ровно столько, сколько нужно.
Вот.


GuAV   (2004-12-10 21:12:00) [18]

если Excel - глобальноная переменная то Excel := Unassigned; , если локальная, то не знаю даже чего так.


Leonid Troyanovsky   (2004-12-10 21:11:00) [19]


> DiamondShark ©   (10.12.04 20:44) [6]
> И как мне теперь с этим жить?


Как положено. Указать чья неправда,
чего словами просто так кидаться.

--
С уважением, LVT.


DiamondShark   (2004-12-10 20:44:00) [20]


> Leonid Troyanovsky   (10.12.04 20:13) [4]

И как мне теперь с этим жить?


Страницы:   1 2

Наверх

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