Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.26;
Скачать: CL | DM;

Вниз

Почему плодятся процессы EXCEL.EXE (D6, Excel 2000)   Найти похожие ветки 

 
Ольга   (2004-12-10 18:07) [0]

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

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

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


 
Суслик ©   (2004-12-10 18:13) [1]

excel.quit?


 
VMcL ©   (2004-12-10 18:19) [2]

>>Ольга  (10.12.04 18:07)

Если под стандартным способом понимается нажатие на крестике, то см. [1] + Excel := Unassigned;


 
DiamondShark ©   (2004-12-10 18:27) [3]

Неправда.

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

Остаться "висеть" он может только в одном случае: если приложение завершено некорректно и ссылки не были правильно освобождены.


 
Leonid Troyanovsky   (2004-12-10 20:13) [4]

> DiamondShark ©   (10.12.04 18:27) [3]
> Неправда.

Чья неправда?
Твои доводы не противоречат ни одному из
3 вышеидущих утверждений.

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


 
GanibalLector ©   (2004-12-10 20:40) [5]


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

Я тоже смотрю...пусто ;)


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


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

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


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


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


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

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


 
GuAV ©   (2004-12-10 21:12) [8]

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


 
DiamondShark ©   (2004-12-10 21:13) [9]


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

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


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

2 DiamondShark

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

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


 
DiamondShark ©   (2004-12-10 21:19) [11]


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

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

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

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


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

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

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 его процесс сразу уничтожается,а если глобальная,то висит до закрытия программы.
З.Ы.Чудеса,однако...никогда б не подумал


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

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


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

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


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


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

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

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

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

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


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

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

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


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

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


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

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


 
Digitman ©   (2004-12-11 14:29) [19]


> Ольга


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

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

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


 
GuAV ©   (2004-12-11 14:48) [20]

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


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

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


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

По просьбе уважаемого 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.

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


 
Piter ©   (2004-12-12 13:14) [22]

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

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


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

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


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

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

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


 
GuAV ©   (2004-12-12 14:06) [24]

Ольга   (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-13 10:21) [25]

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



Страницы: 1 вся ветка

Текущий архив: 2004.12.26;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.032 c
3-1101708072
VAV
2004-11-29 09:01
2004.12.26
Проблема добавления записи в таблицу


14-1102154522
SteelMan
2004-12-04 13:02
2004.12.26
куда катится интернет?!


1-1102974763
Kolan
2004-12-14 00:52
2004.12.26
Как измерить скорость алгоритма.Знаю что было но не нашел.


3-1101467614
WellSlava
2004-11-26 14:13
2004.12.26
установка формата даты


1-1102751874
Dema-X
2004-12-11 10:57
2004.12.26
ошибка еакцессволюшион LoadFromStream