WEB форумы на jedi
[Форум] [Помощь] [Поиск] [Выйти]
Добро пожаловать, [info]User

WEB форумы на jedi [ПОИСК] [Архив до 03.2006]

Тема Delphi vs Excel К предыдущему сообщению На следующее сообщение Программирование

Отправил Ondulyansion в 05:16 30.09.2003[Ответить]
Суть проблемы: создаю в делфи эксельэппликейшн
Excel := CreateOleObject('Excel.Application');
, работаю с ним минут 10, например. В это время на машине запускается эксель, какая-нить книга2, и Эксель свою книгу2 цепляет в моё эксельэппликейшн, соответственно по закрытию книги2 закрываются все мои книги. Я этого не хочу.
Единственным выходом стало:
Excel.Interactive := False;
Но тогда работать с книга2 и вообще с экселем в эти 10 минут невозможно. А вдруг пользователь захочет? Поиски решения в инете продолжаются, может тут кто подскажет?


Отправил Patrol в 10:47 30.09.2003[Ответить]
У меня таких проблем не было: я в одном екселе контроллировал, а другой подключался программой и вообще видим не был..
Физически таск менеджер показывал 2 процесса excel.exe
Дома погляжу исходники, если найду...


Отправил Ondulyansion в 13:23 30.09.2003[Ответить]
Сам-то я создаю новый процесс, то что до меня было запущено - фунциклирует. Но как этот процесс прихватизировать, чтобы никто не подключался к нему - непонятно.


Отправил Peps в 16:45 30.09.2003[Ответить]
а можно поинтересоваться для чего сие (имеется ввиду для чего пускать excel из delphi)? действительно интересно.


Отправил Patrol в 16:56 30.09.2003[Ответить]
Я в свое время использовал для того, чтобы складывать результаты работы программы :) Текстовый файл был неудобен, так как я цветами расцвечивал там чего-то :)
А еще использовал для другой программы потому, что исходные данные были присланы в екселе (и присылались еще и еще) ;)


Отправил Patrol в 20:25 30.09.2003[Ответить]
Да, действительно, я делал так:

MEl:= CreateOleObject('Excel.Application');
MEl.Workbooks.Open(OD.FileName);
MEl.Visible:=False;


И действительно, моя прога не трогала того, что было запущено до нее. После - не помню, а проверить не могу - давно уж дельфи не использую.
Есть подозрение, что при запуске Excel сначала пытается сделать GetActiveOleObject, и уж в случае неудачи - CreateOleObject. Это чтобы не засорять процессами систему. Видимо, твоя задача либо обеспечить неудачу при взятии твоего процесса (может события есть какие-нибудь, оповещающие об этом), либо изолировать его, либо сделать так, чтобы процесс не закрывался при закрытии другого окна :)

P.S. Можно попробовать в C#.. не думаю, что есть фундаментальные отличия :)


Отправил Nork в 13:45 13.08.2004[Ответить]
А может еще подскажете как его закрыть нормально а то он так и остается висеть и еще раз не запуститься:(


Отправил Kymarik в 13:53 14.08.2004[Ответить]
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.ExcelApplication1.Connect;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.ExcelApplication1.Quit;
end;

А на закладке Servers есть хорошая компонента ExcelApplication.
А еще на сайт королевство Делфи сходи ))))))


Отправил Nork в 14:09 16.08.2004[Ответить]
:) Ексель радосно остается висеть в списке процессов:)

а про Апликатион нигде ничего не написано

я в Билдере


Отправил vovan_petrov в 15:27 16.08.2004[Ответить]
Работаю с Exel'ом :
void __fastcall TForm7::BitBtn4Click(TObject *Sender)
{
ExcelApplication1->Connect();
ExcelApplication1->Visible[0] = false;
TVariantInParam p;
p =EmptyParam;
long lcid=LOCALE_USER_DEFAULT ;
ExcelApplication1->Workbooks->OpenText(
WideString(ExtractFilePath(Application->ExeName) + \adres_report.txt),
xlWindows, 1, xlDelimited, xlDoubleQuote, false,
false, false, true, false, false,
p, p, p, lcid);
ExcelWorksheet1->ConnectTo(ExcelApplication1->ActiveSheet);
ExcelWorksheet1->Cells->Select();
ExcelWorksheet1->Columns->AutoFit();
ExcelApplication1->Visible[0] = true;
}
При закрытии формы:
void __fastcall TForm7::FormClose(TObject *Sender, TCloseAction &Action)
{
ExcelWorksheet1->Disconnect();
ExcelApplication1->Quit();
ExcelApplication1->Disconnect();
}

Проблема в том, что когда я закрываю Exel и выхожу из своей программы,
Exel все равно остается в памяти!
После этого при повторном выполнении программы Exel уже не показывается целиком, от него показывается только менюшка с кнопками!

(C++ Builder 5, Office2000, WinXP Prof RUS)

Я в инете порыл, Exel может не выгружаться даже при вызове его из The Bat и Auto CAD 2002
Borland просто отдыхает:-)


Отправил Nork в 13:30 17.08.2004[Ответить]
эксперементально замечено что если вызвать Эксель сохранить файло закрыть эксель и дать ему секунд 5 отвисеться - он пропадает. Не делая при этом ExcelApplication1->Visible[0] = true;

потом можно открывать полученный файл ShellExecute - тогда работает повторная и многократная передача (работает 9 из 10 раз;)))

но все равно это не выход как мне кажется.



Отправил SergOpelъ в 18:59 18.08.2004[Ответить]
Гугл? %)

В догонку.
О закрытии Excel.
Чтобы он не остался висеть в 'Списке процессов' нужно не просто выполнить фукнцию Quit, но и присвоить переменной, указывающей на OLE-объект, значение Null.

FExcelApp.Quit;
FExcelApp := Null;
(с)
http://www.delphikingdom.ru/asp/articles_forum.asp?ArticleID=502


и так.
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=313
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=249
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=272

уж если это не поможет - придеться читать хелп и звонить в MS :)

Случайно наткнулся. Почитая там все, вдруг поможет.


Отправил Nork в 08:11 19.08.2004[Ответить]
СеряЖ ай умница дочка

стало работать 19 из 20:)