![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа со сгенерированными из Делфи файлами Экселя [Delphi, Windows]
Karlson © (2004-06-10 09:56:00)Добрый день! Возникла следующая проблема.
Из Делфи генерю файлы Экселя, при чем программно сохраняю их - программа сама определяет имена.
После завершения операции и работы с объектом Экселя (MsExcel.Quit) (создаю объект: MsExcel:=CreateOleObject('Excel.Application')), пытаюсь открыть сгенерированные файлы,но открывается лишь остов Экселя, а сам файл - нет. При чем в процессах висит Эксель.
А после завершения работы моего проекта или если вручную киллануть процесс Экселя, работа с файлами нормальная.
Karlson (2004-06-12 12:48:00) [1]> Topol
вот это действительно помогло!!!! спасибо!!!!
Topol (2004-06-12 11:55:00) [2]У меня была похожая проблема. Нужно освобождать все объекты кторый связаны с екселем
try
objExcel := CreateOLEObject('Excel.Application');
objExcel.Workbooks.Open(FileName);
objActiveSheet := objExcel.ActiveSheet;
objExcel.Visible:=True;
finally
objActiveSheet:=Unassigned;
objExcel:=Unassigned;
end;
Если писать просто
objExcel:=Unassigned;
ексель остается в процессах
нужно освободить и лист
objActiveSheet:=Unassigned;
Karlson (2004-06-11 22:33:00) [3]to art-east
в том-то и дело, что больше привязки к экселю в программе нет, а процесс висит себе...
YurikGl (2004-06-10 20:23:00) [4]Может чем поможет.
Работаю через ExcelApplication. Наблюдаю такую картину, если сказать quit и не сказать disconnect.
Даже если попытаться выйти из Excel из него самого а не средствами delphi, все равно процесс висит, пока не сказать disconnect.
art-east (2004-06-10 15:50:00) [5]не надо говорить об этом юзеру, надо сделать обработчик события ExcelApplication.OnWindowActivate в котором ScreenUpdating выставлять в true
или же всё-таки освободить ексель, раз он висит в процессах, значит у тебя на него есть ещё ссылки в программе кроме MsExcel, им всемнадо присвоить Unassigned
Karlson (2004-06-10 14:11:00) [6]В ПЕРВОМ СЛУЧАЕ - ЭКСЕЛЬ В ПРОЦЕССАХ ВИСИТ, А ВО ВТОРОМ - СУПЕР! В РЕЖИМЕ ВО ВЕСЬ ЭКРАН И потом в нормальном - все стало хорошо!!!
но как сказать об этом юзеру, что когда он откроет документ нужно сделать такие манипуляции?
Karlson (2004-06-10 14:11:00) [7]В ПЕРВОМ СЛУЧАЕ - ЭКСЕЛЬ В ПРОЦЕССАХ ВИСИТ, А ВО ВТОРОМ - СУПЕР! В РЕЖИМЕ ВО ВЕСЬ ЭКРАН И потом в нормальном - все стало хорошо!!!
но как сказать об этом юзеру, что когда он откроет документ нужно сделать такие манипуляции?
art-east (2004-06-10 13:38:00) [8]остов Экселя, а сам файл - нет, попробуй перейти в экселе в полноэкранный режим(меню вид) и обратно или в редакторе VBA(Alt+F11) в ImmediateWindow(Ctrl+G) набери Application.ScreenUpdating=True и нажми Enter
после этого файл видимым становится?
art-east (2004-06-10 13:33:00) [9]после
MsExcel.Quit;
MsExcel := Unassigned;
в процессах эксель есть?
в тот момент когда открыть
Karlson (2004-06-10 13:26:00) [10]я делаю так:
MsExcel.Visible:=true;
MsExcel.ScreenUpdating:=true;
MsExcel.DisplayAlerts := true;
MsExcel.Quit;
MsExcel := Unassigned;
то есть я визиблю через прогу - файлы сгенерированные появляются, я их закрываю руцями - по крестику, а потом открыть их уже через винду не могу....
art-east (2004-06-10 12:54:00) [11]всё, теперь кажись догнал
я так понимаю созданные файлы ты открываешь не в своей проге, а даблкликом например, тогда это точно ScreenUpdating
тут такая хитрость, пока у тебя Excel в инвизибле(то бишь в списке процессов он есть, а ни одного окна не видно) ему нельзя выставить это свойство. Следовательно либо ты должен освободить Excel(чтобы его не было в процессах, ибо по ассоциации файла используется уже существующий экземпляр) либо выставлять ScreenUpdating послеперехода экселя в визибл(появления окна), например навеситься на его событие OnWindowActivate
Karlson (2004-06-10 11:54:00) [12]to art-east
> что именно не прошло? вариант Clickmaker работает если ты хочешь убить старый экземпляр
не прошло - таже песня осталась - остов запускается без тела файла...
пусть хоть и убить - только бы с файлом можно было работать при работе моей проге в одном сеансе
> в текущем экземпляре, убивать его при этом не надо и новый создавать тоже (вместо CreateOleObject GetActiveOleObject)
я новый не создаю, я создаю объект один раз, генерю несколько файлов, показываю их, юзер их сам закрывает и все... работать с ними в момент запущенной проги он не может...
art-east (2004-06-10 11:48:00) [13]очепятка вышла, следует читать убивать его при этом ненадо
art-east (2004-06-10 11:46:00) [14]что именно не прошло? вариант Clickmaker работает если ты хочешь убить старый экземпляр
> процессах висит Эксель
и создать новый, а мой вариант чтобы отображать файл
> открывается лишь остов Экселя, а сам файл - нет
в текущемэкземпляре, убивать его при этом надо и новый создавать тоже (вместо CreateOleObject GetActiveOleObject)
Karlson (2004-06-10 11:36:00) [15]> art-east
тоже не идет.... :(
Karlson (2004-06-10 11:33:00) [16]> Clickmaker ©
не прошло...
art-east (2004-06-10 11:06:00) [17]ExcelApplication.ScreenUpdating:=true
Clickmaker (2004-06-10 11:03:00) [18]MsExcel.Quit
MsExcel := Unassigned;