![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
yur |
![]()
Сообщение
#1
|
Гость ![]() |
Срочно нужна ваша помощь:
Запускаю шаблон Exсel из программы, набиваю данные, сохраняю документ,закрываю Excel. Все вроде нормально, но пока не закрою свою прогу, Excel висит в процессах, а след-но нет возможности просмотреть созданные документы. Не всегда помогает и выход из моей программы. Как корректно проверить наличия Excel в процессах и завершить его? |
NX |
![]()
Сообщение
#2
|
Гость ![]() |
Попробуй следующее:
Код procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin ExcelApp.quit; end; где ExcelApp : Variant, твоего Excelя... должно помочь. |
volvo |
![]()
Сообщение
#3
|
Гость ![]() |
Код var ExcelApp : Variant; begin try // Ищем запущеный экземпляр Excel // если он не найден, вызывается исключение ExcelApp := GetActiveOleObject('Excel.Application'); except end; |
yur |
![]()
Сообщение
#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 не ругается, но процесс не завершается, пока я не закрою свое приложение. |
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Попробуй перед закрытием - отсоединить Excel:
Код try App := GetActiveOleObject('Excel.Application'); App.Disconnect; App.Quit; except end; |
Guest |
![]()
Сообщение
#6
|
Гость ![]() |
На вставку Disconnect'a дельфя выругалась:
Project raised exception class EOleError with message 'Method 'Disconnect' not supported by automation object'. А нельзя ли воспользоваться компонентами со страницы Servers? Может так будет корректнее? Правда, я эти компоненты никогда еще не использовал. |
mj |
![]()
Сообщение
#7
|
![]() Adminь ![]() ![]() ![]() ![]() Группа: Администраторы Сообщений: 803 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Код App := null; |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
mj :no:
Код App := nil; |
yur |
![]()
Сообщение
#9
|
Гость ![]() |
К моему большому сожалению:
на App:=null эта гадость тоже не реагирует, а на App:=nil выдает несоответствие типов. Но все равно всем спасибо за помощь. |
YurKaluga |
![]()
Сообщение
#10
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 53 Пол: Мужской Репутация: ![]() ![]() ![]() |
Я тут решил зарегистрироваться ;)
Если будут еще варианты решения по вопросу с Excel пришлите, пожалуйста на мыло удалено администратором, т.к. по-долгу сидеть в Nete я не могу. Сообщение отредактировано: mj - 24.03.2005 16:34 |
mj |
![]() ![]()
Сообщение
#11
|
![]() Adminь ![]() ![]() ![]() ![]() Группа: Администраторы Сообщений: 803 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Цитата(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 |
![]()
Сообщение
#12
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 53 Пол: Мужской Репутация: ![]() ![]() ![]() |
Спасибо Adminь за напоминание (честно говоря не знал).
А код попробую. Я на самом деле делаю много Exel-документов в цикле, правда переменную присваиваю только один раз, но может быть в этом все и дело. О результатах сообщу. Спасибо. ![]() |
YurKaluga |
![]()
Сообщение
#13
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 53 Пол: Мужской Репутация: ![]() ![]() ![]() |
Попробовал вставить 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 - 25.03.2005 10:46 |
Guest |
![]()
Сообщение
#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; |
mj |
![]()
Сообщение
#15
|
![]() Adminь ![]() ![]() ![]() ![]() Группа: Администраторы Сообщений: 803 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Цитата(YurKaluga @ 25.03.05 12:21) Попробовал вставить Quit в цикл, где создаются документы - не помогает. Excel все равно висит в процессах. Где я не то делаю? Вот укороченный код: В конце Quit оставил для пущей уверенности. Может бах в самой Delphi? Пишу на Delphi 7 Enterprise. Код в теги... Ну судя по этому коду при выходе из функции у тя будет как минимум 2-3 ссылки на объекты экзеля... Для начала перенеси все переменные из глобальных в процедуру... |
YurKaluga |
![]()
Сообщение
#16
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 53 Пол: Мужской Репутация: ![]() ![]() ![]() |
А, если я так не могу сделать? У меня в другой процедуре определяется, какой MSOffice установлен (т.е. пользователь сам выбирает, а впроцедуре определяется его выбор).
|
YurKaluga |
![]()
Сообщение
#17
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 53 Пол: Мужской Репутация: ![]() ![]() ![]() |
А вообще-то, с локальными переменными вроде работает! Только как теперь быть с выбором версии Office, может передавать в процедуру как параметр? Что-то я не могу сообразить, в этом случае процедуры будут ссылаться на один и тот же объект или все равно на разные?
|
YurKaluga |
![]()
Сообщение
#18
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 53 Пол: Мужской Репутация: ![]() ![]() ![]() |
:D
Огромное СПАСИБО всем, кто помогал! Особенно гуру MJ-adminь :molitva: Все заработало!!! Действительно, с локальными переменными Excel уходит из процессов после завершения процедуры. Ссылку на мой App типа variant можно передавать в другую процедуру и все работает. УРА! локальным переменным. :D |
![]() ![]() |
![]() |
Текстовая версия | 27.07.2025 22:08 |