![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему плодятся процессы EXCEL.EXE (D6, Excel 2000)
Ольга © (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]
И как мне теперь с этим жить?