Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1102951597
AlexLine
2004-12-13 18:26
2004.12.26
Проблема с формой (мелькает панель зачач)


14-1102018582
syte_ser78
2004-12-02 23:16
2004.12.26
Активация WinXP


14-1102414857
Kerk
2004-12-07 13:20
2004.12.26
Защита от копирования


1-1102528136
Руслана
2004-12-08 20:48
2004.12.26
Перестала запускаться Delphi7


1-1102614641
Dmitry_04
2004-12-09 20:50
2004.12.26
Изменение атрибутов файла...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский