Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизПочему плодятся процессы 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.038 c