Помощь - Поиск - Пользователи - Календарь
Полная версия: Delphi & Msoffice
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
yur
Срочно нужна ваша помощь:
Запускаю шаблон Exсel из программы, набиваю данные, сохраняю документ,закрываю Excel. Все вроде нормально, но пока не закрою свою прогу, Excel
висит в процессах, а след-но нет возможности просмотреть созданные документы. Не всегда помогает и выход из моей программы.
Как корректно проверить наличия Excel в процессах и завершить его?
NX
Попробуй следующее:

Код
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
     ExcelApp.quit;
end;


где ExcelApp : Variant, твоего Excelя...

должно помочь.
volvo
Код
var ExcelApp : Variant;
begin
 try
   // Ищем запущеный экземпляр Excel
   // если он не найден, вызывается исключение
   ExcelApp := GetActiveOleObject('Excel.Application');
 except
 end;
yur
Может как-то по-другому его открывать? С помощью GetActiveOleObject все равно не завершается. Я запускаю так:

Код
 App:=CreateOleObject('Excel.Application');
 App.WorkBooks.Add({Path}+'Filename.xlt');
 App_work:=App.WorkBooks[1].WorkSheets[1];

 App_work.Cells[2,5].Value:=.......................;
 ...
 ...
 ...
 App_work.Cells[2,5].Value:=.......................;

 App.ActiveWorkBook.Close(True,File_name);
   try
      App := GetActiveOleObject('Excel.Application');
      App.Quit;
    except
    end;


Процесс вроде бы определяется (возвращает значение), на Quit не ругается, но процесс не завершается, пока я не закрою свое приложение.
volvo
Попробуй перед закрытием - отсоединить Excel:
Код
try
 App := GetActiveOleObject('Excel.Application');
 App.Disconnect;
 App.Quit;
except
end;
Guest
На вставку Disconnect'a дельфя выругалась:

Project raised exception class EOleError with message 'Method 'Disconnect' not supported by automation object'.

А нельзя ли воспользоваться компонентами со страницы Servers? Может так будет корректнее? Правда, я эти компоненты никогда еще не использовал.
mj
Код
App := null;
volvo
mj :no:
Код
App := nil;
yur
К моему большому сожалению:
на App:=null эта гадость тоже не реагирует,
а на App:=nil выдает несоответствие типов.
Но все равно всем спасибо за помощь.
YurKaluga
Я тут решил зарегистрироваться ;)
Если будут еще варианты решения по вопросу с Excel пришлите, пожалуйста на мыло удалено администратором, т.к. по-долгу сидеть в Nete я не могу.
mj
Цитата(yur @ 24.03.05 10:36)
К моему большому сожалению:
  на  App:=null эта гадость тоже не реагирует,
  а на  App:=nil выдает несоответствие типов.
Но все равно всем спасибо за помощь.

Нужно присвоить null всем переменным, в которых ты когда либо держал объекты экзеля...
Дело в том что приложение будет закрыто тока когда количество ссылок на его объекты будет равным 0...

Код
procedure TForm1.Button1Click(Sender: TObject);
var
 V: Variant;
begin
 V := CreateOleObject('Excel.Application');
 V.Visible := True;
 V.Quit;
end;

При нажатии кнопки приложение загружаеться и выгружаеться...

Напомню что публиковать e-mail адреса для таких целей запрещено, если хотите, можете просто подписаться на обновление своей темы...
YurKaluga
Спасибо Adminь за напоминание (честно говоря не знал).
А код попробую. Я на самом деле делаю много Exel-документов в цикле, правда переменную присваиваю только один раз, но может быть в этом все и дело. О результатах сообщу.
Спасибо. smile.gif
YurKaluga
Попробовал вставить Quit в цикл, где создаются документы - не помогает.
Excel все равно висит в процессах. Где я не то делаю?
Вот укороченный код:

Код
procedure TPrintDoc.PrintW(Sender: TObject);
var i: integer;
   File_name: string;
begin
 App:=CreateOleObject('Excel.Application');
 For i:=1 to 10 do begin
   App.WorkBooks.Add('Shablon.xlt');
   App_work:=App.WorkBooks[1].WorkSheets[1];
   App_work.Cells[1,1].Value:=. . .;

   . . .
   . . .
   . . .

   App_work.Cells[20,1].Value:=. . .;    
   File_name:='Doc.xls';
   App.ActiveWorkBook.Close(True,File_name);
   App.Quit;
 end;
   try
      App := GetActiveOleObject('Excel.Application');
      App.Quit;
    except
    end;
end;


В конце Quit оставил для пущей уверенности. Может бах в самой Delphi?
Пишу на Delphi 7 Enterprise.

Код в теги...
Guest
Я тут подумал, а что если проблема в том, что я запускаю Excel из дочернего MDI окна, может в материнском прописать процедуру закрытия процесса? Если есть возможность, поверьте кто-нибудь, мне просто слишком много придется переписывать, а времени мало.
Или может я не те или не все нужные модули подключаю? Вот это те, которые я использую в этой форме:
Код

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls, Buttons, ExtCtrls, Grids, IniFiles, jpeg, DateUtils,
 OleServer, CmAdmCtl, OleCtrls, Chartfx3, ComObj, ActiveX,
 DB, DBTables, Math;
mj
Цитата(YurKaluga @ 25.03.05 12:21)
Попробовал вставить Quit  в цикл, где создаются документы - не помогает.
Excel все равно висит в процессах. Где я не то делаю?
Вот укороченный код:

В конце Quit оставил для пущей уверенности. Может бах в самой Delphi?
Пишу на Delphi 7 Enterprise.

Код в теги...

Ну судя по этому коду при выходе из функции у тя будет как минимум 2-3 ссылки на объекты экзеля...
Для начала перенеси все переменные из глобальных в процедуру...
YurKaluga
А, если я так не могу сделать? У меня в другой процедуре определяется, какой MSOffice установлен (т.е. пользователь сам выбирает, а впроцедуре определяется его выбор).
YurKaluga
А вообще-то, с локальными переменными вроде работает! Только как теперь быть с выбором версии Office, может передавать в процедуру как параметр? Что-то я не могу сообразить, в этом случае процедуры будут ссылаться на один и тот же объект или все равно на разные?
YurKaluga
:D
Огромное СПАСИБО всем, кто помогал!
Особенно гуру MJ-adminь :molitva:
Все заработало!!!
Действительно, с локальными переменными Excel уходит из процессов после завершения процедуры. Ссылку на мой App типа variant можно передавать в другую процедуру и все работает.
УРА! локальным переменным. :D
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.