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

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

Позднее связываение Excel и OLE контейнер [D7, Win2k, WinXP]


П7 ©   (2004-09-24 14:14:00) 

Уважаемые Мастера! У меня возникла проблема в "запихивании" Ёкселя в OLE контейнер. Для работы с Ёкселем я использую позднее связывание (так надо, хотя скорость падает), но никакх не могу указать ему, что открываться нужно не в новом окне, как он делает при создании нового Worksheet'а или открытии документа, а в моём OLE контейнере. У TExcelApplication имеется такой метод, как ConnectTo:

ExcelApp.ConnectTo( (OLEContExcel.OleObjectInterface as ExcelWorkbook).Application );

но это - ранее связывание, а мне нужно позднее. Такого метода у создаваемого поздним связыванием ExcelApplication просто нет. Как быть?


П7   (2004-09-24 16:45:00) [1]


> KSergey ©   (24.09.04 16:18) [7]

Не, теряться не нужно. У меня не получается показать созданный поздним связыванием ExcelApplication в OLE-контейнере. Вот и всё. Если я обычнм образом его создаю, то вместо того, чтобы появиться в ОЛЕ-контейнере, он открывает отдельное окно Excel'я и работает с ним. Оно и понятно, ведь на OLE-контейнер ничего не указывает.


> > Excel.Run;
>
> Это че такое???

Это я малость не то написал.
OLEContExcel.Run;
Вот... (:

Экземпляр запускается так:

 OLEContExcel.CreateObjectFromFile( PathDir+'\regpro\shablon.xls', False );
OLEContExcel.Run;

Или я что-то путаю?

В процессе извращений обнаружилась странная вещь. Если при созщдании, поздним связыванием, ExcelApplication'а поставить ему Visible в FALSE, то это Ёксель Аппликейшен начинает работать с уже открытым и показанным в OLE-контейнере экземпляром. Пока пользуюсь этим, но мне кажется, что это как-то не правильно...


Polevi   (2004-09-24 16:28:00) [2]

для листа вот так

procedure TForm1.FormCreate(Sender: TObject);
begin
 OleContainer1.CreateObject('Excel.Sheet',false);
 OleContainer1.AutoActivate := aaManual;
 OleContainer1.DoVerb(ovShow);
end;


KSergey   (2004-09-24 16:18:00) [3]


> Excel.Run;

Это че такое???

GetActiveOleObject подключается к уже запущенному экземпляру; если его нет - понятно ошибка; стандартный ход на это

 try
   FWordApp := GetActiveOleObject ('Word.Application');
 except
   FWordApp := CreateOLEObject ('Word.Application');
 end;


А вообще-то, я что-то потерялся: что получить-то надо?


Erik1   (2004-09-24 16:00:00) [4]

Неиспользовать Excel, может хватит возможностей OCX компонента из поставки Delphi?


П7   (2004-09-24 15:05:00) [5]


> clickmaker ©   (24.09.04 14:40) [3]

Открыл, посмотрел, ничего там такого интересного нету. Он передаёт полученный Application параметром в ConnectEvents. Этого метода так же нет. Ничего не понимаю... ):


> KSergey ©   (24.09.04 14:54) [4]

GetActiveOleObject возвращает ошибку, мол "не найден указанный источник объекта". Делаю так, может не правильно?

 // бал-бал из предыдущего листинга
 Excel.Run; // после этой строчки пишу
 // тут возникает описанная ошибка
 ExcelApp := GetActiveOleObject( 'Excel.Application' );


Блин!!! ): Чёж теперь делать-то? ):


KSergey   (2004-09-24 14:54:00) [6]

На сколько я понимаю, ExcelApp.ConnectTo есть эквивалент GetActiveOleObject, либо (в случае отсутствия запущенного экземпляра) - CreateOleObject


clickmaker   (2004-09-24 14:40:00) [7]


> [2] П7   (24.09.04 14:33)

Открой delphi\ocx\servers\excel97.pas да посмотри реализацию этого connectto. Может, натолкнет на какие мысли


П7   (2004-09-24 14:33:00) [8]

Дык не знаю, куда он делся. Может быть при создании TExcelApplication этот метод специально дописали, чтобы расширить его возможности. Не знаю, в общем... Так как проблему-то решить? Вот кусок кода...


 ExcelApp := CreateOleObject('Excel.Application');
 ExcelApp.DisplayAlerts := false;
 OLEContExcel.CreateObjectFromFile( PathDir+'\regpro\shablon.xls', False );
 OLEContExcel.Run;


Далее при раннем связывании идёт:

ExcelApp.ConnectTo( (OLEContExcel.OleObjectInterface as ExcelWorkbook).Application );

И всё работает, но при позднем связывании на этапе выполнения (оно и понятно) происходит ошибка:

Class EOleError with messages 'Method 'ConnectTo' not supported by... бла-бла'

ВотЪ! ):


clickmaker   (2004-09-24 14:16:00) [9]


> Такого метода у создаваемого поздним связыванием ExcelApplication
> просто нет

Куда делся? Количество методов - это же программный код, он не зависит от способа подключения клиента к серверу


Наверх

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