Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа со сгенерированными из Делфи файлами Экселя [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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо