IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Delphi & Msoffice
сообщение
Сообщение #1


Гость






Срочно нужна ваша помощь:
Запускаю шаблон Exсel из программы, набиваю данные, сохраняю документ,закрываю Excel. Все вроде нормально, но пока не закрою свою прогу, Excel
висит в процессах, а след-но нет возможности просмотреть созданные документы. Не всегда помогает и выход из моей программы.
Как корректно проверить наличия Excel в процессах и завершить его?
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 17)
сообщение
Сообщение #2


Гость






Попробуй следующее:

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


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

должно помочь.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Код
var ExcelApp : Variant;
begin
 try
   // Ищем запущеный экземпляр Excel
   // если он не найден, вызывается исключение
   ExcelApp := GetActiveOleObject('Excel.Application');
 except
 end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Может как-то по-другому его открывать? С помощью 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 не ругается, но процесс не завершается, пока я не закрою свое приложение.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Попробуй перед закрытием - отсоединить Excel:
Код
try
 App := GetActiveOleObject('Excel.Application');
 App.Disconnect;
 App.Quit;
except
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






На вставку Disconnect'a дельфя выругалась:

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

А нельзя ли воспользоваться компонентами со страницы Servers? Может так будет корректнее? Правда, я эти компоненты никогда еще не использовал.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Adminь
****

Группа: Пользователи
Сообщений: 803
Пол: Мужской
Реальное имя: Евгений

Репутация: -  5  +


Код
App := null;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






mj :no:
Код
App := nil;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






К моему большому сожалению:
на App:=null эта гадость тоже не реагирует,
а на App:=nil выдает несоответствие типов.
Но все равно всем спасибо за помощь.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Пионер
**

Группа: Пользователи
Сообщений: 53
Пол: Мужской

Репутация: -  0  +


Я тут решил зарегистрироваться ;)
Если будут еще варианты решения по вопросу с Excel пришлите, пожалуйста на мыло удалено администратором, т.к. по-долгу сидеть в Nete я не могу.

Сообщение отредактировано: mj -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Adminь
****

Группа: Пользователи
Сообщений: 803
Пол: Мужской
Реальное имя: Евгений

Репутация: -  5  +


Цитата(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 адреса для таких целей запрещено, если хотите, можете просто подписаться на обновление своей темы...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Пионер
**

Группа: Пользователи
Сообщений: 53
Пол: Мужской

Репутация: -  0  +


Спасибо Adminь за напоминание (честно говоря не знал).
А код попробую. Я на самом деле делаю много Exel-документов в цикле, правда переменную присваиваю только один раз, но может быть в этом все и дело. О результатах сообщу.
Спасибо. smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Пионер
**

Группа: Пользователи
Сообщений: 53
Пол: Мужской

Репутация: -  0  +


Попробовал вставить 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.

Код в теги...

Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






Я тут подумал, а что если проблема в том, что я запускаю 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;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Adminь
****

Группа: Пользователи
Сообщений: 803
Пол: Мужской
Реальное имя: Евгений

Репутация: -  5  +


Цитата(YurKaluga @ 25.03.05 12:21)
Попробовал вставить Quit  в цикл, где создаются документы - не помогает.
Excel все равно висит в процессах. Где я не то делаю?
Вот укороченный код:

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

Код в теги...

Ну судя по этому коду при выходе из функции у тя будет как минимум 2-3 ссылки на объекты экзеля...
Для начала перенеси все переменные из глобальных в процедуру...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Пионер
**

Группа: Пользователи
Сообщений: 53
Пол: Мужской

Репутация: -  0  +


А, если я так не могу сделать? У меня в другой процедуре определяется, какой MSOffice установлен (т.е. пользователь сам выбирает, а впроцедуре определяется его выбор).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Пионер
**

Группа: Пользователи
Сообщений: 53
Пол: Мужской

Репутация: -  0  +


А вообще-то, с локальными переменными вроде работает! Только как теперь быть с выбором версии Office, может передавать в процедуру как параметр? Что-то я не могу сообразить, в этом случае процедуры будут ссылаться на один и тот же объект или все равно на разные?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Пионер
**

Группа: Пользователи
Сообщений: 53
Пол: Мужской

Репутация: -  0  +


:D
Огромное СПАСИБО всем, кто помогал!
Особенно гуру MJ-adminь :molitva:
Все заработало!!!
Действительно, с локальными переменными Excel уходит из процессов после завершения процедуры. Ссылку на мой App типа variant можно передавать в другую процедуру и все работает.
УРА! локальным переменным. :D
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 10.06.2024 13:07
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name